0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言實(shí)現(xiàn)見縫插圓游戲!零基礎(chǔ)代碼思路+源碼分享

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程學(xué)習(xí)基地 ? 2022-12-02 16:28 ? 次閱讀

《見縫插圓》顧名思義,就是在我們繪制的C語言窗口里面畫隨機(jī)圓,圓與圓之間不能相交或相切,那就要自己找“縫隙”咯!

今天用C語言制一些漂亮的隨機(jī)圖案,如圖所示,隨機(jī)生成的圓互不相交且盡量填滿畫布,按空格鍵可以切換不同的繪制模式:

14ae142c-7219-11ed-8abf-dac502259ad0.png

14c0bd70-7219-11ed-8abf-dac502259ad0.png

首先利用數(shù)組實(shí)現(xiàn)多個(gè)圓的生成和繪制,并使得圓和圓之間不相交;然后學(xué)習(xí)函數(shù)的概念,并應(yīng)用函數(shù)改進(jìn)代碼,添加了新圓半徑最大化的功能;最后利用函數(shù)封裝了多種繪制模式,并通過鍵盤按鍵進(jìn)行互動(dòng)。

源碼示例:

#include   
#include 
#include 
#include 
#include 


// 求解兩個(gè)點(diǎn)之間的距離
float Dist2Points(float x1,float y1,float x2,float y2)
{
  float result;
  result  = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
  return result;
}


// 判斷兩個(gè)圓是否相交
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);
}


// 填充隨機(jī)顏色圓繪制
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);
}


// 填充隨機(jī)顏色同心圓繪制
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;
  }
}


