生命遊戲

說明:生命遊戲爲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];
}


發佈了39 篇原創文章 · 獲贊 18 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章