首先,无论您做什么,都需要从文件中读取最多 10 行。
如果您只想保留前 10 个分数,然后停止记录新的分数,这很容易。我将使用linecache 模块来提高效率(因此,如果您连续调用storescores 1000 次,它会记住它已经在寻找但未能找到第10 行)。如果少于 10 行,这将返回一个空字符串,如果有 10 行或更多,则返回第 10 行。所以:
def storescores():
if linecache.getline("hst.txt", 10):
print("Already stored 10 scores, sorry")
return
hs.close()
hs = open("hst.txt", "a")
hs.write(name + " ")
hs.write(str(score) + "\n")
hs.close()
如果你想要最近的 10 个分数,你必须读入这些行,然后写出一个新文件。像这样:
def storescores():
with open("hst.txt") as hs:
lines = list(hs)
lines.append(name + " " + score + "\n")
lines = lines[-10:]
with open("hst.txt", "w") as hs:
for line in lines:
hs.write(line)
如果你想要 top 10 的分数,你可以做同样的事情,但在中间添加一个排序步骤。没有理由编写显式选择排序或冒泡排序——事实上,您也不想这样做,因为这些排序算法本来就不是好的排序算法。只需在列表上调用sort 方法即可。
棘手的一点是您要按 score 排序,而不是整行(否则“Bob 100”的分数高于“Andrew 200”),并且按分数 作为数字而不是作为字符串(否则,“2”的分数高于“10”)。因此,您需要一个 key function 来拆分字符串,获取最后一位并将其转换为数字。所以:
def storescores():
with open("hst.txt") as hs:
lines = list(hs)
lines.append(name + " " + score + "\n")
lines.sort(key=lambda line: int(line.split()[-1]))
lines = lines[-10:]
with open("hst.txt", "w") as hs:
for line in lines:
hs.write(line)
有一些方法可以进一步改进这一点。例如,您可能希望写入一个新的临时文件,而不是就地重写文件,然后在完成后将其复制到文件上(因此,如果有人在您的程序运行中间拔掉了插件,您最终得到旧分数或新分数,而不是截断的部分文件)。或者您可能想以最聪明的方式使用heapq 或bisect 模块将新分数放到适当的排序位置,而不是重新排序整个已排序的列表(当只有 10 个时,这并不重要条目)。等等。但这应该足以让您入门。