如何修复Python中的while循环重复

时间:2019-07-05 03:08:20

标签: python python-3.x while-loop

我正在尝试使用while循环在两个用户之间交替轮换,但是我的代码被卡在“ while first_player_move is True:”循环中。我该如何解决这个问题,以使我的while循环在两个玩家的回合中都能通过。

我尝试在各个位置添加“ continue”和“ break”,并尝试将布尔值切换为最大值,但似乎无济于事。

word_fragment = ''
        first_player_move = True
        while True:
            while first_player_move is True:
                added_letter = input('Which single letter would you like to add to the fragment? ')
                word_fragment += added_letter
                print('The current word fragment is: ' + word_fragment)
                print('It is now ' + player2_name + "'s turn.")
                if word_fragment in open('data.txt').read() and len(word_fragment) > 3:
                    print('I am sorry, you just lost. ' + player2_name + ' is the winner!')
                    # call a function to end the game
                    break

            while first_player_move is False:
                added_letter = input('Which single letter would you like to add to the fragment? ')
                word_fragment += added_letter
                print('The current word fragment is: ' + word_fragment)
                print('It is now ' + player1_name + "'s turn.")
                if word_fragment in open('data.txt').read() and len(word_fragment) > 3 :
                    print('I am sorry, you just lost. ' + player1_name + ' is the winner!')
                    # call a function to end the game
                    break

我希望输出结果贯穿每个玩家回合并最终打印“现在是“下一个玩家回合””,但是它将继续为下一玩家回合打印相同的名称,这告诉我代码被困在两个while循环的第一个循环中。

3 个答案:

答案 0 :(得分:0)

由于first_player_move并未更改为false,所以当内部循环结束时,外部循环将开始新的循环并再次调用内部循环。

顺序流为:

  1. 进入第一个循环=> True 非常正确
  2. 进入内部循环=> first_player_moveTrue 非常正确
  3. 先执行内部程序段,然后breaks并进入第一个循环并重复上述步骤

  4. 进入第一个循环=> True 很正确

  5. 进入内部循环=> first_player_moveTrue 是如此正确

答案 1 :(得分:0)

您永远不会在第一个循环中将first_player_move设置为false(也不要在第二个循环中将其设置为true)。

我建议将打印内容(“现在为'+ player2_name +“轮到我了。”)移到您的if中,然后进行以下修改:

if word_fragment in open('data.txt').read() and len(word_fragment) > 3:
    print('I am sorry, you just lost. ' + player2_name + ' is the winner!')
    # call a function to end the game
    break
else:
    print('It is now ' + player2_name + "'s turn.")
    first_player_move = False

与第二个播放器循环类似的mod。

我还要确认您的赢/输情况。他们用我的方式阅读您的代码,如果有人负责创建data.txt中包含的片段,并且该片段大于3个字符,则他们会丢失。这是正确的吗?

如果是这样,您还可以进行一些优化以缩小data.txt的大小。去除所有不超过3个字符的单词,即可删除len(word_fragment)> 3约束。

我希望您会遇到又一个问题……如果玩家遇到一个很大的片段而仍然不匹配data.txt中的任何内容,会发生什么?

您可能要考虑创建平局条件。例如。在主“ while True”循环的最后,测试“长度”> data.txt中最长的单词,并称其为平局。

其他样式建议。玩家回合无需使用循环:

  • 将整个内容保留在大的“ while True”循环中:
  • 提示输入player1
  • 测试玩家1丢失(即data.txt中的片段)
  • 提示输入player2
  • 测试玩家2的损失
  • 测试片段长度>最大长度
  • 回到循环顶部
  • 打破玩家输球或最大片段长度
  • 无需切换first_player_move是/否

如果仅凭一小步的quick_then_test代码就能获得成功,并在每次通过时在玩家名称之间切换,则奖励积分。

答案 2 :(得分:0)

以下方法可能会更好。目的是尝试避免重复代码,而是使用变量来提供帮助:

word_fragment = ''
first_player_move = True

while True:
    player_name = player1_name if first_player_move else player2_name
    print(f"It is now {player_name}'s turn.")

    added_letter = input(f'{player_name}: Which single letter would you like to add to the fragment? ')
    word_fragment += added_letter

    print('The current word fragment is: ', word_fragment)

    if word_fragment in open('data.txt').read() and len(word_fragment) > 3:
        print('I am sorry, you just lost. ' + player2_name + ' is the winner!')
        break  # call a function to end the game

    first_player_move = not first_player_move

这使用player_name来保存当前玩家的名字,并且first_player_move在每个循环中在TrueFalse之间切换。