【问题标题】:How do I write the scores of my game into the leaderboard.txt and display the top 5 scores only with each player's name如何将我的游戏得分写入 leaderboard.txt 并仅显示前 5 名得分以及每个玩家的姓名
【发布时间】:2020-12-31 10:55:08
【问题描述】:

我目前正在为我的学校编程项目做一个骰子游戏,它包含以下规则:“将获胜者的分数及其姓名存储在外部文件中”和“显示前 5 名的分数和玩家姓名来自外部文件的获胜分数。除了排行榜,我已经完成了游戏中的所有事情。我可以将用户的姓名和分数写入 txt 文件,但我不确定如何对其进行排序,并且还希望人们第一次启动程序时可以使用菜单转到排行榜的位置然后阅读 txt 文件并按顺序打印前 5 个分数,包括名称。 我检查了许多与我类似的问题,但没有一个完全适用于我的代码,因为我不断收到错误,将其他人的代码应用到我的代码中,而这些错误与我的布局不兼容。

(deleted)

在此先感谢,我从来没有使用堆栈溢出来提问,所以如果我在帖子中做错了什么,我深表歉意。

【问题讨论】:

    标签: python text-files file-handling


    【解决方案1】:

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

    考虑到您提到这是一个学校项目,我不会为您提供完整的复制/粘贴解决方案,但希望能详细说明如何自行解决。

    现在根据问题,您不知道如何对排行榜进行排序。我自己运行了几次程序(因为我不耐烦?删除了睡眠之后),看到你的排行榜文件看起来像这样:

    90 - somename
    38 - anothername
    48 - yetanothername
    

    要显示这个,你必须做两件事:

    • 打开文件并读取数据
    • 将文件中的数据转换为程序可用的数据

    第一步似乎是您已经知道的,因为您已经使用open() 写入文件。阅读非常相似。

    如果您是编程新手,下一步就不那么明显了。该文件被读取为文本数据,您需要按数字对其进行排序。对于计算机,text "10"number 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 点开始对列表进行排序
    • 打印出列表。

    一些一般的想法

    您可以通过使用更多功能来改进和简化代码

    您已经表明您知道如何使用函数。但是看看 cmets #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,您的代码就会快速运行(用于测试)。

    【讨论】:

    • 非常感谢,您的出色指南确实帮助我完成了它。我已经为排行榜做了这么多代码,但是我仍然需要将分数限制为仅打印前 5 名,甚至放入记事本。 ``` def lb(): scores = [] with open('leaderboard.txt', 'r') as file: for line in file: name, score = line.split(' - ') score = int(score ) score.append((name, score)) scores.sort(key=lambda s: s[0], reverse=True) for name, score in scores: print(name, score, sep=' - ') `` `
    • 在使用这样的元组时实际上不需要“lambda”。它们会自动正确排序,因此您可以稍微简化一下。对于前 5 名,请在 Google 上搜索“Python 列表切片”
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多