2

好的,所以基本上我正在制作一个涉及高分的简单游戏。如果高于以前的高分,我希望保存高分。这是我的代码。我有一些不同的错误,其中一些涉及我在字符串和整数之间切换的事实以及其他错误,因为我的代码完全错误。我尝试理解问题,但似乎不断出现新错误。

hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    hiscore = hiscore.replace(hiscore, score)
    hisc.write(hiscore)

这是我最后一次尝试。这可能是100%错误,我尽了最大努力。我需要的是,每当我运行游戏时,它都会显示我的高分。如果我的分数大于我的高分,则更改文本文件中的高分。然后将其重新加载到游戏中以再次在此代码中执行操作。

4

1 回答 1

3

您的代码的问题是您试图调用hiscore.replacewhen hiscoreis an int.

我不确定你为什么首先尝试使用replace。这对于用不同的字符串替换字符串的一部分很有用。如果你想替换整个东西,只需分配一个新值:hiscore = score.

hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    hiscore = score
    hisc.write(hiscore)

但是,您还有第二个问题:您正在将int输出写入文件,而您想要的(我认为)是将int其精确地表示为 3 个字符的字符串。因此,将最后一行替换为:

    hisc.write('{:3}'.format(hiscore))

同时,以模式打开文件"r+"可能不会像您认为的那样。在 Python 3 中,“r+”文件的“读指针”和“写指针”总是在同一个位置。因此,如果您读取 3 个字符,然后写入 3 个字符,则最终会覆盖字符 3-6,或在末尾添加 3 个新字符,而不是根据需要覆盖字符 0-3。您可以通过seek(0, 0)read.

最后,你永远close不会保存文件,这意味着你写的任何东西都可能永远不会被保存——它可能会留在内存中的缓冲区中,并且永远不会被刷新到实际的磁盘文件中。在这里打开读取,然后关闭,然后打开写入,然后关闭可能更简单,所以你不需要担心所有的seek废话。关闭文件最简单的方法是使用with语句。

所以,把它们放在一起:

with open("Hscore.txt", "r") as hisc:
    hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    with open("Hscore.txt", "w") as hisc:
        hisc.write('{:3}'.format(score))

但这依赖于这样一个事实,即保证 Hscore.txt 存在(在当前工作目录中),并且其中有一个数字。如果某些错误导致您在其中粘贴“x”,或者将文件完全清空,则每次运行时都会出现异常,并且永远无法恢复。所以,你可能想要这样的东西:

try:
    with open("Hscore.txt", "r") as hisc:
        hiscore = hisc.read(3) # 3 because the max score would never reach 1000
    highscore = int(hiscore)
except IOError as e:
    print('Warning: couldn't open "Hscore.txt": {}'.format(e))
    highscore = 0
except ValueError as e:
    print('Warning: couldn't convert "{}" from "Hscore.txt" to an integer: {}'.format(hiscore, e))
    highscore = 0

这样,它会打印出一个警告,希望能帮助您找出问题所在,并尝试恢复(假设丢失或损坏的文件意味着高分为 0)。

open文档和io模块概述解释了大部分内容,但它并不完全适合初学者。教程中的读写文件可能会更有帮助。

于 2013-02-14T01:58:51.800 回答