Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Conway'中的意外结果;人生的游戏_Python_Pygame_Conways Game Of Life - Fatal编程技术网

Python Conway'中的意外结果;人生的游戏

Python Conway'中的意外结果;人生的游戏,python,pygame,conways-game-of-life,Python,Pygame,Conways Game Of Life,我一直在尝试使用Pygame为Python编写我自己版本的Conway的生活游戏作为练习。我首先编写了初始化游戏场的函数,然后计算下一代。我使用控制台来打印结果并验证结果是否返回了预期结果(在5x5网格上手工生成仅两代) 关于我如何计算邻居的重要提示。。。我没有在整个数组中执行for循环,也没有在每个单元格中执行for循环计数,而是实现了一个保存邻居计数的数组。仅在单元格状态更改时进行更改。这意味着我不会浪费时间为没有改变的单元计算邻居 当使用Pygame显示矩形阵列时,我编写了以下程序。起初,

我一直在尝试使用Pygame为Python编写我自己版本的Conway的生活游戏作为练习。我首先编写了初始化游戏场的函数,然后计算下一代。我使用控制台来打印结果并验证结果是否返回了预期结果(在5x5网格上手工生成仅两代)

关于我如何计算邻居的重要提示。。。我没有在整个数组中执行for循环,也没有在每个单元格中执行for循环计数,而是实现了一个保存邻居计数的数组。仅在单元格状态更改时进行更改。这意味着我不会浪费时间为没有改变的单元计算邻居

当使用Pygame显示矩形阵列时,我编写了以下程序。起初,我通过填充整个屏幕的白色来绘制屏幕,然后将活动单元格绘制为黑色(这可以通过注释update()中的else语句来完成)。我希望它能正常工作,但当我运行程序时,我最终得到的只是屏幕上的黑色填充

我对结果感到困惑,所以我为未填充的细胞绘制了白色矩形(使用else语句)。结果看起来更好,但细胞最终不是全部死亡,而是在整个屏幕上繁殖。这与我预期的相反,因为我预期它最终会稳定下来

有人知道我做错了什么吗?我知道这不是编写这个程序的最佳方式,我欢迎大家对我如何能做得更好发表意见


  • 返回=运行模拟
  • “R”=随机化
  • ‘T’=勾选一代
  • “C”=清除游戏场
  • “N”=显示邻居地图
导入pygame
从pygame.locals导入*
将numpy作为np导入
从随机导入*
导入副本
fieldSize=[100,50]
cellSize=10#建议使用大于10的大小查看邻居计数
WindowsSize=[fieldSize[0]*cellSize,fieldSize[1]*cellSize]
#计算每个轴上的最后一个单元格,以避免重复计算
lastCell=[(fieldSize[0]-1),(fieldSize[1]-1)]
dX=float(窗口大小[0])/float(字段大小[0])
dY=float(窗口大小[1])/float(字段大小[1])
colorAlive=[0125,0]
colorDead=[0,0,0]
#待办事项清单
#1.让cLife接受字段大小
#2.将随机函数转换为numpy.random.randint
类cLife():
def随机化(自我):
self.neighbories=np.zero(字段大小)
#用随机数填充游戏区域
对于范围内的x(字段大小[0]):
对于范围内的y(字段大小[1]):
如果(randint(0,99)0和位置[0]0和位置[1]3):
self.gameField[x][y]=0
self.updateNeighbors([x,y],False)
#任何有三个活邻居的死细胞都会变成活细胞,就像通过繁殖一样。
elif(self.gameField[x][y]==0,self.neighborsOld[x][y]==3):
self.gameField[x][y]=1
self.updateNeighbors([x,y],True)
def绘图字段(自身、表面):
表面填充(不着色)
#循环并绘制每个活细胞
对于范围内的x(字段大小[0]):
对于范围内的y(字段大小[1]):
如果(self.gameField[x][y]==1):
pygame.draw.rect(surface,colorAlive,[dX*x,dY*y,dX,dY])
pygame.display.flip()
定义初始化(自):
#用零初始化游戏场和邻居地图
self.gameField=np.zero(fieldSize)
self.neighbories=np.zero(字段大小)
#节目开始
游戏=cLife()
pygame.init()
surface=pygame.display.set_模式(WindowsSize)
pygame.display.set_标题(“康威的生命游戏”)
clock=pygame.time.clock()
pygame.font.init()
font=pygame.font.font(无,10)
表面填充(不着色)
游戏。随机化()
比赛场地(地面)
pygame.display.flip()
运行=错误
尽管如此:
#时钟滴答(60)
#处理事件
对于pygame.event.get()中的事件:
如果(event.type==pygame.MOUSEBUTTONDOWN):
mousePos=pygame.mouse.get_pos()
x=int(鼠标点[0]/dX)
y=int(鼠标点[1]/dY)
如果(game.gameField[x][y]==0):
game.gameField[x][y]=1
game.updateNeighbors([x,y],True)
比赛场地(地面)
其他:
game.gameField[x][y]=0
game.updateNeighbors([x,y],False)
比赛场地(地面)
elif(event.type==pygame.QUIT):
pygame.quit()
elif(event.type==pygame.KEYDOWN):
#返回键启动和停止模拟
如果(event.key==pygame.K_RETURN):
如果(运行==False):
运行=真
其他:
运行=错误
#“t”键将模拟向前推进一代
elif(event.key==pygame.K_t和running==False):
game.nextGeneration()
比赛场地(地面)
#“r”使运动场随机化
elif(event.key==pygame.K\r):
游戏。随机化()
比赛场地(地面)
#“c”清除游戏场
elif(event.key==pygame.K_c):
运行=错误
game.gameField=np.0(字段大小)
game.neights=np.0(字段大小)
比赛场地(地面)
#“n”显示邻居地图
elif(event.key==pygame.K\n):
游戏。显示邻居(表面)
如果(正在运行==True):
game.nextGeneration()
比赛场地(地面)

self.neightorsold=self.neights
不会复制地图,它只指向地图

见:

a = [[1,2],[3,4]]
b = a
b[0][0] = 9
>>> a
[[9, 2], [3, 4]]
您需要为
a
中的每一行制作一份副本(
a[:]
),
a = [[1,2],[3,4]]
b = a
b[0][0] = 9
>>> a
[[9, 2], [3, 4]]
b = [x[:] for x in a]
import copy
b = copy.deepcopy(a)
b[0][0] = 9
>>> a
[[1, 2], [3, 4]]