色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言實現見縫插圓游戲!零基礎代碼思路+源碼分享

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

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

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

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

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

首先利用數組實現多個圓的生成和繪制,并使得圓和圓之間不相交;然后學習函數的概念,并應用函數改進代碼,添加了新圓半徑最大化的功能;最后利用函數封裝了多種繪制模式,并通過鍵盤按鍵進行互動。

源碼示例:

#include   
#include 
#include 
#include 
#include 


// 求解兩個點之間的距離
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

    文章

    7605

    瀏覽量

    136991
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68681

原文標題:C語言實現見縫插圓游戲!零基礎代碼思路+源碼分享

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    )開發框架。它極大地簡化了JS與C/C++之間的跨語言訪問,為開發者提供了一種邊界性編程體驗友好的解決方案。通過AKI,開發者可以使用讓代碼更易讀的語法糖,
    發表于 01-02 17:08

    FPGA打磚塊小游戲設計思路

    ? 交流問題 ? Q :FPGA打磚塊小游戲,如何基于FPGA用verilog語言在Vivado平臺上寫打磚塊小游戲,最好能用到PS2與VGA。 A :以下是一個基于 FPGA? Verilog
    的頭像 發表于 12-09 16:57 ?222次閱讀

    零基礎入門PCB工程師

    各位前輩大家好,零基礎入門PCB工程師,有什么學習資料推薦嗎?
    發表于 11-27 16:54

    使用C語言實現函數模板

      用C語言能不能實現一個通用的函數,既能完成整數的相加,又能完成浮點數的相加?
    的頭像 發表于 11-09 11:38 ?401次閱讀

    零基礎嵌入式開發學習路線

    語言的學習,這個階段需要對代碼進行進一步的提升。不能僅滿足于能寫代碼實現功能,而是需要繼續考慮數據怎樣存儲能更合理的利用空間,算法怎么寫才能更高效的
    發表于 10-25 15:55

    TMS320LF240x DSP的C語言和匯編代碼快速入門

    電子發燒友網站提供《TMS320LF240x DSP的C語言和匯編代碼快速入門.pdf》資料免費下載
    發表于 10-18 10:14 ?1次下載
    TMS320LF240x DSP的<b class='flag-5'>C</b><b class='flag-5'>語言</b>和匯編<b class='flag-5'>代碼</b>快速入門

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

    直接將 .hex 文件轉換回原始的 C 語言代碼是不可能的,因為 .hex 文件是二進制文件,它包含了單片機程序編譯后的機器碼,這些機器碼與原始的 C
    的頭像 發表于 09-02 10:37 ?2421次閱讀

    極點與單位分布關系總結

    極點與單位分布關系是信號處理和系統分析中的一個重要概念。 極點的定義 在信號處理和系統分析中,極點是指系統傳遞函數的點和極點。傳遞
    的頭像 發表于 08-21 14:38 ?1744次閱讀

    FlexLua低代碼零基礎開發智能垃圾桶產品原型(接入機智云)

    目標功能介紹基于功能強大的ShineBlink低代碼物聯網核心模組和靈活輕巧的Lua腳本編程語言實現如下功能。1、監測和報警監測圾桶內的煙霧并聲光報警監測圾桶內的酒精等有害氣體并聲光報警監測垃圾桶內
    的頭像 發表于 07-11 08:11 ?1411次閱讀
    FlexLua低<b class='flag-5'>代碼</b><b class='flag-5'>零基</b>礎開發智能垃圾桶產品原型(接入機智云)

    如何用C語言實現高效查找(二分法)

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

    使用C語言實現的CRC計算單元的例子

    使用C語言實現的CRC計算單元的例子
    的頭像 發表于 05-16 16:16 ?1006次閱讀

    如何提升嵌入式C語言代碼可讀性

    接口是面向對象語言中的一個比較重要的概念,接口只對外部承諾實現該接口的實體可以完成什么樣的功能,但是不暴露實現的方式。這樣的好處是,實現者可以在不接觸接口使用者的
    發表于 04-11 11:30 ?361次閱讀
    如何提升嵌入式<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>代碼</b>可讀性

    C語言實現Web參數傳遞

    電子發燒友網站提供《C語言實現Web參數傳遞.docx》資料免費下載
    發表于 03-24 09:14 ?2次下載

    VectorCAST的Probe Point探測點功能,不改變源碼插入代碼實現測試#代碼動態測試

    源碼代碼
    北匯信息POLELINK
    發布于 :2024年01月17日 18:50:55

    ADUC7061如何使用C語言實現EEPROM功能?

    我使用ADUC7061做的信號采集,現在客戶需要實現EEPROM功能來保存3-5個數據,請問如何使用C語言實現?不使用外部EEPROM 專用IC。
    發表于 01-12 06:56
    主站蜘蛛池模板: JK白丝校花爽到娇喘视频| 年轻的女职工在线观看| 在线看片av以及毛片| 日韩 国产 欧美视频二区| 黄色三级在线| 国产白丝精品爽爽久久蜜臀| 最近的2019中文字幕国语版| 呜呜别塞了啊抽插| 美女露出撒尿的部位| 国产亚洲精品精华液| 纯肉宠文高h一对一| 999av视频| 亚洲日韩在线天堂一| 特级黑人三人共一女| 彭丹吃奶门| 麻花传媒XK在线观看| 精品久久久噜噜噜久久7| 国产成人免费高清视频| music radio在线收听| 18禁黄无遮挡禁游戏在线下载| 亚洲精品成人a| 午夜小视频免费观看| 三级黄色网| 飘雪在线观看免费完整版| 美女扒开腿让男生桶爽免费APP | 国产在线播放KKK| 国产高清视频青青青在线| 操他射他影院| hdxxxx58丝袜连裤袜| 99久久99久久精品国产片果冻| 在线少女漫画| 中文字幕蜜臀AV熟女人妻| 一个人免费完整观看日本| 亚洲欧美日韩一级特黄在线| 亚洲国产成人精品无码区5566| 性xxx免费| 亚洲AV无码专区国产乱码网站 | 国产成年人在线观看| 大咪咪dvd| 粉嫩小护士| 国产成人精品三级在线|