Python酸洗问题

Python酸洗问题,python,python-3.x,pygame,pickle,Python,Python 3.x,Pygame,Pickle,这里有一些使用“pickle”模块的python 3代码。它应该存储游戏的高分。当我再次打开程序时,它会给我默认的“A:100…”高分 def __init__(self): self.filename = "highscores.dat" self.numScores = 5 if not os.path.isfile(self.filename): self.file = open(self.filename, "wb") self.

这里有一些使用“pickle”模块的python 3代码。它应该存储游戏的高分。当我再次打开程序时,它会给我默认的“A:100…”高分

def __init__(self):
    self.filename = "highscores.dat"
    self.numScores = 5

    if not os.path.isfile(self.filename):
        self.file = open(self.filename, "wb")
        self.scores = [100 for i in range(self.numScores)]
        self.names = ["A", "B", "C", "D", "E"]
        self.highscores = [(self.names[i], self.scores[i]) for i in range(self.numScores)]
        self.updateFile()
    else:
        file = open(self.filename, "rb")
        self.highscores = pickle.load(file)
        file.close()
        self.file = open(self.filename, "wb")

        self.names = [highscore[0] for highscore in self.highscores]
        self.scores = [highscore[1] for highscore in self.highscores]

 def addScore(self, name, score):
    self.scores.append(score) #Add new score 
    self.scores.sort(reverse = True) #Sort
    self.names.insert(self.scores.index(score), name)
    self.names = self.names[:self.numScores] # Top 5
    self.scores = self.scores[:self.numScores]
    self.highscores = [(self.names[i], self.scores[i]) for i in range(self.numScores)]
    self.updateFile()

def updateFile(self):
    pickle.dump(self.highscores, self.file)

这只是代码中我认为问题所在的部分。如果需要,我会发布更多。我很乐意回答你的问题。谢谢。

每次写入时都需要重新打开文件。目前,每次分数更改时,您都会在文件中逐个写入新记录。您的文件现在包含几个pickle,但只读取第一个pickle

将代码更改为:

def __init__(self):
    self.filename = "highscores.dat"
    self.numScores = 5

    if not os.path.isfile(self.filename):
        self.scores = [100 for i in range(self.numScores)]
        self.names = ["A", "B", "C", "D", "E"]
        self.highscores = [(self.names[i], self.scores[i]) for i in range(self.numScores)]
    else:
        with open(self.filename, "rb") as f:
            self.highscores = pickle.load(f)
        self.names = [highscore[0] for highscore in self.highscores]
        self.scores = [highscore[1] for highscore in self.highscores]

def updateFile(self):
    with open(self.filename, 'wb') as f:
        pickle.dump(self.highscores, f)
addScore
不变


每次分数发生变化时,highscore文件都会从头开始写入。

如果要使用完整的绝对路径名,那么它是否有效?如“C:\Users\Bobby\Dropbox\LD25\highscores.dat”中所示?我刚刚测试了它,但它也有同样的问题。您可能需要在
\uuu init\uuuu
中插入一个print语句,以查看
.isfile()测试在那里发生了什么。文件是否已经创建?已经想到了。就我所知,它可以正常工作。下一个测试是在
updateFile()
中添加一个print语句,打印
self.highscores
。我可以问一些完全不同的问题吗?你有多少年的python经验?我不得不承认我有点嫉妒:事实上,阅读你的职业简介让我更加嫉妒:P我想感谢你在这里与我们分享你的知识!这对像我这样最近开悟的人来说意义重大!谢谢我不能直接复制这段代码,因为我参加了一个禁止这类事情的竞赛,但我能够根据您的解释编写我自己的解决方案。