python - Python - “石头剪刀布”逻辑条件的简化
问题描述
我正在解决一个问题,它说:
在生活大爆炸中,谢尔顿和拉吉创造了一个新游戏:“石头剪刀布-蜥蜴-史波克”。
游戏规则如下:
- 剪刀剪纸;
- 纸盖石头;
- 岩石压碎蜥蜴;
- 蜥蜴毒死史波克;
- Spock打碎剪刀;
- 剪刀斩首蜥蜴;
- 蜥蜴吃纸;
- 论文反驳了斯波克;
- Spock使岩石蒸发;
- 石头压碎剪刀。
在谢尔顿获胜的情况下,他会说:“Bazinga!”;如果 Raj 赢了,Sheldon 会宣布:“Raj 作弊”;在平局中,他会要求一个新游戏:“再次!”。给定双方选择的选项,制作一个程序来打印 Sheldon 对结果的反应。
输入由一系列测试用例组成。第一行包含一个正整数 T (T ≤ 100),表示测试用例的数量。每个测试用例由一行输入表示,分别包含 Sheldon 和 Raj 的选择,用空格分隔。
我对这个问题的代码是
T = int(input())
for i in range(T):
Sheldon, Raj = input().split(' ')
if(Sheldon == "scissors" and (Raj == "paper" or Raj == "lizard")):
Win = True
elif(Sheldon == "lizard" and (Raj == "paper" or Raj == "Spock")):
Win = True
elif(Sheldon == "Spock" and (Raj == "rock" or Raj == "scissors")):
Win = True
elif(Sheldon == "paper" and (Raj == "rock" or Raj == "Spock")):
Win = True
elif(Sheldon == "rock" and (Raj == "scissors" or Raj == "lizard")):
Win = True
elif(Raj == "scissors" and (Sheldon == "paper" or Sheldon == "lizard")):
Lose = True
elif(Raj == "lizard" and (Sheldon == "paper" or Sheldon == "Spock")):
Lose = True
elif(Raj == "Spock" and (Sheldon == "rock" or Sheldon == "scissors")):
Lose = True
elif(Raj == "paper" and (Sheldon == "rock" or Sheldon == "Spock")):
Lose = True
elif(Raj == "rock" and (Sheldon == "scissors" or Sheldon == "lizard")):
Lose = True
elif(Sheldon == Raj):
Tie = True
if(Win == True):
print("Case #{0}: Bazinga!".format(i+1))
elif(Lose == True):
print("Case #{0}: Raj cheated!".format(i+1))
elif(Tie == True):
print("Case #{0}: Again!".format(i+1))
Win = Lose = Tie = False
但我认为它太长了。有什么办法可以减少吗?
解决方案
首先,祝贺你尝试写这个!您的逻辑非常适合第一次尝试。
下一步是为规则创建一个可以以相同方式查询的数据结构。一个很好的选择是dictionary
:
options = {
'scissors': ('paper', 'lizard'),
'paper': ('rock', 'spock'),
'rock': ('lizard', 'scissors'),
'lizard': ('spock', 'paper'),
'spock': ('scissors', 'rock'),
}
然后你可以只查询它而不是重复很多if
s:
if raj == sheldon:
print("Case #{0}: Again!".format(i+1))
elif raj in options[sheldon]:
print("Case #{0}: Bazinga!".format(i+1))
else:
print("Case #{0}: Raj cheated!".format(i+1))
推荐阅读
- python - 更改python中的预测方法
- visual-studio - 在 Visual Studio 中调试时,我可以将端口绑定添加到 docker 容器吗?
- javascript - 如何制作打印图像宽度的功能
- mysql - SQL 查询查找前 5 条累积推文
- javascript - 如何从字符串的起始位置检查是否包含字符串
- python - 特定条件下的 Concat DataFrame
- neo4j - 从节点属性设置标签
- javascript - 从格式化程序在表格中添加 CheckBox
- sql - Hive 删除重复类型的关系
- c++ - 使用 srand() 在随机游走中出现蝴蝶模式,为什么?