如何将我的游戏分数写入Leadboard.txt并仅显示每个玩家姓名的前5名分数

2024-06-13 05:40:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在为我的学校编程项目做一个骰子游戏,其中包括规则:“在外部文件中存储获胜者的分数及其姓名”和“显示外部文件中前5名获奖分数的分数和玩家姓名”。除了排行榜,我在游戏中做了所有事情。我能够将用户的姓名和分数写入txt文件,但我不确定如何对其进行排序,我还希望当人们第一次启动程序时,可以使用菜单进入排行榜,然后读取txt文件并按顺序打印前5名分数,包括姓名。 我已经检查了大量类似于我的问题,但是没有一个问题对我的代码起作用,因为我不断地在我的代码中出现错误,这些错误与我的布局不兼容

(deleted)

提前感谢,我从来没有使用堆栈溢出来提问,所以如果我的帖子中有任何错误,我向您道歉


Tags: 文件项目代码txt游戏规则编程错误
1条回答
网友
1楼 · 发布于 2024-06-13 05:40:15

你在这个问题上做得很好。您清楚地说明了问题,最重要的是,您添加了足够的代码来运行代码,这样我们就可以了解程序的运行方式以及出现的问题。在这种情况下,没有什么是错的,这是好的:)

考虑到你提到这是一个学校项目,我不会给你一个完整的复制/粘贴解决方案,但希望能解释足够的细节,如何解决这个问题

现在根据这个问题,你不知道如何排序你的排行榜。我自己运行了几次这个程序(因为我不耐烦,所以在取消睡眠之后)😋) 并查看您的排行榜文件如下所示:

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)元组

最后,在排序之后,您可以将其打印到屏幕上

总之

  • 打开文件
  • 以“行”的形式从文件中读取数据
  • 创建一个新的空列表
  • 在每行上循环并。。。
    • …将线拆分为多个部分,以分别获得分数和名称
    • …将分数转换为数字
    • …将这两个值从第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)
value2 = 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,代码就会快速运行(用于测试)

相关问题 更多 >