Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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 康威';PyGame中的生命游戏未生成正确的模式_Python_Pygame_Conways Game Of Life - Fatal编程技术网

Python 康威';PyGame中的生命游戏未生成正确的模式

Python 康威';PyGame中的生命游戏未生成正确的模式,python,pygame,conways-game-of-life,Python,Pygame,Conways Game Of Life,我正在尝试使用pygame用python制作康威的生活游戏。我不明白为什么,但它产生的模式是远远不够的。我已经把代码看了一百万遍,看不出有什么错 这里是一个屏幕截图的一代人 这是游戏的完整代码 import pygame, sys from pygame.locals import * from random import randint import numpy #inititalize pygame.init() clock = pygame.time.Clock() #constan

我正在尝试使用pygame用python制作康威的生活游戏。我不明白为什么,但它产生的模式是远远不够的。我已经把代码看了一百万遍,看不出有什么错

这里是一个屏幕截图的一代人

这是游戏的完整代码

import pygame, sys
from pygame.locals import *
from random import randint
import numpy

#inititalize
pygame.init()
clock = pygame.time.Clock()

#constants
FPS = 10
BLACK = (0,0,0)
RED = (255,0,0)
GREY = (30,30,30)
SCREENX = 640
SCREENY = 480
CELLSIZE = 10
HEIGHT = SCREENY/CELLSIZE
WIDTH = SCREENX/CELLSIZE

#set up window
window = pygame.display.set_mode((SCREENX, SCREENY))
pygame.display.set_caption('Game of Life')
window.fill(BLACK)

#generate random seed
cells = numpy.zeros((WIDTH,HEIGHT), dtype=numpy.int)
for x in range(0,WIDTH):
    for y in range(0,HEIGHT):
        #0 is a dead cell, 1 is an alive cell
        cells[x][y] = randint(0,1)

def findNeighbors(grid, x, y):
    if 0 < x < len(grid) - 1:
        xi = (0, -1, 1)
    elif x > 0:
        xi = (0, -1)
    else:
        xi = (0, 1)

    if 0 < y < len(grid[0]) - 1:
        yi = (0, -1, 1)
    elif y > 0:
        yi = (0, -1)
    else:
        yi = (0, 1)

    for a in xi:
        for b in yi:
            if a == b == 0:
                continue
            yield grid[x + a][y + b]

def update(grid, x, y):
    #determine num of living neighbors
    neighbors = findNeighbors(cells,x,y)
    alive = 0
    for i in neighbors:
        if i == 1:
            alive+=1

    #if current cell is alive
    if grid[x][y] == 1:
        #kill if less than 2 or more than 3 alive neighbors
        if (alive < 2) or (alive > 3):
            return 0
        else:
            return 1
    #if current cell is dead
    elif grid[x][y] == 0:
        #make alive if 3 alive neighbors
        if alive == 3:
            return 1
        else:
            return 0

#main loop
while True:

    #check if user wants to exit
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    #update cells
    for x in range(0,WIDTH):
        for y in range(0,HEIGHT):
            cells[x][y] = update(cells,x,y)

    #draw grid
    for x in range(0,SCREENX,CELLSIZE):
        for y in range(0,SCREENY,CELLSIZE):
            #if cell is alive
            if cells[x/CELLSIZE][y/CELLSIZE] == 1:
                #draw red square
                pygame.draw.rect(window, RED, [x, y, CELLSIZE, CELLSIZE])
            else:
                #draw black square
                pygame.draw.rect(window, BLACK, [x, y, CELLSIZE, CELLSIZE])
            #draw square border
            pygame.draw.rect(window, GREY, [x, y, CELLSIZE, CELLSIZE], 1)

    #draw updates
    pygame.display.update()

    #generations per second
    clock.tick(FPS)
