Python 康纳威的生活问题游戏

Python 康纳威的生活问题游戏,python,tkinter,Python,Tkinter,这是我对康威的生命模拟游戏的粗略实现 LIVE = 1 DEAD = 0 def board(canvas, width, height, n): for row in range(n+1): for col in range(n+1): canvas.create_rectangle(row*height/n,col*width/n,(row+1)*height/n,(col+1)*width/n,width=1,fill='black',ou

这是我对康威的生命模拟游戏的粗略实现

LIVE = 1
DEAD = 0

def board(canvas, width, height, n):
    for row in range(n+1):
        for col in range(n+1):
            canvas.create_rectangle(row*height/n,col*width/n,(row+1)*height/n,(col+1)*width/n,width=1,fill='black',outline='green')                      

n = int(raw_input("Enter the dimensions of the board: "))
width = n*25
height = n*25

from Tkinter import *
import math

window=Tk()
window.title('Game of Life')

canvas=Canvas(window,width=width,height=height,highlightthickness=0)
canvas.grid(row=0,column=0,columnspan=5)

board = [[DEAD for row in range(n)] for col in range(n)]

rect = [[None for row in range(n)] for col in range(n)]


for row in range(n):
    for col in range(n):      
        rect[row][col] = canvas.create_rectangle(row*height/n,col*width/n,(row+1)*height/n,(col+1)*width/n,width=1,fill='black',outline='green') 

#canvas.itemconfigure(rect[2][3], fill='red') #rect[2][3] is rectangle ID

#print rect

f = open('filename','r') #filename is whatever configuration file is chosen that gives the step() function to work off of for the first time
for line in f:
    parsed = line.split()
    print parsed
    if len(parsed)>1:
        row = int(parsed[0].strip())
        col = int(parsed[1].strip())
        board[row][col] = LIVE
        board[row][col] = canvas.itemconfigure(rlist[row][col], fill='red')        

def surrounding(row,col):
    count = 0
    if board[(row-1) % n][(col-1) % n] == LIVE:
        count += 1
    if board[(row-1) % n][col % n] == LIVE:
        count += 1
    if board[(row-1) % n][(col+1) % n] == LIVE:
        count += 1
    if board[row % n][(col-1) % n] == LIVE:
        count += 1
    if board[row % n][(col+1) % n] == LIVE:
        count += 1
    if board[(row+1) % n][(col-1) % n] == LIVE:
        count +=1
    if board[(row+1) % n ][col % n] == LIVE:
        count += 1
    if board[(row+1) % n][(col+1) % n] == LIVE:
        count += 1
    print count
    return count

surrounding(1,1)


def round():
    board_copy = board
    for row in range(n):
        for col in range(n):
            if surrounding(row,col) == 3:
                board_copy[row][col] = LIVE
                board_copy[row][col] = canvas.itemconfigure(rect[row][col],fill='red')
            elif surrounding(row,col) > 3 or getNeighbors(row,col) < 2:
                board_copy[row][col] = DEAD
                board_copy[row][col] = canvas.itemconfigure(rect[row][col],fill='black')
    board = board_copy

def start():
    global alarm
    alarm = window.after(500,round)

def stop():
    window.after.cancel(alarm)
因此,如果我想在CountNeights函数中获得8,如果它在第一轮中有效,我使用的配置文件是:

0 0
0 1
0 2
1 0
1 2
2 0
2 1
2 2
我假设board_copy=board足以制作副本

否,线路板\u copy=线路板不足。这只会将board_副本绑定到与board完全相同的列表,即board_副本中更改的所有内容也会在board中更改

相反,您可以使用复制模块中的功能:

或者使用列表理解创建嵌套列表的深度副本:

board_copy = [[x for x in row] for row in board]
在方法末尾使用board=board\u copy是可以的,因为这里您只想将新的板绑定到板上。但是,请注意,您还需要在方法顶部添加全局板以访问全局定义的板

另外,请注意,您同时定义了功能板def board…:和全局变量board=[…]。后者将遮蔽前者,即您将无法使用电路板功能。您应该将该功能重命名为,例如def draw_board

您的代码可能会有更多问题,但我无法执行,因为它似乎不完整,在哪里调用start?我不知道“文件名”的内容。

在最后做board=board\u copy可以用副本替换原始电路板吗?或者在让副本替换原始电路板之前,我还需要使用复制模块来编写board=[[x代表x代表x代表x代表x代表行]代表board\u copy代表行吗?稍后将在一个按钮中调用Start。配置文件的文件名只是一个文本文件,其中有几行成对的线,这些线表示所创建的电路板上的矩形。
import copy
board_copy = copy.deepcopy(board)
board_copy = [[x for x in row] for row in board]