Построение оператора цикла python - PullRequest
0 голосов
/ 27 июня 2018

Я новичок в программировании и уже 3 дня пытаюсь решить проблему. Помощь действительно будет оценена! Я построил игру «камень / бумага / ножницы», и она отлично работает, за исключением одной вещи: когда P2 (игрок 2) вводит что-то отличное от r / p / s, программа сообщает, что ввод неверен, но затем возвращается к P1 (Player 1) для ввода - я хочу, чтобы он продолжался на P2, а не начинался с P1 снова. Теперь я знаю, что есть 100 вероятных способов лучше написать программу, но я хочу исправить это, используя мой текущий код - я предполагаю, что с помощью другого цикла while или чего-то еще, но безуспешно пробовал бесконечные варианты и комбинации. Кто-нибудь, пожалуйста, помогите?

def rps():
    if p1 == 'r' and p2 == 's':
        print('Congrats P1! ')
    elif p1 == 'r' and p2 == 'p':
        print('Congrats P2! ')
    elif p1 == 'p' and p2 == 's':
        print('Congrats P2! ')
    elif p1 == 'p' and p2 == 'r':
        print('Congrats P1! ')
    elif p1 == 's' and p2 == 'r':
        print('Congrats P2! ')
    elif p1 == 's' and p2 == 'p':
        print('Congrats P1! ')
    elif p1 == 'r' and p2 == 'r':
        print('Draw! ')
    elif p1 == 's' and p2 == 's':
        print('Draw! ')
    elif p1 == 'p' and p2 == 'p':
        print('Draw! ')

while True:
    p1 = input('Choice P1? r/p/s (Type "quit" to exit)')
    p1check = p1 == 'r' or p1 == 'p' or p1 == 's'
    if p1 == 'quit':
        print('Bye!')
        break
    elif p1check is False:
        print('Invalid choice P1! ')
        continue

    p2 = input('Choice P2? r/p/s (type "quit" to exit)')
    p2check = p2 == 'r' or p2 == 'p' or p2 == 's'
    if p2 == 'quit':
        print('Chow!!')
        break
    elif p2check is False:
        print('Invalid choice P2! ')
        continue

    rps()

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Здравствуйте и добро пожаловать в чудесный мир программирования:)

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

#this is to avoid a while true and a break instruction
play_the_game = true

while play_the_game:
    #I skip the P1 managing part for more readability

    p2check = false
    #Loop until the player 2 entries match the expected inputs
    while p2check == false:
        p2 = input('Choice P2? r/p/s (type "quit" to exit)')
        p2check = p2 == 'r' or p2 == 'p' or p2 == 's'
        if p2 == 'quit':
            print('Chow!!')
            #play_the_game is now false, the main loop will exit.
            play_the_game = false
            #I added 'p2check = true' to make sure the loop 'while p2check == false:' will exit.
            #You can use a break instruction instead of 'p2check = true' if you prefer
            p2check = true
        elif p2check is False:
            print('Invalid choice P2! ')
0 голосов
/ 27 июня 2018

Я бы порекомендовал поместить вход в цикл.

import sys
p2 = ""
while p2 != 'r' or p2 != 'p' or p2 != 's' or p2 != 'quit'
    p2 = input('Choice P2? r/p/s (type "quit" to exit)')
if p2 == 'quit':
    #Handle quite logic
    sys.exit(0)

Это считается циклом Do While на других языках. Цикл вводится с первого хода, поскольку p2 является empty string. Затем, если пользователь вводит ПРАВИЛЬНЫЙ ввод, цикл прерывается, в противном случае он будет продолжать запрашивать ввод.

То, что у вас сейчас есть, просто продолжает цикл без запроса второго ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...