如何解决如何将我的游戏得分写入到Leaderboard.txt中,并仅显示每个玩家的姓名的前5个得分 您可以使用更多功能来改进和简化代码要求输入密码的安全方式睡眠
我目前正在为我的学校编程项目做一个骰子游戏,它包含以下规则:“将获胜者的得分及其姓名存储在外部文件中”和“显示前5名的得分和玩家姓名”来自外部文件的获胜分数。”除了排行榜,我已经完成了游戏中的所有工作。我可以将用户的姓名和分数写到txt文件中,但是我不确定如何对它进行排序,并且我还希望人们首次启动该程序时可以使用菜单转到排行榜然后阅读txt文件,并按顺序打印前5个乐谱,包括姓名。 我检查了很多类似我的问题,但是没有一个问题完全适合我的代码,因为我不断出错,将其他人的代码实施到我的代码中,这与我的布局不兼容。
(deleted)
预先感谢,我从未使用过堆栈溢出来问一个问题,所以我很抱歉在帖子中做错了什么。
解决方法
您在这个问题上做得很好。您清楚地说明了问题,最重要的是,您添加了足够的代码来 run 运行代码,以便我们可以了解程序的行为方式和出了什么问题。在这种情况下,没错,这是件好事:)
考虑到您提到这是一个学校项目,我不会为您提供完整的复制/粘贴解决方案,但希望会解释如何自行解决此问题的详细信息。
现在根据问题,您不知道如何对排行榜进行排序。我亲自运行了几次该程序(由于不耐烦而取消睡眠后),然后看到您的排行榜文件如下所示:
90 - somename
38 - anothername
48 - yetanothername
要显示此内容,您必须做两件事:
- 打开文件并读取数据
- 将文件中的数据转换为程序可用的内容
第一步似乎是已经知道的,因为您已经使用open()
写入文件。阅读非常相似。
如果您不熟悉编程,那么下一步并不那么明显。该文件被读取为文本数据,您需要按数字对其进行排序。对于计算机,文本 "10"
与数字 10
(请注意引号)不同。您可以通过打开Python Shell进行尝试:
>>> 10 == 10
True
>>> 10 == "10"
False
>>> "10" == 10
False
文本与数字的排序方式不同。因此,解决方案之一就是将文本转换为数字。
您还将获得数据作为行(根据您的使用方式,使用readlines()
或splitlines()
。这些行需要分为分数和名称。文件中的模式是:
<score> - <name>
请务必注意,您将文本" - "
作为两者之间的分隔符(包括空格)。看一下Python函数str.split()
和str.partition()
。这些函数可以应用于任何文本值:
>>> "hello.world".split(".")
['hello','world']
>>> "hello.world".partition(".")
('hello','.','world')
您可以使用它来将线“切割”成多段。
这样做之后,您必须记住关于将文本转换为数字的上一点。
最后一步,您需要对值进行排序。
从文件中读取数据时,您可以将转换后的数据加载到Python列表中,然后可以对其进行排序。
一个方便的解决方案是创建一个列表,其中该列表的每个元素都是一个带有字段(score,name)
的 tuple 。这样,您可以直接对列表进行排序,而无需任何诡计。
最后,将其排序后,可以将其打印到屏幕上。
总结
- 打开文件
- 从文件中读取数据作为“行”
- 创建一个新的空列表。
- 环绕每行,然后...
- ...将线分成多个部分,分别获得分数和名称
- ...将分数转换为数字
- ...将两个值从第3点追加到新列表中
- 从第3点开始排序列表
- 打印出列表。
一些一般想法
您可以使用更多功能来改进和简化代码
您已经证明自己知道如何使用功能。但是请查看#THIS IS ROUND1
至#THIS IS ROUND5
的注释。每个回合的代码行是相同的。通过将这些行移动到函数中,您将节省很多 代码。这有两个好处:您只需要在一个地方进行代码更改(改进或修复)。其次,您保证所有块的行为都相同。
要做到这一点,您需要考虑阻塞需要哪些变量(那些将是新的函数参数)以及结果将是什么(即该函数的返回值)。
一个简单的重复示例:
print("round 1")
outcomes = []
value1 = random(1,100)
value2 = random(1,100)
if value1 > value2:
outcomes.append("A")
else:
outcomes.append("B")
print("round 2")
outcome = ""
value1 = random(1,100)
if value1 > value2:
outcomes.append("A")
else:
outcomes.append("B")
用函数重写
def run_round(round_name):
print(round_name)
value1 = random(1,100)
value2 = random(1,100)
if value1 > value2:
return "A"
else:
return "B"
outcomes = []
result_1 = run_round("round 1")
outcomes.append(result_1)
result_2 = run_round("round 2")
outcomes.append(result_2)
如您所见,第二个代码短得多,没有重复。您的代码将具有更多的函数参数。通常,在编程时要以一种函数很少参数且没有复杂返回值的方式来组织代码是一个挑战。虽然,只要它起作用,没人会看得太近;)
要求输入密码的安全方式
您可以使用模块getpass()
中的getpass()
以安全的方式提示输入密码:
from getpass import getpass
password = getpass()
但是请注意,如果您使用的是PyCharm,则会导致某些问题,这些问题不在本文讨论范围之内。在这种情况下,请坚持使用input()
。
睡眠
“ sleep()”调用很不错,可以让您有机会遵循程序,但会降低测试程序的速度。考虑使用较小的值(可以使用逗号值),或者甚至更好地编写您自己的函数,以“短路”进行测试。像这样:
import time
ENABLE_SLEEP = True
def sleep(s):
if ENABLE_SLEEP:
time.sleep(s)
print("some code")
sleep(1)
print("more code")
sleep(4)
然后,您随时可以使用自己的sleep()
函数。这样,您只需将变量ENABLE_SLEEP
设置为False
,您的代码即可快速运行(用于测试)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。