如何使我在玩石头,纸和剪刀的游戏时减少多余的代码?

时间:2019-02-27 20:46:13

标签: python redundancy

我必须在一个石头,纸和剪刀的游戏上做一个项目,到目前为止,我的代码是游戏的完整代码,但是我的教授不喜欢它,因为它太多余了。是否有任何方法可以缩短它或使其变得更简单?

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退出:

岩石

您赢了!我选择了剪刀,然后您选择了Rock,Rock beat剪刀!

在石头,纸张和剪刀之间选择,或选择-1退出:

我们并列!我选择了纸张,而您选择了纸张

在石头,纸张和剪刀之间选择,或选择-1退出:

在岩石,纸张和剪刀之间选择,或选择-1退出: ^没有输出

剪刀

您输了!我选择了岩石,而您选择了剪刀,岩石击败了剪刀

在石头,纸张和剪刀之间选择,或选择-1退出:

在石头,纸张和剪刀之间选择,或选择-1退出:

^没有输出

4 个答案:

答案 0 :(得分:1)

我建议使用模运算符并列举您的选择。 (rock(0)=>纸张(1)=>剪刀(2))

获胜条件是user_choice-机器人选择%3 ==1。

答案 1 :(得分:1)

  

如何使我的Rock,Paper和剪刀游戏代码减少冗余?

首先,我们只能枚举用户获胜或平局的选择,并隐含用户失去的情况。例如

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:":中有一个冒号冒号

答案 2 :(得分:0)

可以减少冗余的一种方法是,不使用所有if else语句,而是创建一个对获胜者进行响应的函数,而不是针对每个组合键入每种情况。

答案 3 :(得分:0)

您可以参数化打印的文本:

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子句。我只是给你一个提示,但是如果您将“ rock”,“ paper”,“ scissorss”的选择分别视为0、1和2,并将机器人和玩家的选择总和相加,就会发现一种模式。模运算符起作用。