import pygame,sys
从pygame.locals导入*
从随机导入randint
进口numpy
#初始化
pygame.init()
clock=pygame.time.clock()
#常数
FPS=10
黑色=(0,0,0)
红色=(255,0,0)
灰色=(30,30,30)
屏幕X=640
屏幕Y=480
单元大小=10
高度=屏幕/单元大小
宽度=屏幕X/单元大小
#设置窗口
window=pygame.display.set_模式((SCREENX,SCREENY))
pygame.display.set_标题(‘生命的游戏’)
窗口填充(黑色)
#生成随机种子
cells=numpy.zeros((宽度、高度),dtype=numpy.int)
对于范围内的x(0,宽度):
对于范围(0,高度)内的y:
#0是死单元格,1是活单元格
单元格[x][y]=randint(0,1)
def findNeighbors(网格,x,y):
如果00:
席=(0,1)
其他:
席=(0, 1)
如果00:
yi=(0,-1)
其他:
yi=(0,1)
对于xi中的a:
对于易文b:
如果a==b==0:
持续
收益率网格[x+a][y+b]
def更新(网格,x,y):
#确定活邻居的数量
邻域=findNeighbors(单元格,x,y)
活动=0
对于我的邻居:
如果i==1:
活动+=1
#如果当前单元格处于活动状态
如果网格[x][y]==1:
#如果少于2个或多于3个活着的邻居,则杀死
如果(活动<2)或(活动>3):
返回0
其他:
返回1
#如果当前单元格已死亡
elif网格[x][y]==0:
#如果有三个活着的邻居,就让他们活着
如果活动==3:
返回1
其他:
返回0
#主回路
尽管如此:
#检查用户是否要退出
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
sys.exit()
#更新单元格
对于范围内的x(0,宽度):
对于范围(0,高度)内的y:
单元格[x][y]=更新(单元格,x,y)
#绘制网格
对于范围内的x(0,屏幕x,手机大小):
对于范围内的y(0,屏幕,单元格大小):
#如果细胞是活的
如果单元格[x/CELLSIZE][y/CELLSIZE]==1:
#画红方块
pygame.draw.rect(窗口,红色,[x,y,CELLSIZE,CELLSIZE])
其他:
#画黑方块
pygame.draw.rect(窗口,黑色,[x,y,CELLSIZE,CELLSIZE])
#画正方形边框
pygame.draw.rect(窗口,灰色,[x,y,CELLSIZE,CELLSIZE],1)
#绘制更新
pygame.display.update()
#每秒世代数
时钟滴答声(FPS)

我认为问题不在于findNeighbors函数,因为我是从stackoverflow答案中得到它的。因此,我假设问题出在更新功能中,但根据游戏规则,我看不出逻辑哪里是错误的。

我怀疑这就是问题所在:

cells[x][y] = update(cells,x,y)
您只有一个网格,在您仍然使用它进行计算时,您正在更新它。第n+1代应该只考虑来自第n代的信息,而目前您已经混合了来自n和n+1代的信息。最后,您将看到左侧和上方邻居的新值,以及右侧和下方邻居的旧值,因为它们尚未重新计算

例如,以这个模式(其中#表示“活着”)为例:

这应该是:

。。。但事实上,你最终会(我认为):

当我们计算右上角时,它有三个邻居。左中间在计算时有2个活动邻居;中间有4个,中间有2个。在计算时,最下面一行没有三个邻居,因此它保持不变


通常,康威的Life实现要么为每一代计算一个全新的网格,要么在两个网格之间切换,从另一个网格计算所有网格。

我怀疑这就是问题所在:

cells[x][y] = update(cells,x,y)
您只有一个网格,在您仍然使用它进行计算时,您正在更新它。第n+1代应该只考虑来自第n代的信息,而目前您已经混合了来自n和n+1代的信息。最后,您将看到左侧和上方邻居的新值,以及右侧和下方邻居的旧值,因为它们尚未重新计算

例如,以这个模式(其中#表示“活着”)为例:

这应该是:

。。。但事实上,你最终会(我认为):

当我们计算右上角时,它有三个邻居。左中间在计算时有2个活动邻居;中间有4个,中间有2个。在计算时,最下面一行没有三个邻居,因此它保持不变


通常,康威的Life实现要么为每一代计算一个全新的网格,要么在两个网格之间切换,从另一个网格计算所有网格。

在Life游戏中,您无法迭代更新当前屏幕。每一个更新的单元都会立即影响它的相邻单元,从右边到下一行。在另一个缓冲区中创建更新的屏幕以防止出现这种情况。我没有时间进行测试,但看起来您在进行计数时正在更改
单元格
数组。如果我没记错的话,您需要根据原始的
单元格
数组确定修改。在生活游戏中,您无法迭代更新当前屏幕。每一个更新的单元都会立即影响它的相邻单元,从右边到下一行。在另一个缓冲区中创建更新的屏幕以防止出现这种情况。我没有时间测试它
.#.
.#.
.#.
.##
#.#
... // Bottom-middle only has one live neighbour at computation time