陷入无限循环,无法弄清楚为什么 - 蟒蛇

时间:2014-03-21 23:01:38

标签: python-3.x while-loop

当运行此代码时,它应该在播放器和计算机之间交替,但是当计算机轮到时,它才会完成游戏。我已经反复检查了缩进级别,但我找不到问题。

2 个答案:

答案 0 :(得分:2)

你写这篇文章的方式让我们很难弄清楚控制流程是如何进行的。有很多重复,这对游戏来说并不是必需的,这增加了复杂性。一个主要的事情是你有四个位置,你要求玩家是否重启游戏。如果你只是确保拥有一次,那么你已经可以使一切变得更容易了。

你会注意到的第一件事是结构是这样的:

while winFlag == False:
    # player move
    while sticksOnBoard != 0:
        # evaluate winner
        # AI move
        # evaluate winner

因此,除非任何一名球员已经通过低于0杆获胜,否则人工智能的举动将一次又一次地发生,直到有人获胜。但玩家永远不会有机会再次移动。相反,你可能想要完全删除你的winFlag,因为当游戏结束时没有更多的支持。所以你只需要这样:

while sticksOnBoard > 0:
    # player move
    if sticksOnBoard <= 0:
        # evaluate winner
    # AI move
# evaluate winner

或者要删除评估的重复,您只需切换活动播放器:

isPlayerMove = True
while sticksOnBoard > 0:
    if isPlayerMove:
        # player move
    else:
        # AI move
    isPlayerMove = not isPlayerMove # toggle current player
# evaluate winner

这就是我制作这款游戏​​的方法,减少了所有重复:

def playerVsAiGame (sticksOnBoard):
    # main game loop
    while True:
        sticks = sticksOnBoard
        isPlayerMove = True

        # only ask when there are more than 3 left; otherwise the current
        # player can just choose the remaining number and win
        while sticks > 3:
            print('There are {} sticks on the board.'.format(sticks))
            if isPlayerMove:
                move = int(input('How many sticks would you like to take? (1-3) '))
            else:
                # the computer just chooses randomly between 1, 2, and 3 sticks
                # this is where you could add additional game logic to make the AI
                # smarter
                move = random.choice((1, 2, 3))
                print('The computer takes {} sticks.'.format(move))

            sticks -= move
            isPlayerMove = not isPlayerMove

        # the current player wins
        print('There are {} sticks on the board.'.format(sticks))
        if isPlayerMove:
            print('You win!')
        else:
            print('The computer wins!')

        # break the main loop unless the player wants to play again
        if input('Play again? Yes (1) / No (0) ').lower() not in ('1', 'yes', 'y'):
            break

答案 1 :(得分:0)

我认为你在这段代码中遇到了一些错误。

您永远不会在内循环中请求用户输入。

检查sticksOnBoard是否小于0,并检查它是否为1。 但是,在大多数情况下,sticksOnBoard只会有更大的值,因此, while sticksOnBoard != 0将循环直到您的游戏结束。

与此同时,您的基本人工智能将不断从董事会中抽出棍棒,而无需用户做任何事情。

你似乎并不熟悉编程(这没有问题,每个人都曾经开始)。这就是为什么我建议你拿笔和纸一步一步地运行你的功能的示例。 这样就很明显为什么程序不能按你的意愿运行。