一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

C語(yǔ)言編程學(xué)習(xí)基地 ? 來(lái)源:C語(yǔ)言編程學(xué)習(xí)基地 ? 作者:C語(yǔ)言編程學(xué)習(xí)基地 ? 2022-12-02 16:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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ù)封裝了多種繪制模式,并通過(guò)鍵盤(pán)按鍵進(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); // 新開(kāi)一個(gè)窗口
  setbkcolor(RGB(255,255,255)); // 背景顏色為白色
  cleardevice(); // 以背景顏色清空背景
  srand(time(0));  // 隨機(jī)種子函數(shù)


  int xArray[1000]; // 數(shù)組存儲(chǔ)所有圓心的x坐標(biāo)
  int yArray[1000]; // 數(shù)組存儲(chǔ)所有圓心的y坐標(biāo) 
  int rArray[1000]; // 數(shù)組存儲(chǔ)所有圓的半徑 
  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種不同的繪制模式,開(kāi)始設(shè)為3


  while (circleNum<1000) // 當(dāng)圓的個(gè)數(shù)小于100時(shí),循環(huán)運(yùn)行
  {
    isNewCircleOK = 0; // 假設(shè)開(kāi)始不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)于畫(huà)面清除所有已有的圓圈
          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; // 新圓的半徑開(kāi)始設(shè)為最小半徑


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


      if (i==circleNum) // 如果上面for語(yǔ)句都不跳出,說(shuō)明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// 對(duì)所有舊圓遍歷
      {
        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ù)封裝,按鍵操作等語(yǔ)法知識(shí),利用C語(yǔ)言游戲開(kāi)發(fā)框架,實(shí)現(xiàn)了見(jiàn)縫插圓游戲。

希望對(duì)大家有幫助!

審核編輯 :李倩


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

    關(guān)注

    180

    文章

    7632

    瀏覽量

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70735

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【教程】零基礎(chǔ)!手把手教你使用STM32F4進(jìn)行E22-400T22S編程通信

    零基礎(chǔ)搭建本次實(shí)驗(yàn)將會(huì)使用到的軟件是Keil和STM32CubeMX,沒(méi)有這兩個(gè)軟件沒(méi)有請(qǐng)?jiān)诰W(wǎng)上自行下載。本章節(jié)零基礎(chǔ)手把手教會(huì)你搭建最快捷、最簡(jiǎn)單的STM32代碼
    的頭像 發(fā)表于 07-03 19:32 ?229次閱讀
    【教程】<b class='flag-5'>零基</b>礎(chǔ)!手把手教你使用STM32F4進(jìn)行E22-400T22S編程通信

    零基礎(chǔ)學(xué)習(xí)LuatOS編程:快速上手開(kāi)發(fā)實(shí)戰(zhàn)教程!

    無(wú)論你是剛接觸物聯(lián)網(wǎng)編程的新手,還是希望拓展技能的技術(shù)愛(ài)好者,本教程將為零基礎(chǔ)的讀者提供一條清晰的LuatOS學(xué)習(xí)路徑。從安裝開(kāi)發(fā)工具到編寫(xiě)第一個(gè)程序,我們將通過(guò)實(shí)例講解核心概念,助你快速實(shí)現(xiàn)從理論
    的頭像 發(fā)表于 06-13 17:27 ?206次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)學(xué)習(xí)LuatOS編程:快速上手開(kāi)發(fā)實(shí)戰(zhàn)教程!

    單片機(jī)C語(yǔ)言實(shí)例(350+例)

    350+單片機(jī)C語(yǔ)言實(shí)例! 純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)第一時(shí)間告知,刪除內(nèi)容!
    發(fā)表于 05-22 21:47

    【「零基礎(chǔ)開(kāi)發(fā)AI Agent」閱讀體驗(yàn)】+ 入門(mén)篇學(xué)習(xí)

    很高興又有機(jī)會(huì)學(xué)習(xí)ai技術(shù),這次試讀的是「零基礎(chǔ)開(kāi)發(fā)AI Agent」,作者葉濤、管鍇、張心雨。 大模型的普及是近三年來(lái)的一件大事,萬(wàn)物皆可大模型已成為趨勢(shì)。作為大模型開(kāi)發(fā)應(yīng)用中重要組成部分,提示詞
    發(fā)表于 05-02 09:26

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循
    的頭像 發(fā)表于 04-29 18:49 ?1145次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制

    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行Python程序?

    是一種非常有用的編程語(yǔ)言,其語(yǔ)法易于閱讀,允許程序員使用比匯編、C或Java等語(yǔ)言更少的代碼行。Python編程語(yǔ)言最初實(shí)際上是作為L(zhǎng)inu
    的頭像 發(fā)表于 03-25 09:27 ?731次閱讀
    <b class='flag-5'>零基</b>礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行Python程序?

    單片機(jī)C語(yǔ)言編程寶典大全,初學(xué)必備【強(qiáng)推下載!】

    資料介紹:包含 1. 51單片機(jī)入門(mén)教程 2. 初學(xué)者適用:?jiǎn)纹瑱C(jī)C語(yǔ)言實(shí)例100例(代碼及釋義) 3. 51單片機(jī)C語(yǔ)言快速上手 4. 5
    發(fā)表于 03-14 11:03

    分析C語(yǔ)言代碼結(jié)構(gòu)的設(shè)計(jì)問(wèn)題

    來(lái)分析一個(gè)C語(yǔ)言代碼結(jié)構(gòu)的設(shè)計(jì)問(wèn)題。 這段代碼,使用了兩次malloc,分別給 p1 和 p2 申請(qǐng)了內(nèi)存。用完后,內(nèi)存釋放,防止內(nèi)存泄漏。 大家覺(jué)得,這樣的
    的頭像 發(fā)表于 02-11 09:31 ?370次閱讀

    Vivado Tcl零基礎(chǔ)入門(mén)與案例實(shí)戰(zhàn)【高亞軍編著】

    Vivado Tcl零基礎(chǔ)入門(mén)與案例實(shí)戰(zhàn)-高亞軍編寫(xiě)
    發(fā)表于 01-14 11:13

    AKI跨語(yǔ)言調(diào)用庫(kù)神助攻C/C++代碼遷移至HarmonyOS NEXT

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

    FPGA打磚塊小游戲設(shè)計(jì)思路

    ? 交流問(wèn)題 ? Q :FPGA打磚塊小游戲,如何基于FPGA用verilog語(yǔ)言在Vivado平臺(tái)上寫(xiě)打磚塊小游戲,最好能用到PS2與VGA。 A :以下是一個(gè)基于 FPGA? Verilog
    的頭像 發(fā)表于 12-09 16:57 ?972次閱讀

    零基礎(chǔ)入門(mén)PCB工程師

    各位前輩大家好,零基礎(chǔ)入門(mén)PCB工程師,有什么學(xué)習(xí)資料推薦嗎?
    發(fā)表于 11-27 16:54

    使用C語(yǔ)言實(shí)現(xiàn)函數(shù)模板

      用C語(yǔ)言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?947次閱讀

    零基礎(chǔ)嵌入式開(kāi)發(fā)學(xué)習(xí)路線

    語(yǔ)言的學(xué)習(xí),這個(gè)階段需要對(duì)代碼進(jìn)行進(jìn)一步的提升。不能僅滿足于能寫(xiě)代碼實(shí)現(xiàn)功能,而是需要繼續(xù)考慮數(shù)據(jù)怎樣存儲(chǔ)能更合理的利用空間,算法怎么寫(xiě)才能更高效的
    發(fā)表于 10-25 15:55

    hex文件如何查看原c語(yǔ)言代碼

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