游戏生活模式执行不正确

时间:2015-03-02 14:26:27

标签: python conways-game-of-life

我的Conway在Python中的生活游戏实现似乎没有正确遵循规则,我无法弄清楚可能出错的地方。当我将最终配置放入Golly时,它会继续超越我的。

我首先通过将我的程序停止进入Golly的配置识别该程序,然后注意到它可以进一步传送。

我还把我的游戏中的整个小板放到了Golly中,它与我的配置有很大的不同。 Golly是一款广泛使用的生命模拟器游戏。

我尝试了几种不同的方法来解决我的问题:

  • 我在代码中分解了逻辑语句,没有使用and / or语句。
  • 我通过将neighbors()函数插入到自己的程序中并设置了一些网格配置来测试我的neighbors()函数。
  • 然后我看了打印出来的网格,并在某个位置打了#Function to find number of live neighbors def neighbors(row, column): adjacents = 0 #Horizontally adjacent if row > 0: if board[row-1][column]: adjacents += 1 if column > 0: if board[row][column-1]: adjacents += 1 if row < thesize-1: if board[row+1][column]: adjacents += 1 if column < thesize-1: if board[row][column+1]: adjacents += 1 #Diagonally adjacent if row > 0 and column > 0: if board[row-1][column-1]: adjacents += 1 if row < thesize-1 and column < thesize-1: if board[row+1][column+1]: adjacents += 1 if row > 0 and column < thesize-1: if board[row-1][column+1]: adjacents += 1 if row < thesize-1 and column > 0: if board[row+1][column-1]: adjacents += 1 #Return the final count (0-8) return adjacents 。它工作得很好。

查看我的代码,我看不出为什么它不起作用。我没有收到错误,工作,它只是错误。模式的进展与它们的应用方式大不相同。这也是第一个&gt;我编写的100行程序,如果答案很明显,请不要松散地阅读教程,请原谅我。

相关代码如下:

#Main loop
while 1:

    #Manage the rules of the game
    for r in range(len(board)):
        for c in range(len(board)):
            neighborcount = neighbors(r, c)
            if board[r][c]:
                giveLife(r, c)
                if neighborcount < 2 or neighborcount > 3:
                    board[r][c] = False
            elif not board[r][c]:
                killRuthlessly(r, c)
                if neighborcount == 3:
                    board[r][c] = True

这似乎可以完美地返回任何给定细胞的8个邻居中有多少是活着的。下一位是逻辑部分,我认为问题在于。它根据游戏规则改变阵列。

    for r in range(len(board)):
        for c in range(len(board)):
            if board[r][c]:
                giveLife(r, c)
            if not board[r][c]:
                killRuthlessly(r, c)

最后,在pygame屏幕上可视化地打开和关闭正方形的部分。这是经过测试的,似乎效果很好,我只是觉得我会把它包括在内,以防出现问题。

giveLife

killRuthlessly是一个在给定位置绘制黑色矩形的函数,{{1}}绘制一个白色矩形。这些似乎都能正常运作。

1 个答案:

答案 0 :(得分:12)

对于循环通过电路板并检查相邻电池的逻辑,它会在继续检查其他电池的同时打开/关闭电池。你可能正在阅读相邻的单元格,不是因为它们是在前一个时间步骤(这很重要),而是因为你已经改变了状态,因为它们已经被循环了。尝试创建一个tmp_board,复制当前的电路板以及进行哪些编辑。然后在将所有内容循环后将其复制回board