Как исправить повторяющийся цикл while в Python - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь использовать цикл while для чередования поворотов между двумя пользователями, но мой код застревает в цикле «while first_player_move равно True:». Как я могу это исправить, чтобы мой цикл проходил по ходам обоих игроков?

Я пытался добавить '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 голосов
/ 05 июля 2019

Вы никогда не устанавливаете для first_player_move значение false в первом цикле (также никогда не устанавливаете для него значение true во втором цикле).

Я рекомендую переместить печать («Это сейчас» + player2_name + "'s повернуть. ") в ваше 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

Сравнимый мод с петлей 2-го игрока.

Я также хотел бы подтвердить ваши условия выигрыша / проигрыша.Они читают ваш код, если кто-то отвечает за создание фрагмента, который содержится в data.txt, а фрагмент больше 3 символов, они проигрывают.Это правильно?

Если это так, есть также небольшая оптимизация, которую вы можете сделать, чтобы уменьшить размер data.txt.Вычеркните все слова, которые состоят из 3 или менее символов, и вы можете удалить ограничение len (word_fragment)>> 3.

Еще одна проблема, с которой вы столкнетесь ... что происходит в случае, когда игрокиполучить доступ к значительному фрагменту и еще ничего не сопоставить в data.txt?

Возможно, вы захотите подумать о создании условия связывания.Например, в конце вашего основного цикла «while True» проверьте длину> самого длинного слова в data.txt и назовите его связующим.

Дальнейшее предложение по стилю.Нет необходимости использовать петли для ходов игрока:

  • Держите все это в своем большом цикле "True":
  • Подсказка для ввода player1
  • Тест на потерю player1 (то есть фрагмент в data.txt)
  • Запрос на ввод player2
  • Тест на потерю player2
  • Тест на длину фрагмента> максимальная длина
  • Вернуться к началу цикла
  • перерыв при проигрыше игрока или максимальной длине фрагмента
  • нет необходимости переключать first_player_move True / False

Бонусные баллы, если вы можетеобойтись только одним куском кода prompt_then_test и переключаться между именами игроков на каждом проходе.

0 голосов
/ 05 июля 2019

Следующий подход может работать лучше. Цель состоит в том, чтобы попытаться избежать повторения кода и вместо этого использовать переменные, чтобы помочь:

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 переключается между True и False для каждого цикла.

0 голосов
/ 05 июля 2019

Поскольку first_player_move не изменяется на false, когда внутренний цикл заканчивается, внешний запускает новый цикл и снова вызывает внутренний.

Последовательный поток:

  1. Введите первый цикл => True # так верно
  2. Введите внутренний цикл => first_player_move равно True # так верно
  3. Выполнить внутренний блок, затем breaks и перейти к первому циклу и повторить шаги, описанные выше

  4. Введите первый цикл => True # так верно

  5. Введите внутренний цикл => first_player_move равно True # так верно
...