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

Я попытался добавить «продолжить» и «разбить» в разных местах и попытался переключить логические значения вверх, но, похоже, ничего не работает.

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.

0
user11699723 5 Июл 2019 в 06:08

2 ответа

Вы никогда не устанавливаете 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

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

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

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

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

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

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

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

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

0
Naptha 5 Июл 2019 в 04:16

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

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
Martin Evans 5 Июл 2019 в 07:31