如何在Python中创建自动化的Tetris bot?

时间:2014-03-18 02:36:19

标签: python pygame artificial-intelligence neural-network tetris

所以我在python中编写了一个tetris bot,它使用pygame事件来响应键盘输入。现在我正在尝试创建一个AI来玩这个游戏。因此,我想基本确定最佳动作是什么,给出一块和一块板。我想迭代每一个可能的移动,并评估板状态(我有一个方法来评估给定板的好坏),并选择创建最佳板状态的移动。我目前的主要方法如下。

def main():
    pygame.init()
    pygame.mixer.music.load("music.ogg")
    #pygame.mixer.music.play(-1)
    pygame.key.set_repeat(200,100)
    game_state = state.GameState()

    while True:
        game_state.apply_gravity()
        game_state.check_collision(place_if_collision=True)
        game_state.time += 1
        if game_state.hardDrop:
            continue
        game_state.check_for_full_rows()
        game_state.print_state()
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == QUIT:
                terminate()
            elif event.type==KEYDOWN:
                if event.key==K_ESCAPE:
                    terminate()
                if event.key==K_LEFT:
                    game_state.save_state()
                    game_state.piece_x -= 1
                    game_state.check_collision()
                if event.key==K_RIGHT:
                    game_state.save_state()
                    game_state.piece_x += 1
                    game_state.check_collision() 
                if event.key==K_DOWN:
                    game_state.save_state()
                    game_state.piece_y += 1
                    game_state.check_collision(place_if_collision=True)
                if event.key==K_UP:
                    game_state.save_state()
                    game_state.curr_piece.rotate_cw()
                    game_state.check_collision()
                    game_state.print_state()
                if event.key==K_SPACE:
                    game_state.hardDrop = True

如何在不实际修改状态/重写一堆代码的情况下弄清楚状态会是什么样子?我可以根据需要提供更多代码。这样做的目的是,我可以使用遗传算法训练神经网络,玩俄罗斯方块。

1 个答案:

答案 0 :(得分:2)

非常有趣和独特的问题,您不能只创建独立副本并在该副本上运行测试并在完成后将其删除。

from copy import deepcopy

#some other code...

temp_state = deepcopy(original_state)

然后,您在temp_state上运行测试,并在完成使用后: del temp_state

至于你的第二个问题,你可以让机器人分析一个部件的位置,一旦它达到2个街区或者解决你的问题。或者,你可以在顶部(屏幕之外)看到一些不可见的额外线条,但玩家无法看到,但机器人可以用来做出决定。

此外,我确信您已经完成了此操作,您可以使用 itertools 来创建字符串列表,例如lllllus,llllluus(引用您的评论)。具体而言,请尝试 itertools.product itertools.combinations