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

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

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

C語言零基礎(chǔ)項(xiàng)目:生命游戲!詳細(xì)思路+源碼分享

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 2022-12-22 11:17 ? 次閱讀

每天一個(gè)C語言小項(xiàng)目,提升你的編程能力!

程序簡介

生命游戲也叫康威生命游戲、細(xì)胞自動(dòng)機(jī)、元胞自動(dòng)機(jī)等。

生命游戲不需要任何玩家,它是一個(gè)二維矩形世界,這個(gè)世界中的每個(gè)方格居住著一個(gè)活細(xì)胞或?yàn)榭铡?/p>

一個(gè)細(xì)胞在下一個(gè)時(shí)刻的生死取決于相鄰八個(gè)方格中的活細(xì)胞數(shù)量,使整個(gè)生命世界不至于太過荒涼或擁擠,達(dá)成一種動(dòng)態(tài)的平衡。

當(dāng)一個(gè)方格沒有活細(xì)胞時(shí):

若周圍有 3 個(gè)活細(xì)胞,則該方格產(chǎn)生一個(gè)活細(xì)胞(模擬繁殖)。

當(dāng)一個(gè)方格存在活細(xì)胞時(shí):

若周圍少于 2 個(gè)活細(xì)胞,則該方格的細(xì)胞死亡(模擬人口稀疏)。

若周圍有 2 個(gè)或 3 個(gè)活細(xì)胞,保持原樣。

若周圍多于 3 個(gè)活細(xì)胞,則該方格的細(xì)胞死亡(模擬極度擁擠)。

程序執(zhí)行效果

1bd8455a-8106-11ed-8abf-dac502259ad0.png

多的也不說啦!聰明的人已經(jīng)動(dòng)手實(shí)踐去了~

本項(xiàng)目編譯環(huán)境:Visual Studio 2019/2022,EasyX插件

代碼展示:

#include 
#include 
#include 
#include 






// 定義全局變量
__int8 world[102][102] = {0};  // 定義二維世界
IMAGE imgLive, imgEmpty;    // 定義活細(xì)胞和無細(xì)胞區(qū)域的圖案






// 函數(shù)聲明
void Init();          // 初始化
void SquareWorld();        // 創(chuàng)建一個(gè)細(xì)胞以方形分布的世界
void RandWorld();        // 創(chuàng)建一個(gè)細(xì)胞隨機(jī)分布的世界
void PaintWorld();        // 繪制世界
void Evolution();        // 進(jìn)化






// 主函數(shù)
int main()
{
  Init();
  int Speed = 500;      // 游戲速度(毫秒)


  while(true)
  {
    if (kbhit() || Speed == 900)
    {
      char c = getch();


      if (c == ' ' && Speed != 900)
        c = getch();


      if (c >= '0' && c <= '9')
        Speed = ('9' - c) * 100;


      switch(c)
      {
        case 's':
        case 'S':
          SquareWorld();  // 產(chǎn)生默認(rèn)的細(xì)胞以方形分布的世界
          break;


        case 'r':
        case 'R':
          RandWorld();  // 產(chǎn)生默認(rèn)的細(xì)胞以方形分布的世界
          break;


        case VK_ESCAPE:
          goto END;
      }
    }


    Evolution();      // 進(jìn)化
    PaintWorld();      // 繪制世界


    if (Speed != 900)    // 速度為 900 時(shí),為按任意鍵單步執(zhí)行
      Sleep(Speed);
  }


END:
  closegraph();
  return 0;
}






///////////////////////////////////////////////////
// 函數(shù)定義


