如何将我的游戏得分写入到Leaderboard.txt中,并仅显示每个玩家的姓名的前5个得分 您可以使用更多功能来改进和简化代码要求输入密码的安全方式睡眠

如何解决如何将我的游戏得分写入到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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-