*Python Слишком много if-операторов выполняется - PullRequest
0 голосов
/ 10 июля 2020

Сейчас я проверяю свои навыки, делая игру «камень-ножницы-бумага». Я столкнулся с проблемой.

Часть кода: (Я знаю, что это довольно много для проблемы, но посмотрите ближе к концу, где находится большинство похожих операторов сервалов и где также появляются # Win и # Lose. )

import random
computerScore = 0
Score = 0
print("> Type \"help\" for help. <")
print("---")
print("Loading Rock Paper Scissors...")
while True:
    guesses = [
        "rock", "paper", "scissors"
    ]
    guessesShortcuts = [
        "r", "p", "s"
    ]
    cmd = input("> ")
    cmd = cmd.lower()
    if cmd == "help":
        print("Help - Opens this menu.\nQuit - Quits and stops the game.\nRPS - Starts a classic game of Rock Paper Scissors.")
    if cmd == "rps" or cmd == "rock paper scissors":
        Guess = str(input(f"Choose your weapon. {guesses[0].capitalize()}, {guesses[1].capitalize()}, or {guesses[2].capitalize()}? "))
        Guess = Guess.lower()
        computerGuess = random.choice(guesses)
        if Guess == guesses[0] or Guess == guesses[1] or Guess == guesses[2]:
            if Guess == computerGuess:
                print("It's a tie!")
                print(f"{Score} / {computerScore}")
            # Win
            if Guess == guesses[0] or Guess == guessesShortcuts[0] and computerGuess == guesses[2]:
                print(f"{computerGuess.capitalize()}.")
                print("You win!")
                Score += 1
                print(f"{Score} / {computerScore}")
            if Guess == guesses[1] or Guess == guessesShortcuts[1] and computerGuess == guesses[0]:
                print(f"{computerGuess.capitalize()}.")
                print("You win!")
                Score += 1
                print(f"{Score} / {computerScore}")
            if Guess == guesses[2] or Guess == guessesShortcuts[2] and computerGuess == guesses[1]:
                print(f"{computerGuess.capitalize()}.")
                print("You win!")
                Score += 1
                print(f"{Score} / {computerScore}")
            # Lose
            if Guess == guesses[2] or Guess == guessesShortcuts[2] and computerGuess == guesses[0]:
                print(f"{computerGuess.capitalize()}.")
                print("You win!")
                Score += 1
                print(f"{Score} / {computerScore}")
            if Guess == guesses[0] or Guess == guessesShortcuts[0] and computerGuess == guesses[1]:
                print(f"{computerGuess.capitalize()}.")
                print("You win!")
                Score += 1
                print(f"{Score} / {computerScore}")
            if Guess == guesses[1] or Guess == guessesShortcuts[1] and computerGuess == guesses[2]:
                print(f"{computerGuess.capitalize()}.")
                print("You win!")
                Score += 1
                print(f"{Score} / {computerScore}")
        else:
            print("Invalid response.")

Ответы [ 5 ]

1 голос
/ 10 июля 2020

or имеет более низкий приоритет, чем and. Когда вы говорите condition1 or condition2 and condition3, это обрабатывается как condition1 or (condition2 and condition3), и это правда, если condition1 истинно, даже если другие условия ложны.

Когда вы говорите

if Guess == guesses[0] or Guess == guessesShortcuts[0] and computerGuess == guesses[2]:

это верно, если Guess == guesses[0], независимо от того, что такое computerGuess.

Кроме того, у вас нет никакой обработки для связей, если пользователь вводит однобуквенный ввод, а guess - вводящее в заблуждение имя для этих вариантов.

1 голос
/ 10 июля 2020

В все операторы if, которые истинны, будут выполняться безотносительно к предыдущим операторам if. Что вы хотите сделать, так это сделать свой первый оператор как оператор if, а остальные - операторы elif.

Пример:

if (condition):
    (code)
elif (condition):
    (code)
elif (condition):
    (code)
...
0 голосов
/ 10 июля 2020

Как предлагает @panwen, вы можете уменьшить беспорядок в операторах if, используя dict в качестве таблицы поиска. Рассмотрите возможность использования следующего, чтобы упростить поиск результата.

solutions = {
    'rock': {'rock': 'tie', 'paper': 'loss', 'scissors': 'win'},
    'paper': {'rock': 'win', 'paper': 'tie', 'scissors': 'loss'},
    'scissors': {'rock': 'loss', 'paper': 'win', 'scissors': 'tie'},
}    

Например,

guess_player = 'rock'
guess_computer = 'scissors'
result = solutions[guess_player][guess_computer]

print(f"It's a {result}. You picked {guess_player} "
      f"and the computer picked {guess_computer}")
0 голосов
/ 10 июля 2020

Добро пожаловать в Python и ТАК, ваша проблема уже объяснена в ответах выше, просто используйте if-elif-else и дважды проверьте свой condition

Я предлагаю вам объединить 2 list в dict. Это сделает вас более ясным:

rps = {"rock": ['rock', 'r'],
       "paper": ['paper', 'p'],
       "scissor": ['scissor', 's']}

Что касается операторов if, вам следует подумать о разделении condition на некоторые под if-elif-else операторы, это сделает ваш код более понятным:

    Guess = str(input(f"Choose your weapon: {list(rps.keys())}? "))
    Guess = Guess.lower()
    computerGuess = random.choice(list(rps.keys()))

    # Rock
    if Guess in rps['rock']:
        print(f"Computer: {computerGuess}")
        if computerScore is 'rock':
            print("It's a tie!")
        elif computerGuess is 'paper':
            print("You lose!")
            computerScore += 1
        else:
            print("You win!")
            Score += 1
        print(f"{Score} / {computerScore}")
    # Paper
    elif Guess in rps['paper']:
        print(f"Computer: {computerGuess}")
        if computerScore is 'paper':
            print("It's a tie!")
        elif computerGuess is 'scissor':
            print("You lose!")
            computerScore += 1
        else:
            print("You win!")
            Score += 1
        print(f"{Score} / {computerScore}")
    # Scissor
    elif Guess in rps['scissor']:
        print(f"Computer: {computerGuess}")
        if computerScore is 'scissor':
            print("It's a tie!")
        elif computerGuess is 'rock':
            print("You lose!")
            computerScore += 1
        else:
            print("You win!")
            Score += 1
        print(f"{Score} / {computerScore}")
    else:
        print("Invalid response.")
0 голосов
/ 10 июля 2020

Для while True требуется некоторая переменная в форме run = True, чтобы программа знала, когда нужно закончить угадывание l oop, переназначив ей ложное значение в какой-то момент или завершив работу как; run = Tru во время работы: .... .... run = False

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