說明:生命遊戲爲1970年英國數學家J.H.Conway所提出,某一細胞的鄰居包括上、下、左、右、左上、左下、右上、右下,遊戲規則如下:
孤單細胞死亡:如果細胞鄰居小於一個,則該細胞在下一狀態將死亡。
擁擠死亡:如果細胞的鄰居在4個以上,則該細胞在下一狀態將死亡。
穩定:如果細胞的鄰居爲二個或三個,則下一狀態爲穩定存活:
復活:如果某位置原無細胞存活,而該位置的鄰居爲3個,則該位置將復活一細胞。
具體規則:
鄰居爲0、1、4、5、6、7、8時,則該細胞下次狀態爲死亡。
鄰居個數爲2時,則該細胞下次狀態爲復活。
鄰居個數爲3時,該細胞下次狀態爲穩定。
每次輸出都是對稱的圖形
Ss 生命遊戲(類似數字電路中的狀態機)(讀者看完tips之後請試着自己編寫程序)
1. 設置兩個二維數組map,newmap,分別代表上一狀態和當前狀態,newmap的值根據map(上一狀態)來設置
2. 每當newmap完成並且輸出之後,調用copy,將newmap複製到map中(狀態機)
3. 注意考慮邊界條件,不能超出邊界訪問。
4. Case 語句實現更加便捷
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;
const int live = 1;
const int dead = 0;
int cnt;
int map[20][20];
int newmap[20][20];
void init();
int neighbor(int row, int col);
void print();
void copy();
int main(int argv,char**argc){
cout << "set the initial state" << endl;
cout << "ps:0<=row<=19,0<=col<=19,1 represents live,0 represents death" << endl;
init();
print();
while (true){
for (int i = 0; i < 20;i++)
for (int j = 0; j < 20;j++)
switch (neighbor(i, j)){
case 0:
case 1:
case 4:
case 5:
case 6:
case 7:
case 8:
newmap[i][j] = dead;
break;
case 2:
newmap[i][j] = map[i][j];
break;
case 3:
newmap[i][j] = live;
break;
}
copy();
print();
char ch;
cout << "continue or not" << endl;
cin >> ch;
if (ch == '#')break;
}
system("pause");
return 0;
}
void init(){
ifstream in("input.txt");
for (int j = 0; j < 20; j++){
string temp;
getline(in, temp);
stringstream str(temp);
for (int i = 0; i < 20; i++)
str >> map[j][i];
}
}
int neighbor(int row, int col){
int count = 0;
for (int i = row - 1; i <= row + 1;i++)
for (int j = col - 1; j <= col + 1; j++)
{
if (i < 0 || i >= 20 || j < 0 || j >= 20)continue;
if (map[i][j] == 1)count++;
}
if (map[row][col] == 1)count--;//if the(row,col)one is alive, total number will be minus
//one,else the count is right
return count;
}
void print(){
printf("No.%d time is:\n",++cnt);
for (int i = 0; i < 20; i++){
for (int j = 0; j < 20; j++)
printf("%d ", map[i][j]);
printf("\n");
}
}
void copy(){
for (int i = 0; i < 20;i++)
for (int j = 0; j < 20; j++)
map[i][j] = newmap[i][j];
}