Как сделать код для игры в Рок, Бумагу и ножницы менее избыточным? - PullRequest
0 голосов
/ 27 февраля 2019

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

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 голосов
/ 28 февраля 2019

Как сделать код для игры в Рок, Бумагу и ножницы менее избыточным?

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

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:":

0 голосов
/ 27 февраля 2019

Я бы предложил использовать оператор модуля и перечислить ваш выбор.(камень (0) => paper (1) => ножницы (2))

Условие выигрыша - user_choice - выбор бота% 3 == 1.

0 голосов
/ 28 февраля 2019

Вы можете параметризовать напечатанный текст:

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, и суммируете выбор бота и игрока, вы заметите шаблон,Оператор по модулю играет роль.

0 голосов
/ 27 февраля 2019

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

...