0
\$\开始组\$

我试图实现我从中所理解的之前的建议.

  • 使用更多功能
  • 改进“玩”的逻辑
  • 允许错误的用户输入
  • 缩进到4个空格并删除()

请注意,我只能访问谷歌可乐,所以我无法从格式化工具或测试中受益。

我还尽我所能添加了评论和类型,并允许用户继续播放并累积结果。

我很感激关于如何获得更可读、更整洁的代码的一般建议,只是不要过于详细,因为我对python还很陌生。

导入随机导入系统通过键入import TypedDict欢迎=“”可能的值:r、p、s、q。输入r代表ROCK,输入p代表PAPER,输入s代表SCISSORS,输入q退出游戏。'''定义请求有效输入(消息:str,允许值:list[str],最大值:int):'''为用户提供一定次数的尝试,以防键入错误的字母。返回:有效的用户输入'''user_input=输入(消息).strip()如果max_tries<=0:引发异常(f“已达到最大尝试次数。输入必须是{allowed_values.join(',')}之一”)当user_input不在允许的值中时:max_tries-=1请求有效输入(最大值=最大值)返回用户输入课堂分数(TypedDict):用户:intpy:整数类LastRound(TypedDict):用户核心:intpy_score:整数用户字母:strpy_letter:字符串类RPS():'''代表一个简单的石头剪刀游戏'''定义__init__(自身):self.total_score:score={“用户”:0,“py”:0}self.last_round:LastRound|None=无self.welcome=欢迎self.max_tries=3#当用户尝试无效的字母或输入时。self.letter_mapping={“r”:“ROCK”,“s”:“SCISSORS”,“p”:“PAPER”}#用于通知用户self.allowed_values=['r','s','p','q']定义random_letter(自身):“”生成r、s或p,用作计算机的输入值/选项。'''字母=['r','s','p']our_val=随机.randint(0,2)回信[our_val]def report_result(self)->无:'''打印一个格式化字符串,告诉谁获胜。退货:无'''user_selection=self.letter_mapping[self.last_round[“user_letter”]]py_selection=self.letter_mapping[self.last_round[“py_letter”]]print(f“您选择了{user_selection},Python选择了{py_selection{”)如果self.last_round[“user_score”]>self.last_round[”py_score“]:打印(“用户获胜。”)elif self.last_round[“py_score”]>self.last_round[”user_score“]:print(“Python获胜。”)其他:打印(“领带”)定义播放(自我,用户输入):user_score=0py_score=0如果user_input==“q”:sys.exit(“退出游戏”)user_val=用户输入our_val=self.random_letter()#单独测试领带。如果user_val==our_val:通过#案例1:用户选择ROCKelif user_val==“r”:如果our_val==“s”:user_score+=1其他:py_score+=1#案例2用户选择纸张elif user_val==“p”:如果our_val==“r”:user_score+=1其他:py_score+=1#案例3用户选择剪刀其他:如果our_val==“r”:py_score+=1其他:user_score+=1#将结果置于类的状态self.last_round:LastRound={“user_score”:用户核心,“py_scoreself.total_score[“用户”]+=用户核心self.total_score[“py”]+=py_scoredef run_game(subsquent_message=“记住:r代表ROCK,s代表SCISSORS,p代表PAPER”):游戏=RPS()keep_going=“y”first_try=真while(keep_going==“y”):msg=game.welcome if first_try else“键入您的新选项(r、p、s或q):”输入=请求有效输入(msg=msg,max_tries=game.max_tries,allowed_values=gage.allowed_values)game.play(输入)游戏.report_result()keep_going=request_valid_input(msg=“您想再次玩吗?键入y代表是,n代表否”,allowed_values=['n','y'],max_tries=2)first_try=假打印(f“用户得分:{game.total_score['user']},python得分:{game.totall_score['py']}”)运行游戏()
\$\端组\$
2
  • \$\开始组\$ 请不要在问题回答后对您的问题进行重大更改,这会给未来无法理解的读者带来难以置信的混乱。 \$\端组\$
    – 桅杆
    4月27日10:28
  • 1
    \$\开始组\$ 虐待是不能容忍的。在写下一条评论之前,请注意你的语气。 \$\端组\$
    – 桅杆
    4月27日12:06

1答案1

重置为默认值
5
\$\开始组\$

堆栈溢出

感谢您提供了漂亮的类型注释(以及分数最后一轮):

定义请求有效输入(…:str,…:list[str],…:int):...user_input=输入(消息).strip()...当user_input不在允许的值中时:...请求有效输入(最大值=最大值)

不,请不要这样重复。存在堆栈溢出的风险:

RecursionError:超出最大递归深度

此外,你甚至没有分配user_input=请求有效输入(…)

这个虽然循环允许您不断提示有效输入,而不需要将任何东西推送到调用堆栈上。

请随意对返回的值进行注释:定义…)->字符串:

有意义的标识符

分数,我猜测那个第页可能是一个好的标识符?当然,它很简洁。

但它需要一个解释#评论,因为它写得过于简洁和晦涩。也许你脑子里有“蟒蛇”,许多开发人员会在哪里谈论“计算机得分”?如果这是一个C或rust程序,最终用户不太可能想到分数就“C分数”或“锈蚀分数”而言。

小小的小毛病:RPS“docstring”通常拼写为“docstring”,没什么大不了的。就让“$黑色*.py“帮你整理一下,还有其他一些细节。我们期望看到表达式的单引号,其中包括双引号,因为这样可以避免\反击逃脱。

印刷品(“正是这样,”爱丽丝说。“那么你应该说出你的意思,”三月兔继续说道

无用常量属性

这使得每个RPS对象都更加复杂,而且没有任何好处:

self.welcome=欢迎

要么带上模块级别欢迎在课堂上拉下绳子,或者仅仅依赖于对它的全球引用。这并不是说我们要在每个人的基础上改变它。

枚举

就目前而言,这很好:

self.letter_mapping={“r”:“ROCK”,“s”:“SCISSORS”,“p”:“PAPER”}

但感觉真的像枚举这就是我们想要的。

请注意,您可以安排.值如果需要,将每个枚举项的值设置为单个小写字母。

此外,我们似乎已经复制了其中的一些['r'、's'、p'、q']['r','s','p']出现的次数比期望的要多。这似乎是我们应该能够做到的干燥向上的只要一点点努力。

这是一个思维实验。如果UI突然要求我们处理
Chi、Fou、Mi或
Ro、Sham、Bo或
简、肯、彭?你想去几个地方那些词的重复实例?避免重复并不重要;我们把它称为一个好习惯。

让我们不要即使谈论岩石、纸、剪刀、蜥蜴、斯波克。

复制返回类型

这个签名很可爱:

def report_result(self)->无:'''打印。。。退货:无

“返回:”备注与签名重复,所以你可能更喜欢省略它。

更糟糕的是,几个月后你可能会开始返回一些整数分数,梅比会注意到麻烦但没有任何自动化工具会标记不一致的“退货:”备注。

多余的父母

while(keep_going==“y”):

这不是C或java,我们不需要( )在那里修剪。如上所述,运行黑色基于此代码库会把它整理一下。

额外标志

first_try=真而keep_going==“y”:msg=game.welcome if first_try else“键入您的新…”

这当然有效,你可以保持原样。

有时,引入这样的旗帜正是正确的做法。但在这里,最初分配就足够了msg=游戏欢迎,然后在循环的底部无条件地重新分配“键入您的新…”在现有基础上消息.

\$\端组\$
0

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.