Python 策划游戏,选择什么颜色来猜测
我试图在python中创建一个智囊团游戏 我尝试使用文本框输入来选择颜色,并使用一个阵列支持的网格作为我的网格。 当我输入一种颜色,例如“蓝色”时,整个网格变为蓝色,而我希望它存储输入并让用户选择网格中哪些方块变为蓝色 谢谢你的帮助Python 策划游戏,选择什么颜色来猜测,python,pygame,pycharm,Python,Pygame,Pycharm,我试图在python中创建一个智囊团游戏 我尝试使用文本框输入来选择颜色,并使用一个阵列支持的网格作为我的网格。 当我输入一种颜色,例如“蓝色”时,整个网格变为蓝色,而我希望它存储输入并让用户选择网格中哪些方块变为蓝色 谢谢你的帮助 while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygam
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
elif event.type == pygame.MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
column = pos[0] // (WIDTH + MARGIN)
row = pos[1] // (HEIGHT + MARGIN)
print("Click ", pos, "Grid coordinates: ", row, column)
if event.type == pygame.MOUSEBUTTONDOWN:
if input_rect.collidepoint(event.pos):
active = True
else:
active = False
if event.type == pygame.KEYDOWN:
if active == True:
if event.key == pygame.K_BACKSPACE:
user_text = user_text[0:-1]
else:
user_text += event.unicode
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
user_text = user_text
print(user_text)
if active:
color = color_active
else:
color=color_passive
pygame.draw.rect(screen,color,input_rect,2)
text_surface= base_font.render(user_text,True,(255,255,255))
screen.blit(text_surface, (input_rect.x +5, input_rect.y + 5))
#input_rect.w = max(20, text_surface.get_width() + 10)
for row in range(8):
for column in range(4):
color = WHITE
if user_text == 'blue':
print (grid)
grid[row][column] = 2
color = BLUE
pygame.draw.rect(screen,
color,
[(MARGIN + WIDTH) * column + MARGIN,
(MARGIN + HEIGHT) * row + MARGIN,
WIDTH,
HEIGHT])
if user_text == 'green':
grid[row][column] = 1
color = GREEN
pygame.draw.rect(screen,
color,
[(MARGIN + WIDTH) * column + MARGIN,
(MARGIN + HEIGHT) * row + MARGIN,
WIDTH,
HEIGHT])
感谢您更改色块颜色 从代码判断,您没有单独存储每个块的信息。您需要这样做,因为每个块都有不同的功能(颜色)。如果有某种数据结构来保存每个块的信息,这将非常有帮助。但现在只需将颜色存储在数组中即可
colors = [(0, 0, 0) for i in range(array_width * array_height)]
选择块
存储一组布尔值以指示所选块是否处于活动状态
blocks = [False for i in range(array_width * array_height)]
然后,您可以在每个帧上循环此数组,并将已单击的帧设置为True
(或者切换它,这在我个人看来更好)
然后在块上迭代并设置颜色
array_width = 4
array_height = 8
for row in range(array_width):
for column in range(array_height):
#CHECK IF BLOCK SHOULD BE CHANGED
if blocks[column * array_width + row]:
if user_text == 'blue':
colors[column * array_height + row] = (0, 0, 255)
绘图块
现在这也意味着您必须在不同的循环中进行绘图(即使在问题中的代码中,也不需要编写两次draw rect调用,只需取消第二个循环的缩进)
然后,为了方便起见,您还可以在用户输入蓝色后按enter键将所有块设置回false。有什么问题吗?代码会将整个网格变为蓝色,而不是按住输入并让用户通过单击它来选择要变为蓝色的方块。谢谢,但是当我使用代码时,它会说blocks[row*array\u height+column]=notblocks[row*array\u height+column]#toggle indexer错误:列表索引超出范围谢谢again@LukeWilliams我不确定,因为我无法访问您的代码,或者我误解了您原始代码的意图。从二维数组转换为一维数组的一般规则是
y*width+x
。因此,只需确保其块[y坐标*数组的宽度+x坐标]
。尝试将数组的高度
替换为数组的宽度
,并确保列
表示y
坐标,行
表示x
坐标,对此我可能解释不足,但我能看出问题所在。该代码在单击文本框时获取文本框的坐标,从而使索引超出范围。有可能的解决办法吗?谢谢另外,我可能只是把代码弄乱了一点,所以可能是因为我没有正确地布局代码。文本框的协调不应该影响数组,因为它们完全不同。我不看你的代码就看不出来。最好用你的代码问一个新问题,并对问题进行适当的解释。
array_width = 4
array_height = 8
for row in range(array_width):
for column in range(array_height):
#CHECK IF BLOCK SHOULD BE CHANGED
if blocks[column * array_width + row]:
if user_text == 'blue':
colors[column * array_height + row] = (0, 0, 255)
for row in range(array_width):
for column in range(array_height):
pygame.draw.rect(screen,
#GET THE COLOR AT THAT INDEX
colors[column * array_width + row],
[(MARGIN + WIDTH) * column + MARGIN,
(MARGIN + HEIGHT) * row + MARGIN,
WIDTH,
HEIGHT])