Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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 康威';s Game of life pygame实现不使用网格副本,不使用numpy_Python_Pygame - Fatal编程技术网

Python 康威';s Game of life pygame实现不使用网格副本,不使用numpy

Python 康威';s Game of life pygame实现不使用网格副本,不使用numpy,python,pygame,Python,Pygame,我正在尝试使用pygame在python中实现Conway的生活游戏。然而,主循环中每个单元的计算似乎都有问题。为了确保每次计算同时完成,我创建了一个网格副本,并在该网格上进行了计算。然而,这个程序不起作用,我也弄不明白。这是我的密码副本 import pygame import time def create_grid(ROWS, COLS, SCREEN): """Creates a grid, sets all values to 0""" assert ROWS >

我正在尝试使用pygame在python中实现Conway的生活游戏。然而,主循环中每个单元的计算似乎都有问题。为了确保每次计算同时完成,我创建了一个网格副本,并在该网格上进行了计算。然而,这个程序不起作用,我也弄不明白。这是我的密码副本

import pygame
import time

def create_grid(ROWS, COLS, SCREEN):
    """Creates a grid, sets all values to 0"""
    assert ROWS > 0, "ROWS must be greater than 0"
    assert COLS > 0, "COLS must be greater than 0"

    grid = []
    for i in range(ROWS):
        grid.append([])
        for j in range(COLS):
            grid[i].append(0)
    return grid

pygame.init()

#SCREEN setup
ScreenHeight = 700
ScreenWidth = 700
SCREEN_COLOR = (20, 20, 20)

SCREEN = pygame.display.set_mode((ScreenWidth, ScreenHeight)) #Create Screen
SCREEN.fill(SCREEN_COLOR)


#Number of ROWS and COLUMNS
ROWS = 30
COLS = 40

#How far will the next cube be placed
SQUARESTEPY = ScreenWidth / ROWS
SQUARESTEPX = ScreenWidth / COLS

GREY = (70, 70, 70)
WHITE = (255, 255, 255)

#draw grid
grid = create_grid(ROWS, COLS, SCREEN)

# grid[0][0] = 1
# grid[1][0] = 1
# grid[0][1] = 1

while True:

    #create a copy of the grid to calculate the condition of all cells at the same time
    copy_of_grid = grid[:]

    for ev in pygame.event.get():
        #Quit the game
        if ev.type == pygame.QUIT:
            pygame.quit()

        #if mouse click draws or erases a cell
        if pygame.MOUSEBUTTONDOWN == ev.type:
            posX, posY = pygame.mouse.get_pos()
            print(posX, posY)
            posX, posY = int(posX / SQUARESTEPX), int(posY / SQUARESTEPY)
            grid[posY][posX] = 1 - grid[posY][posX]

    #calculate conway's rules and draw each cell
    for y in range(ROWS):
        for x in range(COLS):
            neighbors = copy_of_grid[(y - 1) % ROWS][(x - 1) % COLS] + \
                        copy_of_grid[y       % ROWS][(x - 1) % COLS] + \
                        copy_of_grid[(y + 1) % ROWS][(x - 1) % COLS] + \
                        copy_of_grid[(y - 1) % ROWS][x       % COLS] + \
                        copy_of_grid[(y + 1) % ROWS][x       % COLS] + \
                        copy_of_grid[(y - 1) % ROWS][(x + 1) % COLS] + \
                        copy_of_grid[y       % ROWS][(x + 1) % COLS] + \
                        copy_of_grid[(y + 1) % ROWS][(x + 1) % COLS]
            #print(x, y, "neighbors: {}, ON: {}".format(neighbors, grid[y][x]))

            #A dead cell surrounded by exactly 3 cells will revive
            if copy_of_grid[y][x] == 0 and (neighbors == 3 or neighbors == 2):
                grid[y][x] = 1

            #A living cell surrounded by less than 2 or more than 3 neighbors wil die
            elif grid[y][x] == 1 and (neighbors < 2 or neighbors > 3):
                grid[y][x] = 0

            #paint
            if grid[y][x] == 1:
                pygame.draw.rect(SCREEN, WHITE, (SQUARESTEPX * x, SQUARESTEPY * y, SQUARESTEPX, SQUARESTEPY))
            else:
                pygame.draw.rect(SCREEN, SCREEN_COLOR , (SQUARESTEPX * x, SQUARESTEPY * y, SQUARESTEPX, SQUARESTEPY))


    pygame.display.flip()
    time.sleep(0.1)

