Как сделать код для игры в Рок, Бумагу и ножницы менее избыточным?
Я должен сделать проект для игры в камень, бумагу и ножницы, и код, который у меня есть, является полным кодом для игры, но моему профессору это не нравится, поскольку он слишком избыточен. Есть ли способ сократить его или сделать его более простым?
import random
while True:
bot = random.choice(["Rock", "Paper", "Scissors"]).lower()
user_choice = input("Choose between Rock, Paper, and Scissors or -1 to exit: \n ").lower()
if user_choice == bot:
print("We tied! I chose", bot," and you chose", user_choice)
elif user_choice == "rock":
if bot == "paper":
print("You lose! I chose", bot," and you chose", user_choice , ", Paper beats rock!")
elif bot == "scissors":
print("You win! I chose", bot," and you chose", user_choice , ", Rock beat scissors!")
elif user_choice == "paper":
if bot == "rock":
print("You win! I chose",bot," and you chose", user_choice , ", Paper beats rock!")
elif bot == "scissors:":
print("You lose! I chose", bot," and you chose", user_choice , ", Scissors beats paper")
elif user_choice == "scissors":
if bot == "paper":
print("You win! I chose", bot," and you chose",user_choice, ", Scissors beats paper")
elif bot == "rock":
print("You Lose! I chose", bot," and you chose", user_choice , ", Rock beats scissors")
else:
print("Invalid Entry, you typed:", user_choice, ", Please try again: ")
if user_choice == '-1':
print("You selected -1 to exit, Goodbye!")
exit()
также иногда, когда я вводю бумагу в качестве ввода, я не получаю вывод, код просто возвращается к началу, кто-нибудь знает, почему это происходит?
Пример: выберите между Камнем, Бумагой и Ножницами или -1, чтобы выйти:
камень
Ты победил! Я выбрал ножницы, а ты выбрал камень, ножницы Рок-бита!
Выберите между Камнем, Бумагой и Ножницами или -1, чтобы выйти:
бумага
Мы связали! Я выбрал бумагу, а ты выбрал бумагу
Выберите между Камнем, Бумагой и Ножницами или -1, чтобы выйти:
бумага
Выберите между Камнем, Бумагой и Ножницами или -1, чтобы выйти: ^ нет вывода
ножницы
Ты проиграл! Я выбрал камень, а ты выбрал ножницы, Рок бьет ножницы
Выберите между Камнем, Бумагой и Ножницами или -1, чтобы выйти:
бумага
Выберите между Камнем, Бумагой и Ножницами или -1, чтобы выйти:
^ нет выхода
4 ответа
Я бы предложил использовать оператор модуля и перечислить ваш выбор. (камень (0)=> бумага (1) => ножницы (2))
Условием выигрыша является user_choice - выбор бота%3 == 1.
Как сделать код для игры в Рок, Бумагу и ножницы менее избыточным?
Во-первых, мы можем перечислить только варианты, в которых пользователь выигрывает или выигрывает, и разрешать неявные случаи, когда пользователь проигрывает. например
if user_choice == bot:
result = "draw"
elif (user_choice == "rock") and (bot == "scissors"):
result = "win";
elif (user_choice == "paper") and (bot == "rock"):
result = "win";
elif (user_choice == "scissors") and (bot == "paper"):
result = "win";
else:
result = "lose";
Во-вторых, поскольку все сообщения являются форумными, основанными на подстановке в выборе, мы можем отделить генерацию сообщений от логики. Я не написал код для этого, потому что я не делаю всю вашу работу за вас.
В-третьих, мы могли бы использовать словарь для представления условий выигрыша для данного пользовательского выбора. Что-то вроде.
if user_choice == bot:
result = "draw"
elif wincondition[user_choice] == bot:
result = "win";
else:
result = "lose";
также иногда, когда я вводю бумагу в качестве ввода, я не получаю вывод, код просто возвращается к началу, кто-нибудь знает, почему это происходит?
У вас есть заблудшая двоеточие в вашем коде elif bot == "scissors:":
Вы можете параметризовать напечатанный текст:
player_wins = "You win! I chose {bot_choice} and you chose {player_choice}. {player_choice} beats {bot_choice}!"
player_looses = "You lose! I chose {bot_choice} and you chose {player_choice}. {bot_choice} beats {player_choice}!"
print(player_wins.format(bot_choice="Paper", player_choice="scissors")
Вы также можете сократить if-else
пункт. Я просто собираюсь дать вам подсказку, но если вы посмотрите на варианты "камень", "бумага", "ножницы" как 0, 1 и 2, и суммируете выбор бота и игрока, вы заметите шаблон, Оператор по модулю играет роль.
Один из способов сделать его менее избыточным - вместо того, чтобы использовать все операторы if else, создать функцию, которая выдает ответ выигравшему, вместо того, чтобы выводить каждый сценарий для каждой комбинации.