好的,所以基本上我正在制作一个涉及高分的简单游戏。 如果比之前的高分更大,我希望保存高分。 这是我的代码。我有一些不同的错误,其中一些涉及我在字符串和整数之间切换以及其他错误,因为我的代码是完全错误的。我试着去理解这个问题,但是新的错误似乎还在继续。
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%错误,我尽我所能。 我需要的是每当我运行游戏时它都会显示我的高分。如果我的分数大于我的高分,则文本文件中的高分将被更改。然后重新加载到游戏中以便在此代码中再次执行操作。
答案 0 :(得分:3)
您的代码存在的问题是,当hiscore.replace
为hiscore
时,您正试图致电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
module Overview解释了大部分内容,但它并不完全适合初学者。本教程中的Reading and Writing Files可能会更有帮助。