做遊戲,學編程(C語言) 5 數組之生命遊戲

學完數組的概念後,有一個簡單的小遊戲特別適合上手---生命遊戲,假設有int Cells[30][30],也即有30×30個小格子,每個小格子裡面可以有細胞生命,或者細胞死亡。通過把這些狀態輸出出來,就可以顯示出相應的圖案。

生命遊戲演化的規則:

每個矩陣方格可以包含一個有機體,不在邊上的有機體有8個相鄰方格。

1. 如果一個細胞周圍有3個細胞為生,則該細胞為生(即該細胞若原先為死,則轉為生,若原先為生,則保持不變)

2. 如果一個細胞周圍有2個細胞為生,則該細胞的生死狀態保持不變

3. 在其它情況下,該細胞為死(即該細胞若原先為生,則轉為死,若原先為死,則保持不變)

通過這個例子,大家可以體會二維數組在遊戲開發中的應用,可以記錄畫布中的所有數據,並把畫面顯示、數據更新兩塊隔離開,便於程序的維護和更新。

第一步,利用上一講的框架進行遊戲的初始化。可以得到類似下面的靜止圖案。

#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <windows.h>#include <time.h>#define High 25 // 遊戲畫面尺寸#define Width 50// 全局變數int cells[High][Width]; // 所有位置細胞生1或死0void gotoxy(int x,int y)//類似於清屏函數{ HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(handle,pos);}void startup() // 數據初始化{ int i,j; for (i=0;i<High;i++) // 隨機初始化 for (j=0;j<Width;j++) { cells[i][j] = rand()%2; }}void show() // 顯示畫面{ gotoxy(0,0); // 清屏 int i,j; for (i=0;i<=High;i++) { for (j=0;j<=Width;j++) { if (cells[i][j]==1) printf("*"); // 輸出活的細胞 else printf(" "); // 輸出空格 } printf("
"); } Sleep(50);} void updateWithoutInput() // 與用戶輸入無關的更新{ }void updateWithInput() // 與用戶輸入有關的更新{}void main(){ startup(); // 數據初始化 while (1) // 遊戲循環執行 { show(); // 顯示畫面 updateWithoutInput(); // 與用戶輸入無關的更新 updateWithInput(); // 與用戶輸入有關的更新 }}

第二步,依照上面的規則,讓細胞進行繁衍或死亡,得到不斷變化的圖案。

#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <windows.h>#include <time.h>#define High 25 // 遊戲畫面尺寸#define Width 50// 全局變數int cells[High][Width]; // 所有位置細胞生1或死0void gotoxy(int x,int y)//類似於清屏函數{ HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(handle,pos);}void startup() // 數據初始化{ int i,j; for (i=0;i<High;i++) // 初始化 for (j=0;j<Width;j++) { cells[i][j] = 1; }}void show() // 顯示畫面{ gotoxy(0,0); // 清屏 int i,j; for (i=1;i<=High-1;i++) { for (j=1;j<=Width-1;j++) { if (cells[i][j]==1) printf("*"); // 輸出活的細胞 else printf(" "); // 輸出空格 } printf("
"); } Sleep(50);} void updateWithoutInput() // 與用戶輸入無關的更新{ int NewCells[High][Width]; // 下一幀的細胞情況 int NeibourNumber; //統計鄰居的個數 int i,j; for (i=1;i<=High-1;i++) { for (j=1;j<=Width-1;j++) { NeibourNumber = cells[i-1][j-1] + cells[i-1][j] + cells[i-1][j+1] + cells[i][j-1] + cells[i][j+1] + cells[i+1][j-1] + cells[i+1][j] + cells[i+1][j+1]; if (NeibourNumber==3) NewCells[i][j] = 1; else if (NeibourNumber==2) NewCells[i][j] = cells[i][j]; else NewCells[i][j] = 0; } } for (i=1;i<=High-1;i++) for (j=1;j<=Width-1;j++) cells[i][j] = NewCells[i][j]; }void updateWithInput() // 與用戶輸入有關的更新{ }void main(){ startup(); // 數據初始化 while (1) // 遊戲循環執行 { show(); // 顯示畫面 updateWithoutInput(); // 與用戶輸入無關的更新 updateWithInput(); // 與用戶輸入有關的更新 }}

思考題:大家可以嘗試修改規則,比如初始化不同的數據,或者3,2的時候都增加;增加另一個物種,食肉動物、食草動物,互相抑制;增加不同地形,比如某塊區域有水源,生命更容易生存;交互投食,按+加速、按-減速;模擬生態進化、還有模擬大氣污染、謠言傳播等等。

下一個教程,我們利用數組,進一步改進飛機遊戲: 知乎專欄

利用數組的遊戲開發,也可以參考同學的遊戲總結---是男人就堅持100秒:知乎專欄

推薦閱讀:

學會網頁製作需要多長時間?
工業4.0的浪潮下,個人應該擁有怎樣的知識貯備或者技術能力才能跟得上發展?
MP3格式播放出來居然是視頻,這是為什麼?

TAG:C编程语言 | 计算机技术 | CC |