Python和《人生游戏规则》



好吧,所以我终于把它打印出来了,并实际做了一些事情,但规则不适用,对吗?我试过打乱规则,但似乎无法正确打印出来,以下是我的规则:

nCount = 0
for i in range(x-1,x+2):
  for j in range(y-1,y+2):
    if not(i == x and j == y):
          nCount += int(mat[i][j])
if(nCount < 2 or nCount > 3):
  return 0
elif(nCount == 2 or nCount == 3):
  return 1
else:
  return mat[i][j]

我测试了一个中间有3个1的常规5x5作为振荡器,但它不是振荡,而是像方形框一样用零填充5x5边缘,然后停止

以下是我的其余编码:

import time
import os
def buildMatrix(fname):
  fp = open(fname, "r")
  row = fp.readlines()
  matrix = []
  for i in range(0, len(row), 1):
    token = row[i].split(" ")
    token[-1] = token[-1].replace('n', ' ')
    matrix.append(token)
  fp.close()
  return matrix
def getRows(mat):
  return len(mat)
def getCols(mat):
  return len(mat[0])
def printGen(mat): #this is what i use for printing
  os.system('clear')
  for i in range(0, len(mat), 1):
    for j in range(0, len(mat[0]), 1):
      if(mat[i][j] == 1):
        print("#", sep=" ", end=" ")
      else:
        print(" ", sep=" ", end=" ")
    print()
def nextGen(cur, nxt): #use this to update to the next matrix
  for i in range(0, len(cur)-1, 1):
    for j in range(0, len(cur[0])-1, 1):
      nxt[i][j] = neighbors(i, j, cur)
  return nxt
def neighbors(x, y, mat):
  nCount = 0
  for i in range(x-1,x+2):
    for j in range(y-1,y+2):
      if not(i == x and j == y):
            nCount += int(mat[i][j])
  if(nCount < 2 or nCount > 3):
    return 0
  elif(nCount == 2 or nCount ==3):
    return 1
   else:
    return mat[i][j]

这并不是我的全部代码,因为我仍在将所有这些导入另一个repo并从该repo运行它,但另一部分我已经完成了

elif(nCount == 2,3):

这不是你想要的。这构建了一个2元素元组,其第一个元素是nCount == 2的值,第二个元素是3,然后将该元组转换为布尔值以决定该走哪条路。如果你想检查nCount是否等于2或3,你可以使用

elif nCount in (2, 3):

但它是冗余的,因为nCount必须是控制流到达elif的控制流之一。当然,这对于执行生活规则来说是不正确的;你想要的是

elif nCount == 3:

如果一个细胞被另外两个活细胞包围,则保持其当前的活/死状态。无论它目前的生活状态如何,它周围必须有3个活细胞才能在下一代存活。

您的代码似乎没有首先进行复制,因此出生或死亡的结果会自行影响。尝试复制:

import numpy
# this function does all the work
def play_life(a):
    xmax, ymax = a.shape
    b = a.copy() # copy current life grid
    for x in range(xmax):
        for y in range(ymax):
            n = numpy.sum(a[max(x - 1, 0):min(x + 2, xmax), max(y - 1, 0):min(y + 2, ymax)]) - a[x, y]
            if a[x, y]:
                if n < 2 or n > 3:
                    b[x, y] = 0 # living cells with <2 or >3 neighbors die
            elif n == 3:
                b[x, y] = 1 # dead cells with 3 neighbors ar born
    return(b)
life = numpy.zeros((5, 5), dtype=numpy.byte)
# place starting conditions here
life[2, 1:4] = 1 # middle three in middle row to 1
# now let's play
print(life)
for i in range(3):
    life = play_life(life)
    print(life)

我也用numpy来表示速度。请注意,当进行复制时,会考虑具有2个或3个邻居的活小区的情况。以下是这个测试用例的结果:

[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 1 1 1 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[0 0 0 0 0]
 [0 0 1 0 0]
 [0 0 1 0 0]
 [0 0 1 0 0]
 [0 0 0 0 0]]
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 1 1 1 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[0 0 0 0 0]
 [0 0 1 0 0]
 [0 0 1 0 0]
 [0 0 1 0 0]
 [0 0 0 0 0]]

现在,如果你没有numpy,那么你可以使用这样的"2D"阵列:

# this function does all the work
def play_life(a):
    xmax = len(a)
    ymax = len(a[0])
    b = [[cell for cell in row] for row in life]
    for x in range(xmax):
        for y in range(ymax):
            n = 0
            for i in range(max(x - 1, 0), min(x + 2, xmax)):
                for j in range(max(y - 1, 0), min(y + 2, ymax)):
                    n += a[i][j]
            n -= a[x][y]
            if a[x][y]:
                if n < 2 or n > 3:
                    b[x][y] = 0 # living cells with <2 or >3 neighbors die
            elif n == 3:
                b[x][y] = 1 # dead cells with 3 neighbors ar born
    return(b)
# this function just prints the board
def show_life(a):
    print('n'.join([' '.join([str(cell) for cell in row]) for row in life]) + 'n')
# create board
x_size, y_size = (5, 5)
life = [[0 for y in range(y_size)] for x in range(x_size)]
# place starting conditions here
for x in range(1, 4): life[x][2] = 1 # middle three in middle row to 1
# now let's play
show_life(life)
for i in range(3):
    life = play_life(life)
    show_life(life)

它为测试用例输出以下内容:

0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 1 1 1 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 1 1 1 0
0 0 0 0 0
0 0 0 0 0

最新更新