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

我试图在python中创建一个智囊团游戏

我尝试使用文本框输入来选择颜色,并使用一个阵列支持的网格作为我的网格。 当我输入一种颜色,例如“蓝色”时,整个网格变为蓝色,而我希望它存储输入并让用户选择网格中哪些方块变为蓝色

谢谢你的帮助

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])