LIfe的游戏:在条件

时间:2016-11-08 18:20:07

标签: python arrays python-3.x numpy

我是一名具有Python基础知识的物理系学生,我一直在努力寻找一个解决这个问题的简单方法,但我只是在圈子里跑来跑去。我正在编写一个名为“生命的游戏”(WikiPage)的程序。规则很简单:

  

游戏由生活在二维网格上的所谓细胞组成。这些细胞循环进化。死亡和活细胞的初始模式是第一代。第二代从同时应用一些简单规则到所有细胞发展。规则是:

     

如果细胞没有足够的公司(邻近的细胞少于2个),细胞会死亡

     

如果有4个或更多相邻的细胞,细胞会死于人口过剩。

     

如果(确切地)有3个细胞相邻,则死细胞会重生。

这是作业的一部分,但我不是在寻找一种勺子喂养的解决方案。我们需要使用numpy和数组。

我的方法是生成一个数组board,其初始提要为随机1和0。然后,在一个函数中,我创建另一个数组,其中一行和一列大于board,这将存储新值,然后将其反馈。我在元素ij上迭代(我知道它不是pythonic迭代数组,所以我愿意接受建议和替代)并且得到一个总和(np.sum)子阵列nBlock[i-1:i+1,j-1:j+1]。如果总和大于4或小于4,则元素nBlock[np.array([i,j])]变为零(单元格死亡),否则为1(单元格存在或重生)。

问题是,这不起作用。代码如下:

import numpy as np
import matplotlib.pyplot as plot
import time as t
%matplotlib inline

def printBoard(board):
    im = plot.imshow(board, cmap='Greys', interpolation='none')
    plot.show()
    plot.close()

def initializeBoard():
    board = np.random.randint(2, size=(100, 100))
    return board

board = initializeBoard()
printBoard(board)

def checkAlive():
    if 1 not in board:
        print("All cells are dead! Life is over!")
        return 0
    else:
        return board

def calculateNeighbours(board):
    nBlock = np.zeros((102, 102))
    nBlock[1:101, 1:101] = board

    for i in range(1, 100):
        for j in range(1, 100):
            checksum = np.sum(nBlock[i-1:i+2, j-1:j+2])

            nBlock[:,0] = 0
            nBlock[0,:] = 0

            if checksum == 4:
                nBlock[np.array([i,j])] = 1
            elif checksum > 4 or checksum < 4:
                nBlock[np.array([i,j])] = 0

    return nBlock

def play(board):
    for i in range(1, 10):
        neighbours = calculateNeighbours(board)

        board = neighbours[1:101, 1:101]

        board = checkAlive()

        printBoard(board)

play(board)

数组board未被修改。它返回相同的board

我注意到的另一个奇怪的事情是,如果我删除for循环中的条件,则会成功修改数组。例如,

for i in range(0, 100):
    for j in range(0, 100):
        board[np.array([i,j])] = 1

给了我一个矩阵,其中所有元素都改为1.所以if...else条件有些东西不允许我操作数组中的数据。

赞赏任何和所有帮助:)

1 个答案:

答案 0 :(得分:0)

错误

您的主要错误出现在 checkAlive 的界面逻辑中。你没有日程参数;当你找到一个活细胞时,你会返回共同体棋盘游戏会立即分配给它的参数棋盘

播放中的主板是一个本地变量:更改此选项不会更改您初始化的全局主板。相反,由于 checkAlive 没有局部变量,它返回的是全局变量 board ,它在程序中的任何位置都不会更改。

<强>解决方案

由于 checkAlive 不会改变电路板,因此请勿将其退回。相反,返回一个简单的布尔值。如果需要,播放可以检查并终止该程序。

同时

您的细胞健康算法在几个方面都是错误的。走过逻辑并修复。最值得注意的是,您使用值4来让细胞存活;这是非常不正确的。 2个邻居让小区处于当前状态; 3个邻居让这个细胞活着;任何其他号码都会杀死它。

您当前的逻辑包括计数中的单元格本身。这不区分具有3个朋友的活细胞和具有4个死细胞的活细胞。结果,您正在创建一些细胞,并且您正在杀死活细胞(与2个朋友一起活细胞)。