Saving the highscore for a game?
I recommend you use shelve. For example:
import shelve
d = shelve.open('score.txt') # here you will save the score variable
d['score'] = score # thats all, now it is saved on disk.
d.close()
Next time you open your program use:
import shelve
d = shelve.open('score.txt')
score = d['score'] # the score is read from disk
d.close()
and it will be read from disk. You can use this technique to save a list of scores if you want in the same way.
You can use the pickle
module to save variables to disk and then reload them.
Example:
import pickle
# load the previous score if it exists
try:
with open('score.dat', 'rb') as file:
score = pickle.load(file)
except:
score = 0
print "High score: %d" % score
# your game code goes here
# let's say the user scores a new high-score of 10
score = 10;
# save the score
with open('score.dat', 'wb') as file:
pickle.dump(score, file)
This saves a single score to disk. The nice thing about pickle is that you can easily extend it to save multiple scores - just change scores
to be an array instead of a single value. pickle
will save pretty much any type of variable you throw at it.
You can use a dict to hold your highscore and simply write it into a file:
def store_highscore_in_file(dictionary, fn = "./high.txt", top_n=0):
"""Store the dict into a file, only store top_n highest values."""
with open(fn,"w") as f:
for idx,(name,pts) in enumerate(sorted(dictionary.items(), key= lambda x:-x[1])):
f.write(f"{name}:{pts}\n")
if top_n and idx == top_n-1:
break
def load_highscore_from_file(fn = "./high.txt"):
"""Retrieve dict from file"""
hs = {}
try:
with open(fn,"r") as f:
for line in f:
name,_,points = line.partition(":")
if name and points:
hs[name]=int(points)
except FileNotFoundError:
return {}
return hs
Usage:
# file does not exist
k = load_highscore_from_file()
print(k)
# add some highscores to dict
k["p"]=10
k["a"]=110
k["k"]=1110
k["l"]=1022
print(k)
# store file, only top 3
store_highscore_in_file(k, top_n=3)
# load back into new dict
kk = load_highscore_from_file()
print(kk)
Output:
{} # no file
{'p': 10, 'a': 110, 'k': 1110, 'l': 1022} # before storing top 3
{'k': 1110, 'l': 1022, 'a': 110} # after loading the top 3 file again