无法更改数组中的单个元素

Cannot Change Individual Elements in an Array

我正在尝试制作井字游戏,目前我有一个 3x3 平铺 board 网格来表示游戏。当用户单击一个正方形时,程序将 board[x][y] 设置为 1

board = [[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

不幸的是,每当我单击一个图块时,它似乎都会忽略我输入的任何 x 值;每次我单击一个图块时,它都会设置整个 而不是单个图块。所以,基本上,如果我将 board[0][y] 设置为 1,它会将 board[0][y]board[1][y]board[2][y] 全部设置为 1

我试图创建一个最小的可重现示例,但是当我取出绘图函数 game 时(并手动将 board 变量设置为 0 的 3x3 网格)程序未能单击本应是磁贴的内容后,更改 board 的最后两行。

# tic-tac-toe

import pygame
windowsize = (300, 300)
length = 3 # length, width of the array
width = 3
kx = windowsize[0] // length # the size of a tile
ky = windowsize[1] // length
pygame.init()
win = pygame.display.set_mode(windowsize)
win.fill((255,255,255))
inPlay = True
debug = True
board = []
firstrun = True

if debug:
    width = length * 2
    length = 3

# this function takes the board and draws the game.
# it's purpose is solely for visuals. 
def game(flash):
    # Initialize grid for first time
    global board
    if flash == True:
        # Fill board with 0s
        board = []
        line = []
        for i in range(length):
            line.append(0)
        for i in range(length):
            board.append(line)

    # Draw grid. 
    for i in range(length):
        for j in range(length):
            # Draw X/O tiles
            r = pygame.Rect((i * kx + 1, j * ky + 1), (kx - 2, ky - 2))
            colour = (255,255,255)
            if board[i][j] == 1:
                colour = (0,0,0)
            #elif board[i][j] == 2:
            #    colour = (255,255,0)
            pygame.draw.rect(win, colour, r)
            #pygame.draw.line(win, (255,0,0), (i * kx, 0), (i * kx, 2 ** 20), width)
            #pygame.draw.line(win, (255,0,0), (0, i * ky), (2 ** 20, i * ky), width)
            
    
while inPlay:
    pygame.time.delay(10)
    win.fill((5,255,255))
    game(firstrun)
    firstrun = False
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            inPlay = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                inPlay = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            clickPos = pygame.mouse.get_pos()
            
            # find tile coordinates by dividing by 100
            x = clickPos[0] // kx 
            y = clickPos[1] // ky
            
            board[0][y] = 1
            
            if debug:
                print(str(x), str(y))
                print (board)
                print(clickPos)
    pygame.display.update()
pygame.quit()

实际上,您创建的不是网格,而是同一行的引用列表。要创建网格,您需要 2 个嵌套循环:

def game(flash):
    # Initialize grid for first time
    global board
    if flash == True:
        # Fill board with 0s
        board = []  
        for i in range(length):
            line = []   
            for j in range(length):
                line.append(0)
            board.append(line)

    # [...]

或更短(参见 List Comprehensions):

def game(flash):
    # Initialize grid for first time
    global board
    if flash == True:
        # Fill board with 0s
        board = [[0] * length for _ in range(length)]  

    # [...]

此外,您的代码中似乎有错别字:

board[0][y] = 1

board[x][y] = 1