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