生命游戏-死亡
本文关键字:死亡 游戏 生命 | 更新日期: 2023-09-27 18:16:35
我很无聊,只有30分钟的空闲时间,所以我决定尝试制作一款生活游戏。我遵循了维基百科上的规则,但它似乎不能正常工作。谁能告诉我,我做错了什么?
以下是规则:任何一个活的细胞如果有少于两个活的邻居就会死亡,这似乎是由于人口不足造成的。
任何有两个或三个活邻居的活细胞都能活到下一代。
任何一个活细胞如果有三个以上的活邻居,就会因为过度拥挤而死亡。
任何一个死细胞只要有恰好三个活的邻居就会变成一个活细胞,就好像是通过繁殖一样。
public void PerformLogic()
{
if (in_game)
{
time_elapsed += rate;
if (time_elapsed > frame_rate)
{
time_elapsed = 0;
for (int x = 0; x < board_width; x++)
{
for (int y = 0; y < board_height; y++)
{
if (board[x, y] == alive)
{
int surrounding_cells = 0;
for (int x2 = -1; x2 <= 1; x2++)
{
for (int y2 = -1; y2 <= 1; y2++)
{
if (!(x2 + x <= -1 || y2 + y <= -1 || x + x2 >= board_width || y + y2 >= board_height))
{
if (board[x + x2, y + y2] == alive)
{
surrounding_cells++;
}
}
}
}
if (surrounding_cells < 2)
{
board[x, y] = dead;
}
if (surrounding_cells == 2 ||
surrounding_cells == 3)
{
board[x, y] = alive;
}
if (surrounding_cells > 3)
{
board[x, y] = dead;
}
}
else if (board[x, y] == dead)
{
int surrounding_cells = 0;
for (int x2 = -1; x2 <= 1; x2++)
{
for (int y2 = -1; y2 <= ; y2++)
{
if (!(x2 + x <= -1 || y2 + y <= -1 || x + x2 >= board_width || y + y2 >= board_height))
{
if (board[x + x2, y + y2] == alive)
{
surrounding_cells++;
}
}
}
}
if (surrounding_cells == 3)
{
board[x, y] = alive;
}
}
}
}
}
}
}
任何想法?
我认为你更新板子太早了。生命游戏应该在扫描完整个棋盘后更新棋盘,而不是在扫描时更新。
例如:
if (surrounding_cells > 3)
{
board[x, y] = dead;
}
在此之后,对于它旁边的细胞,该细胞将被视为死亡。
Marc也是对的。
for (int x2 = -1; x2 <= 1; x2++)
{
for (int y2 = -1; y2 <= 1; y2++)
{
在我看来,你在这个循环中包括了中心细胞,所以是9而不是8。
我不确定嵌套的for
是最好的选择,但如果你正在使用它,添加:
if(x2 == 0 && y2 == 0) continue;
在内循环开始处(即在我上面发布的最后一行之后)