无法更改数组中的单个元素
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
我正在尝试制作井字游戏,目前我有一个 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