保存高分 - Python 3

时间:2017-11-21 20:56:53

标签: python python-3.x

我试图为我的游戏保存一个分数。我有一段示例代码,为什么它不能保存,如果是这样,我将如何修复它?

hisc = open("highscore.txt","w+")
hi = hisc.read()
if hi == '':
    hisc.write('0')
    hi = '0'
if score > int(hi):
    hisc.write(str(score))
    print("NEW HIGHSCORE!")
else:
    print("HIGHSCORE =",hi)

4 个答案:

答案 0 :(得分:2)

存在一些问题:首先,您不能将w+用作分数列表的文件模式,因为它opens for reading & writing, truncating the file first。因此,每次使用w+打开文件时,它首先会删除它,因此每次都会有一个空文件。你想要r+

其次,我已删除hisc.write('0')。因为我们无论如何都将空文件视为零,并且如果空的话会立即用高分来覆盖它,这没有用。

第三,不鼓励手动打开/关闭文件。相反,请使用context manager

最后,我们需要seek(0)回到文件的开头,否则我们会将得分追加到最后。如果我们希望能够重置高分榜(可能会使其更小,我们在完成写作后需要truncate()以删除剩余的额外内容。

with open("highscore.txt", "r+") as hisc:
    hi = hisc.read()
    if not hi:  # not hi will only be true for strings on an empty string
        hi = '0'
    if score > int(hi):
        print("NEW HIGHSCORE!")
        hisc.seek(0)  # We already read to the end. We need to go back to the start
        hisc.write(str(score))
        hisc.truncate()  # Delete anything left over... not strictly necessary
    else:
        print("HIGHSCORE =%s" % hi)

答案 1 :(得分:1)

每次都可以在python中使用上下文管理器。这将帮助您避免与关闭资源相关的错误,并为您节省大量的调试时间。

如果您不知道上下文管理器是什么,请查看: http://book.pythontips.com/en/latest/context_managers.html

new_score = 100

with open("highscore.txt", "r") as high_file:
    stored_val = high_file.read()
    high_score = int(stored_val) if stored_val else 0

with open("highscore.txt", "w") as high_file:
    if new_score > int(high_score):
        high_file.write(str(new_score))
        print("NEW HIGHSCORE!")
    else:
        print("HIGHSCORE =", high_score)

编辑:我必须编辑示例代码,并根据注释使其完全正常运行。这段代码在python3上完美运行。

答案 2 :(得分:1)

在这种情况下,您应该使用withas打开文本文件。

with open("foo.txt", "w") as bar:
    # code that references bar goes here

这个方法的好处在于它会自动为您关闭文件,并为您处理其他一些事情。

在您的情况下,它看起来像这样:

with open("highscore.txt", "w+") as hisc:
    hi = hisc.read()
    if hi == '':
        hisc.write('0')
        hi = '0'
    if score > int(hi):
        hisc.write(str(score))
        print("NEW HIGHSCORE!")
    else:
        print("HIGHSCORE =",hi)

答案 3 :(得分:0)

正如@swimmingduck所说,所以需要在代码的末尾添加hisc.close(),因为没有它,Python就不会意识到你已经写完了文件。