每天一算法(生命遊戲)

說明

生命遊戲(game of life)爲1970年由英國數學家J. H. Conway所提出,某一細胞的鄰居包括上、下、左、右、左上、左下、右上與右下相鄰之細胞,遊戲規則如下:

孤單死亡:如果細胞的鄰居小於一個,則該細胞在下一次狀態將死亡。

擁擠死亡:如果細胞的鄰居在四個以上,則該細胞在下一次狀態將死亡。

穩定:如果細胞的鄰居爲二個或三個,則下一次狀態爲穩定存活。

復活:如果某位置原無細胞存活,而該位置的鄰居爲三個,則該位置將復活一細胞。

解法

生命遊戲的規則可簡化爲以下,並使用CASE比對即可使用程式實作:

鄰居個數爲0、1、4、5、6、7、8時,則該細胞下次狀態爲死亡。

鄰居個數爲3時,則該細胞下次狀態爲復活。

鄰居個數爲2時,則該細胞下次狀態爲穩定。

#define ROW 10
#define COL 25
#define DEAD 0
#define ALIVE 1

int map[ROW][COL],newmap[ROW][COL];

void Init()
{
	srand((unsigned int)time(NULL));
	for (int i = 0;i<ROW;i++)
	{
		for (int j = 0;j<COL;j++)
		{
			int x = rand()%2;
			map[i][j] = x;
			newmap[i][j] = 0;
		}
	}
};

void OutPut()
{
	for (int i = 0;i<ROW;i++)
	{
		for (int j = 0;j<COL;j++)
		{
			cout<<map[i][j]<<"  ";
		}
		cout<<endl;
	}
};

int Neighbors(int row,int col)
{
	int number = 0;
	for (int i = row-1;i<=row+1;i++)
	{
		for (int j = col-1;j<=col+1;j++)
		{
			if ((i>=0)&&(i<ROW)&&(j>=0)&&(j<COL))
			{
				if (map[i][j] == ALIVE)
				{
					number++;
				}
			}
		}
	}
	if (0 == number)
	{
		return number;
	}
	if (map[row][col] == ALIVE)
	{
		number--;
	}
	return number;
};
void Copy()
{
	for (int i = 0;i<ROW;i++)
	{
		for (int j = 0;j<COL;j++)
		{
			map[i][j] = newmap[i][j];
		}
	}
};

int main()
{
	Init();
	OutPut();

	cout<<endl<<endl<<endl;
	for (int i = 0;i<ROW;i++)
	{
		for (int j = 0;j<COL;j++)
		{
			int k = Neighbors(i,j);
			switch(k)
			{
			case 0:
			case 1:
			case 4:
			case 5:
			case 7:
			case 6:
			case 8:
				newmap[i][j] = DEAD;
				break;
			case 2:
				 newmap[i][j] = map[i][j];
				 break;
			case 3:
				newmap[i][j] = ALIVE;
				break;
			}
		}
	}

	Copy();
	OutPut();


	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章