《見縫插圓》顧名思義,就是在我們繪制的C語言窗口里面畫隨機圓,圓與圓之間不能相交或相切,那就要自己找“縫隙”咯!
今天用C語言制一些漂亮的隨機圖案,如圖所示,隨機生成的圓互不相交且盡量填滿畫布,按空格鍵可以切換不同的繪制模式:
首先利用數組實現多個圓的生成和繪制,并使得圓和圓之間不相交;然后學習函數的概念,并應用函數改進代碼,添加了新圓半徑最大化的功能;最后利用函數封裝了多種繪制模式,并通過鍵盤按鍵進行互動。
源碼示例:
// 求解兩個點之間的距離
float Dist2Points(float x1,float y1,float x2,float y2)
{
float result;
result = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
return result;
}
// 判斷兩個圓是否相交
int isTwoCirclesIntersect(float x1,float y1,float r1,float x2,float y2,float r2)
{
if (Dist2Points(x1,y1,x2,y2)
return 1;
return 0;
}
// 填充黃色圓繪制
void DrawCircles1(float x,float y,float r)
{
setlinecolor(RGB(0,0,0));
setfillcolor(RGB(255,255,0));
fillcircle(x,y,r);
}
// 填充隨機顏色圓繪制
void DrawCircles2(float x,float y,float r)
{
float h = rand()%360;
COLORREF color = HSVtoRGB(h,0.6,0.8);
setlinecolor(RGB(255,255,255));
setfillcolor(color);
fillcircle(x,y,r);
}
// 填充隨機顏色同心圓繪制
void DrawCircles3(float x,float y,float r)
{
while (r>0)
{
float h = rand()%360;
COLORREF color = HSVtoRGB(h,0.6,0.8);
setlinecolor(RGB(255,255,255));
setfillcolor(color);
fillcircle(x,y,r);
r=r-5;
}
}
// 隨機顏色同心圓線條繪制
void DrawCircles4(float x,float y,float r)
{
while (r>0)
{
float h = rand()%360;
COLORREF color = HSVtoRGB(h,0.9,0.8);
setlinecolor(color);
circle(x,y,r);
r=r-5;
}
}
int main() // 主函數
{
int width = 600; // 窗口寬度
int height = 600; // 窗口高度
initgraph(width,height); // 新開一個窗口
setbkcolor(RGB(255,255,255)); // 背景顏色為白色
cleardevice(); // 以背景顏色清空背景
srand(time(0)); // 隨機種子函數
int xArray[1000]; // 數組存儲所有圓心的x坐標
int yArray[1000]; // 數組存儲所有圓心的y坐標
int rArray[1000]; // 數組存儲所有圓的半徑
int rmin = 8; // 圓的最小半徑
int rmax = 50; // 圓的最大半徑
int circleNum = 0; // 生成的圓的個數
float x,y,r; // 新增圓的圓心坐標、半徑
int isNewCircleOK; // 用于判斷新生成的圓是否可以了
int i,j;
int drawMode = 3; // 用于設定4種不同的繪制模式,開始設為3
while (circleNum<1000) // 當圓的個數小于100時,循環運行
{
isNewCircleOK = 0; // 假設開始不OK
while (isNewCircleOK==0) // 當新生成的圓不Ok時,重復生成新圓進行比較
{
if (kbhit()) // 當按鍵時
{
char input = _getch(); // 獲得用戶按鍵
if (input==' ') // 空格鍵
{
circleNum = 0; // 圓的個數為0,相當于畫面清除所有已有的圓圈
cleardevice(); // 清屏
drawMode = drawMode+1; // 進行下一種繪圖模式
if (drawMode>4) // 如果大于4,重新回到第1種繪圖模式
drawMode = 1;
}
}
x = rand() % width; // 新圓的圓心x坐標
y = rand() % height; // 新圓的圓心y坐標
r = rmin; // 新圓的半徑開始設為最小半徑
for (i=0;i// 對已有圓遍歷
if (isTwoCirclesIntersect(xArray[i],yArray[i],rArray[i],x,y,r))
break; // 如果已有圓和新圓相交,跳出循環,此時i
if (i==circleNum) // 如果上面for語句都不跳出,說明i等于circleNum
isNewCircleOK = 1; // 這個新生成的圓和已有圓都不相交
}
isNewCircleOK = 0; // 繼續設為不OK,下面要讓這個新圓的半徑最大
while (isNewCircleOK==0 && r// 當不ok,并且新圓的半徑小于最大半徑時
{
r++; // 讓半徑+1
for (j=0;j// 對所有舊圓遍歷
{
if (isTwoCirclesIntersect(xArray[j],yArray[j],rArray[j],x,y,r))
{
isNewCircleOK = 1; // 一旦和一個舊圓相交,這時新圓Ok
break; // 因為新圓半徑已經達到最大的情況,這時跳出循環
}
}
}
xArray[circleNum] = x; // 把新圓的圓心坐標添加到數組中
yArray[circleNum] = y; //
rArray[circleNum] = r; // 把新圓的半徑添加到數組中
circleNum++; // 圓的個數+1
// 根據不同繪圖模式進行繪制
if (drawMode==1)
DrawCircles1(x,y,r);
if (drawMode==2)
DrawCircles2(x,y,r);
if (drawMode==3)
DrawCircles3(x,y,r);
if (drawMode==4)
DrawCircles4(x,y,r);
Sleep(10); // 暫停若干毫秒
}
_getch(); // 等待按鍵輸入
closegraph(); // 關閉窗口
return 0;
}
這一章主要講解了二維數組、函數封裝,按鍵操作等語法知識,利用C語言游戲開發框架,實現了見縫插圓游戲。
希望對大家有幫助!
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C語言
+關注
關注
180文章
7616瀏覽量
137930 -
代碼
+關注
關注
30文章
4841瀏覽量
69166
原文標題:C語言實現見縫插圓游戲!零基礎代碼思路+源碼分享
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
源代碼加密、源代碼防泄漏c/c++與git服務器開發環境
源代碼加密對于很多研發性單位來說是至關重要的,當然每家企業的業務需求不同所用的開發環境及開發語言也不盡相同,今天主要來講一下c++及git開發環境的源代碼防泄密保護方案。企業源
![源<b class='flag-5'>代碼</b>加密、源<b class='flag-5'>代碼</b>防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c</b>++與git服務器開發環境](https://file1.elecfans.com/web2/M00/B2/A6/wKgaomVuxEeAGSf1AABba4Y-Iak289.png)
分析C語言代碼結構的設計問題
來分析一個C語言代碼結構的設計問題。 這段代碼,使用了兩次malloc,分別給 p1 和 p2 申請了內存。用完后,內存釋放,防止內存泄漏。 大家覺得,這樣的
AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT
)開發框架。它極大地簡化了JS與C/C++之間的跨語言訪問,為開發者提供了一種邊界性編程體驗友好的解決方案。通過AKI,開發者可以使用讓代碼更易讀的語法糖,
發表于 01-02 17:08
FPGA打磚塊小游戲設計思路
? 交流問題 ? Q :FPGA打磚塊小游戲,如何基于FPGA用verilog語言在Vivado平臺上寫打磚塊小游戲,最好能用到PS2與VGA。 A :以下是一個基于 FPGA? Verilog
零基礎嵌入式開發學習路線
語言的學習,這個階段需要對代碼進行進一步的提升。不能僅滿足于能寫代碼實現功能,而是需要繼續考慮數據怎樣存儲能更合理的利用空間,算法怎么寫才能更高效的
發表于 10-25 15:55
hex文件如何查看原c語言代碼
直接將 .hex 文件轉換回原始的 C 語言代碼是不可能的,因為 .hex 文件是二進制文件,它包含了單片機程序編譯后的機器碼,這些機器碼與原始的 C
零極點與單位圓分布關系總結
零極點與單位圓分布關系是信號處理和系統分析中的一個重要概念。 零極點的定義 在信號處理和系統分析中,零極點是指系統傳遞函數的零點和極點。傳遞
FlexLua低代碼零基礎開發智能垃圾桶產品原型(接入機智云)
目標功能介紹基于功能強大的ShineBlink低代碼物聯網核心模組和靈活輕巧的Lua腳本編程語言實現如下功能。1、監測和報警監測圾桶內的煙霧并聲光報警監測圾桶內的酒精等有害氣體并聲光報警監測垃圾桶內
![FlexLua低<b class='flag-5'>代碼</b><b class='flag-5'>零基</b>礎開發智能垃圾桶產品原型(接入機智云)](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
如何提升嵌入式C語言代碼可讀性
接口是面向對象語言中的一個比較重要的概念,接口只對外部承諾實現該接口的實體可以完成什么樣的功能,但是不暴露實現的方式。這樣的好處是,實現者可以在不接觸接口使用者的
發表于 04-11 11:30
?391次閱讀
![如何提升嵌入式<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>代碼</b>可讀性](https://file1.elecfans.com/web2/M00/C8/CF/wKgaomYXWeGAfv9tAAArXu1Fi90474.png)
評論