// 初始化
void Init()
{
  // 創(chuàng)建繪圖窗口
  initgraph(640,480);


  // 設(shè)置隨機(jī)種子
  srand((unsigned)time(NULL));


  // 調(diào)整世界圖案的大小
  Resize(&imgLive,  4, 4);
  Resize(&imgEmpty, 4, 4);


  // 繪制有生命世界的圖案
  SetWorkingImage(&imgLive);
  setcolor(GREEN);
  setfillstyle(GREEN);
  fillellipse(0, 0, 3, 3);


  // 繪制無生命世界的圖案
  SetWorkingImage(&imgEmpty);
  setcolor(DARKGRAY);
  rectangle(1, 1, 2, 2);


  // 恢復(fù)對(duì)默認(rèn)窗口的繪圖
  SetWorkingImage(NULL);


  // 輸出簡單說明
  setfont(24, 0, "黑體");
  outtextxy(254, 18, "生 命 游 戲");
  RECT r = {440, 60, 620, 460};
  setfont(12, 0, "宋體");
  drawtext("生命游戲簡介:
  生命游戲包括一個(gè)二維矩形世界,這個(gè)世界中的每個(gè)方格居住    著一個(gè)活著的或死了的細(xì)胞。一個(gè)細(xì)胞在下一個(gè)時(shí)刻生死取決于相鄰八個(gè)方格中活著的細(xì)胞    的數(shù)量。如果一個(gè)細(xì)胞周圍的活細(xì)胞數(shù)量多于 3 個(gè),這個(gè)細(xì)胞會(huì)因?yàn)橘Y源匱乏而在下一個(gè)時(shí)    刻死去;如果一個(gè)位置周圍有 3 個(gè)活細(xì)胞,則該位置在下一個(gè)時(shí)刻將誕生一個(gè)新的細(xì)胞;如    果一個(gè)位置周圍有 2 個(gè)活細(xì)胞,則該位置的細(xì)胞生死狀態(tài)保持不變;如果一個(gè)細(xì)胞周圍的活    細(xì)胞少于 2 個(gè),那么這個(gè)細(xì)胞會(huì)因太孤單而死去。這樣整個(gè)生命世界才不至于太過荒涼或擁    擠,而是一種動(dòng)態(tài)的平衡。

游戲控制:
 0-9: 調(diào)節(jié)速度(慢--快)
 ESC: 退出
空格:     暫停|繼續(xù)
   S: 創(chuàng)建細(xì)胞以方形分布的世界
   R: 創(chuàng)建細(xì)胞隨機(jī)分布的世界",
    &r, DT_WORDBREAK);


  // 產(chǎn)生默認(rèn)的細(xì)胞以方形分布的世界
  SquareWorld();
}


// 創(chuàng)建一個(gè)細(xì)胞以方形分布的世界
void SquareWorld()
{
  memset(world, 0, 102 * 102 * sizeof(__int8));


  for(int x = 1; x <= 100; x++)
    world[x][1] = world[x][100] = 1;


  for(int y = 1; y <= 100; y++)
    world[1][y] = world[100][y] = 1;
}


// 創(chuàng)建一個(gè)細(xì)胞隨機(jī)分布的世界
void RandWorld()
{
  for(int x = 1; x <= 100; x++)
    for(int y = 1; y <= 100; y++)
      world[x][y] = rand() % 2;
}


// 繪制世界
void PaintWorld()
{
  for(int x = 1; x <= 100; x++)
    for(int y = 1; y <= 100; y++)
      putimage(16 + x * 4, 56 + y * 4, world[x][y] ? &imgLive : &imgEmpty);
}


// 進(jìn)化
void Evolution()
{
  __int8 tmp[102][102] = {0};    // 臨時(shí)數(shù)組
  int sum;


  for(int x = 1; x <= 100; x++)
  {
    for(int y = 1; y <= 100; y++)
    {
      // 計(jì)算周圍活著的生命數(shù)量
      sum = world[x+1][y] + world[x+1][y-1] + world[x][y-1] + world[x-1][y-1]
        + world[x-1][y] + world[x-1][y+1] + world[x][y+1] + world[x+1][y+1];


      // 計(jì)算當(dāng)前位置的生命狀態(tài)
      switch(sum)
      {
        case 3:    tmp[x][y] = 1;        break;
        case 2:    tmp[x][y] = world[x][y];  break;
        default:  tmp[x][y] = 0;        break;
      }
    }
  }


  // 將臨時(shí)數(shù)組恢復(fù)為世界
  memcpy(world, tmp, 102 * 102 * sizeof(__int8));
}

大家趕緊去動(dòng)手試試吧!

審核編輯:湯梓紅

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

    關(guān)注

    2

    文章

    726

    瀏覽量

    26244
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135566
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    629

    瀏覽量

    29074