pygame.quit()

导入pygame
导入时间
def创建网格(行、列、屏幕):
“”“创建网格,将所有值设置为0”“”
断言行>0,“行必须大于0”
断言COLS>0,“COLS必须大于0”
网格=[]
对于范围内的i(行):
grid.append([])
对于范围内的j(COLS):
网格[i]。追加(0)
回流栅
pygame.init()
#屏幕设置
屏幕高度=700
屏幕宽度=700
屏幕颜色=(20,20,20)
SCREEN=pygame.display.set_模式((屏幕宽度,屏幕高度))35;创建屏幕
屏幕填充(屏幕颜色)
#行数和列数
行数=30
科尔斯=40
#下一个立方体将放置多远
SQUARESTEPY=屏幕宽度/行数
SQUARESTEPX=屏幕宽度/列
灰色=(70,70,70)
白色=(255,255,255)
#绘制网格
网格=创建网格(行、列、屏幕)
#网格[0][0]=1
#网格[1][0]=1
#网格[0][1]=1
尽管如此:
#创建网格副本以同时计算所有单元格的条件
复制网格的网格=网格[:]
对于pygame.event.get()中的ev:
#退出游戏
如果ev.type==pygame.QUIT:
pygame.quit()
#如果鼠标单击绘制或删除单元格
如果pygame.MOUSEBUTTONDOWN==ev.type:
posX,posY=pygame.mouse.get_pos()
打印(posX、posY)
posX,posY=int(posX/SQUARESTEPX),int(posY/SQUARESTEPY)
grid[posY][posX]=1-grid[posY][posX]
#计算康威规则并绘制每个单元格
对于范围内的y(行):
对于范围内的x(COLS):
邻居=复制网格[(y-1)%ROWS][(x-1)%COLS]+\
复制网格[y%行][(x-1)%COLS]+\
复制网格[(y+1)%ROWS][(x-1)%COLS]+\
复制网格[(y-1)%ROWS][x%COLS]+\
复制网格[(y+1)%ROWS][x%COLS]+\
复制网格[(y-1)%ROWS][(x+1)%COLS]+\
复制网格[y%行][(x+1)%COLS]+\
复制网格[(y+1)%ROWS][(x+1)%COLS]的\u
#打印(x,y,“邻居:{},在:{}上)。格式(邻居,网格[y][x]))
#一个死掉的细胞被3个细胞包围会复活
如果复制网格[y][x]=0和(邻居==3或邻居==2):
网格[y][x]=1
#被不到2个或3个以上邻居包围的活细胞将死亡
elif网格[y][x]==1和(邻域<2或邻域>3):
网格[y][x]=0
#油漆
如果网格[y][x]==1:
pygame.draw.rect(屏幕,白色,(SQUARESTEPX*x,SQUARESTEPY*y,SQUARESTEPX,SQUARESTEPY))
其他:
pygame.draw.rect(屏幕,屏幕颜色,(SQUARESTEPX*x,SQUARESTEPY*y,SQUARESTEPX,SQUARESTEPY))
pygame.display.flip()
睡眠时间(0.1)
pygame.quit()

复制网格=网格[:]
不是网格的副本。它是外部列表的浅拷贝(请参阅)。但是列表
copy\u of_grid
中的元素仍然与列表
grid
中的元素相同
必须在循环中复制嵌套列表:

copy\u of_grid=[]
对于网格中的行:
复制\u网格的\u.append(第[:]行)