// 隨機(jī)顏色同心圓線條繪制
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() // 主函數(shù)
{
  int width = 600; // 窗口寬度
  int height = 600; // 窗口高度
  initgraph(width,height); // 新開一個(gè)窗口
  setbkcolor(RGB(255,255,255)); // 背景顏色為白色
  cleardevice(); // 以背景顏色清空背景
  srand(time(0));  // 隨機(jī)種子函數(shù)


  int xArray[1000]; // 數(shù)組存儲所有圓心的x坐標(biāo)
  int yArray[1000]; // 數(shù)組存儲所有圓心的y坐標(biāo) 
  int rArray[1000]; // 數(shù)組存儲所有圓的半徑 
  int rmin = 8; // 圓的最小半徑
  int rmax = 50; // 圓的最大半徑
  int circleNum = 0; // 生成的圓的個(gè)數(shù)
  float x,y,r; // 新增圓的圓心坐標(biāo)、半徑
  int isNewCircleOK; // 用于判斷新生成的圓是否可以了
  int i,j;
  int drawMode = 3; // 用于設(shè)定4種不同的繪制模式,開始設(shè)為3


  while (circleNum<1000) // 當(dāng)圓的個(gè)數(shù)小于100時(shí),循環(huán)運(yùn)行
  {
    isNewCircleOK = 0; // 假設(shè)開始不OK


    while (isNewCircleOK==0) // 當(dāng)新生成的圓不Ok時(shí),重復(fù)生成新圓進(jìn)行比較
    {
      if (kbhit()) // 當(dāng)按鍵時(shí)
      {
        char input = _getch(); // 獲得用戶按鍵
        if (input==' ') // 空格鍵
        {
          circleNum = 0; // 圓的個(gè)數(shù)為0,相當(dāng)于畫面清除所有已有的圓圈
          cleardevice(); // 清屏
          drawMode = drawMode+1; // 進(jìn)行下一種繪圖模式
          if (drawMode>4) // 如果大于4,重新回到第1種繪圖模式
            drawMode = 1;
        }
      }


      x = rand() % width; // 新圓的圓心x坐標(biāo)
      y = rand() % height; // 新圓的圓心y坐標(biāo)
      r = rmin; // 新圓的半徑開始設(shè)為最小半徑


      for (i=0;i// 對已有圓遍歷
        if (isTwoCirclesIntersect(xArray[i],yArray[i],rArray[i],x,y,r))
          break; // 如果已有圓和新圓相交,跳出循環(huán),此時(shí)i


      if (i==circleNum) // 如果上面for語句都不跳出,說明i等于circleNum
        isNewCircleOK = 1; //  這個(gè)新生成的圓和已有圓都不相交
    }


    isNewCircleOK = 0; // 繼續(xù)設(shè)為不OK,下面要讓這個(gè)新圓的半徑最大
    while (isNewCircleOK==0 && r// 當(dāng)不ok,并且新圓的半徑小于最大半徑時(shí)
    {
      r++; // 讓半徑+1
      for (j=0;j// 對所有舊圓遍歷
      {
        if (isTwoCirclesIntersect(xArray[j],yArray[j],rArray[j],x,y,r))
        {
          isNewCircleOK = 1; // 一旦和一個(gè)舊圓相交,這時(shí)新圓Ok
          break; // 因?yàn)樾聢A半徑已經(jīng)達(dá)到最大的情況,這時(shí)跳出循環(huán)
        }
      }
    }


    xArray[circleNum] = x; // 把新圓的圓心坐標(biāo)添加到數(shù)組中
    yArray[circleNum] = y; //
    rArray[circleNum] = r; // 把新圓的半徑添加到數(shù)組中
    circleNum++; // 圓的個(gè)數(shù)+1


    // 根據(jù)不同繪圖模式進(jìn)行繪制    
    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();  // 關(guān)閉窗口
  return 0;
} 

這一章主要講解了二維數(shù)組、函數(shù)封裝,按鍵操作等語法知識,利用C語言游戲開發(fā)框架,實(shí)現(xiàn)了見縫插圓游戲。

希望對大家有幫助!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134026
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67761

原文標(biāo)題:C語言實(shí)現(xiàn)見縫插圓游戲!零基礎(chǔ)代碼思路+源碼分享

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    hex文件如何查看原c語言代碼

    直接將 .hex 文件轉(zhuǎn)換回原始的 C 語言代碼是不可能的,因?yàn)?.hex 文件是二進(jìn)制文件,它包含了單片機(jī)程序編譯后的機(jī)器碼,這些機(jī)器碼與原始的 C
    的頭像 發(fā)表于 09-02 10:37 ?270次閱讀

    如何用C語言實(shí)現(xiàn)高效查找(二分法)

    今天給分享一下使用C語言實(shí)現(xiàn)二分算法,主要包含以下幾部分內(nèi)容:二分查找算法介紹二分查找算法使用場景二分查找算法代碼實(shí)現(xiàn)二分查找算法實(shí)現(xiàn)過程用
    的頭像 發(fā)表于 06-04 08:04 ?764次閱讀
    如何用<b class='flag-5'>C</b><b class='flag-5'>語言實(shí)現(xiàn)</b>高效查找(二分法)

    使用C語言實(shí)現(xiàn)的CRC計(jì)算單元的例子

    使用C語言實(shí)現(xiàn)的CRC計(jì)算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?509次閱讀

    C語言實(shí)現(xiàn)Web參數(shù)傳遞

    電子發(fā)燒友網(wǎng)站提供《C語言實(shí)現(xiàn)Web參數(shù)傳遞.docx》資料免費(fèi)下載
    發(fā)表于 03-24 09:14 ?2次下載

    ADUC7061如何使用C語言實(shí)現(xiàn)EEPROM功能?

    我使用ADUC7061做的信號采集,現(xiàn)在客戶需要實(shí)現(xiàn)EEPROM功能來保存3-5個(gè)數(shù)據(jù),請問如何使用C語言實(shí)現(xiàn)?不使用外部EEPROM 專用IC。
    發(fā)表于 01-12 06:56

    零基礎(chǔ)入門 Hyperlynx 仿真教程

    電子發(fā)燒友網(wǎng)站提供《零基礎(chǔ)入門 Hyperlynx 仿真教程.pdf》資料免費(fèi)下載
    發(fā)表于 12-22 10:49 ?22次下載

    php的源碼是什么開源語言

    PHP的源碼是用C語言編寫的,是一種開源的服務(wù)器端腳本語言。下面是關(guān)于PHP源碼的詳細(xì)介紹。 一、PHP簡介 PHP(全稱:PHP: Hyp
    的頭像 發(fā)表于 12-04 16:11 ?1375次閱讀

    基于FPGA的線性值-中

    利用不同的語言實(shí)現(xiàn)。C語言對于迭代處理很容易編寫,并且方便調(diào)試。因此,可以先利用C語言驗(yàn)證方法,再利用Verilog
    發(fā)表于 11-23 23:09

    c語言怎么把代碼全部注釋掉

    要將C語言代碼全部注釋掉,即不讓代碼被編譯和執(zhí)行,可以使用注釋語句來實(shí)現(xiàn)。C
    的頭像 發(fā)表于 11-22 10:21 ?4933次閱讀

    C語言課程設(shè)計(jì)案例精編-源碼

    電子發(fā)燒友網(wǎng)站提供《C語言課程設(shè)計(jì)案例精編-源碼.rar》資料免費(fèi)下載
    發(fā)表于 11-21 10:39 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>課程設(shè)計(jì)案例精編-<b class='flag-5'>源碼</b>

    C語言游戲源碼大放送

    電子發(fā)燒友網(wǎng)站提供《C語言游戲源碼大放送.rar》資料免費(fèi)下載
    發(fā)表于 11-21 10:36 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>小<b class='flag-5'>游戲</b><b class='flag-5'>源碼</b>大放送

    178個(gè)C語言算法源碼下載

    電子發(fā)燒友網(wǎng)站提供《178個(gè)C語言算法源碼下載.zip》資料免費(fèi)下載
    發(fā)表于 11-21 09:35 ?3次下載
    178個(gè)<b class='flag-5'>C</b><b class='flag-5'>語言</b>算法<b class='flag-5'>源碼</b>下載

    C語言實(shí)用程序150例

    電子發(fā)燒友網(wǎng)站提供《C語言實(shí)用程序150例.rar》資料免費(fèi)下載
    發(fā)表于 11-20 11:37 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言實(shí)</b>用程序150例

    C語言指紋識別源碼分享

    電子發(fā)燒友網(wǎng)站提供《C語言指紋識別源碼分享.rar》資料免費(fèi)下載
    發(fā)表于 11-18 14:50 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>指紋識別<b class='flag-5'>源碼</b>分享

    基于VHDL語言實(shí)現(xiàn)遠(yuǎn)程防盜報(bào)警設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于VHDL語言實(shí)現(xiàn)遠(yuǎn)程防盜報(bào)警設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 11-08 14:33 ?0次下載
    基于VHDL<b class='flag-5'>語言實(shí)現(xiàn)</b>遠(yuǎn)程防盜報(bào)警設(shè)計(jì)