原文標(biāo)題:C語言零基礎(chǔ)項(xiàng)目:生命游戲!詳細(xì)思路+源碼分享

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言零基礎(chǔ)項(xiàng)目:涂格子(點(diǎn)燈)游戲!詳細(xì)思路+源碼分享

    點(diǎn)燈游戲是一個(gè)十分有趣的智力游戲:有一行N行N列的燈,開始時(shí)全部是滅的,當(dāng)你點(diǎn)擊其中一盞燈時(shí)他的上下左右(若存在的話)狀態(tài)全部改變,現(xiàn)在要求你在限定的時(shí)間內(nèi)以最少地步數(shù),將全部的燈點(diǎn)亮。
    發(fā)表于 12-16 09:47 ?794次閱讀

    C語言零基礎(chǔ)項(xiàng)目:貪吃蛇!詳細(xì)思路+源碼分享

    每天一個(gè)C語言項(xiàng)目,提升你的編程能力!
    發(fā)表于 12-19 11:04 ?592次閱讀

    零基礎(chǔ)怎樣學(xué)習(xí)C語言呢?

    零基礎(chǔ)學(xué)c語言如何開始
    發(fā)表于 05-15 10:23

    C語言游戲源碼分享

    C語言游戲源碼24點(diǎn)火柴人俄羅斯等等等35個(gè)游戲源碼網(wǎng)盤分享鏈接:https://pan.ba
    發(fā)表于 04-12 17:11

    C語言零基礎(chǔ)入門教學(xué)資料匯總下載

    C語言零基礎(chǔ)入門教學(xué)資料匯總下載
    發(fā)表于 05-29 10:41 ?132次下載

    C語言零基礎(chǔ)項(xiàng)目:打字母游戲!詳細(xì)思路+源碼分享

    今天就用C語言寫了這么個(gè)打字母的小程序,就是以前學(xué)習(xí)機(jī)上那種字母往下掉,然后按相應(yīng)鍵字母消失的游戲
    發(fā)表于 12-15 15:02 ?580次閱讀

    C語言零基礎(chǔ)項(xiàng)目:俄羅斯方塊游戲!詳細(xì)思路+源碼分享

    由小方塊組成的不同形狀的板塊陸續(xù)從屏幕上方落下來,玩家通過調(diào)整板塊的位置和方向,使它們?cè)谄聊坏撞科闯鐾暾囊粭l或幾條。這些完整的橫條會(huì)隨即消失,給新落下來的板塊騰出空間,與此同時(shí),玩家得到分?jǐn)?shù)獎(jiǎng)勵(lì)。沒有被消除掉的方塊不斷堆積起來,一旦堆到屏幕頂端,玩家便告輸,游戲結(jié)束。
    的頭像 發(fā)表于 12-19 14:52 ?1778次閱讀

    C語言零基礎(chǔ)項(xiàng)目:迷宮游戲!詳細(xì)思路+源碼分享

    每天一個(gè)C語言項(xiàng)目,提升你的編程能力!
    的頭像 發(fā)表于 12-21 10:08 ?871次閱讀

    C語言零基礎(chǔ)項(xiàng)目:推箱子游戲!詳細(xì)思路+源碼分享

    推箱子是一個(gè)來自日本的古老游戲,目的是在訓(xùn)練你的邏輯思考能力。在一個(gè)狹小的倉庫中,要求把木箱放到指定的位置,稍不小心就會(huì)出現(xiàn)箱子無法移動(dòng)或者通道被堵住的情況,所以需要巧妙的利用有限的空間和通道,合理安排移動(dòng)的次序和位置,才能順利的完成任務(wù)。
    的頭像 發(fā)表于 12-27 10:38 ?788次閱讀

    C語言零基礎(chǔ)項(xiàng)目:黑白棋游戲!詳細(xì)思路+源碼分享

    《黑白棋》也叫翻轉(zhuǎn)棋或者奧賽羅,其游戲過程是相互翻轉(zhuǎn)對(duì)方的棋子,最后以棋盤上誰的棋子多來判斷勝負(fù)。雖然規(guī)則簡單,但是變化復(fù)雜,是典型的易學(xué)難精,奧妙無窮,不信您就試試看吧!
    的頭像 發(fā)表于 12-29 11:12 ?889次閱讀

    C語言零基礎(chǔ)項(xiàng)目:自制軍棋游戲詳細(xì)思路+源碼分享

    每天一個(gè)C語言項(xiàng)目,提升你的編程能力!
    的頭像 發(fā)表于 12-29 17:14 ?8340次閱讀

    C語言零基礎(chǔ)項(xiàng)目:對(duì)對(duì)碰(消除類)游戲!詳細(xì)思路+源碼分享

    游戲中消除的對(duì)象為各種各樣的頭像,包括樹、小車、草莓和酒瓶等一些頭像。玩家通關(guān)移動(dòng)這些頭像位置湊夠一定數(shù)量的相同圖標(biāo)即可消除。
    的頭像 發(fā)表于 01-03 11:13 ?675次閱讀

    C語言零基礎(chǔ)項(xiàng)目:吃豆人小游戲!詳細(xì)思路+源碼分享

    《吃豆游戲》是一款休閑小游戲,和貪吃蛇,球球大作戰(zhàn)吃食物都是有差不多的游戲邏輯。
    的頭像 發(fā)表于 01-03 11:38 ?1325次閱讀

    C語言項(xiàng)目:礦井逃生游戲(密室)!詳細(xì)思路+源碼分享

    密室逃脫相信大部分都玩過了吧?本游戲就是一種用C語言寫的類似的游戲,因?yàn)橛檬蛛娡舱彰髡衣?,所以有點(diǎn)像礦工的樣子,還是叫它礦井逃生吧!(以下是游戲
    的頭像 發(fā)表于 01-07 09:41 ?1303次閱讀

    C語言零基礎(chǔ)項(xiàng)目:打飛機(jī)游戲!300行源碼分享+詳細(xì)思路

    游戲中,你操控你的防空車盡可能的多擊落飛機(jī),躲避飛機(jī)扔的炸彈。
    的頭像 發(fā)表于 01-11 09:31 ?943次閱讀