diff options
author | Tony Anderson <tony_anderson@usa.net> | 2009-06-22 14:04:24 (GMT) |
---|---|---|
committer | Tony Anderson <tony_anderson@usa.net> | 2009-06-22 14:04:24 (GMT) |
commit | 6eb30b09566a53ef510532f2a1705d7fc22985a8 (patch) | |
tree | d52765c093219f91d07f030ed597f9491a7f8493 /pgu/high.py |
initial commit
Diffstat (limited to 'pgu/high.py')
-rw-r--r-- | pgu/high.py | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/pgu/high.py b/pgu/high.py new file mode 100644 index 0000000..e05d22a --- /dev/null +++ b/pgu/high.py @@ -0,0 +1,154 @@ +"""Classes for handling high score tables. +""" + +import os + +def High(fname,limit=10): + """Create a Highs object and returns the default high score table. + + <pre>High(fname,limit=10)</pre> + + <dl> + <dt>fname <dd>filename to store high scores in + <dt>limit <dd>limit of scores to be recorded, defaults to 10 + </dl> + """ + return Highs(fname,limit)['default'] + +class _Score: + def __init__(self,score,name,data=None): + self.score,self.name,self.data=score,name,data + +class _High: + """A high score table. These objects are passed to the user, but should not be created directly. + + <p>You can iterate them:</p> + <code> + for e in myhigh: + print e.score,e.name,e.data + </code> + + <p>You can modify them:</p> + <code> + myhigh[0].name = 'Cuzco' + </code> + + <p>You can find out their length:</p> + <code> + print len(myhigh) + </code> + """ + + def __init__(self,highs,limit=10): + self.highs = highs + self._list = [] + self.limit = limit + + def save(self): + """Save the high scores. + + <pre>_High.save()</pre> + """ + self.highs.save() + + def submit(self,score,name,data=None): + """Submit a high score to this table. + + <pre>_High.submit(score,name,data=None)</pre> + + <p>return -- the position in the table that the score attained. None if the score did not attain a position in the table.</p> + """ + n = 0 + for e in self._list: + if score > e.score: + self._list.insert(n,_Score(score,name,data)) + self._list = self._list[0:self.limit] + return n + n += 1 + if len(self._list) < self.limit: + self._list.append(_Score(score,name,data)) + return len(self._list)-1 + + def check(self,score): + """Check if a score will attain a position in the table. + + <pre>_High.check(score)</pre> + + <p>return -- the position the score will attain, else None</p> + """ + n = 0 + for e in self._list: + if score > e.score: + return n + n += 1 + if len(self._list) < self.limit: + return len(self._list) + + + def __iter__(self): + return self._list.__iter__() + + def __getitem__(self,key): + return self._list[key] + + def __len__(self): + return self._list.__len__() + + +class Highs: + """The high score object. + + <pre>Highs(fname,limit=10)</pre> + <ul> + <dt>fname <dd>filename to store high scores in + <dt>limit <dd>limit of scores to be recorded, defaults to 10 + </ul> + + <p>You may access _High objects through this object:</p> + + <code> + my_easy_hs = highs['easy'] + my_hard_hs = highs['hard'] + </code> + + """ + def __init__(self,fname,limit=10): + self.fname = fname + self.limit = limit + self.load() + + def load(self): + """Re-load the high scores. + + <pre>Highs.load()</pre> + """ + + self._dict = {} + try: + f = open(self.fname) + for line in f.readlines(): + key,score,name,data = line.strip().split("\t") + if key not in self._dict: + self._dict[key] = _High(self,self.limit) + high = self._dict[key] + high.submit(int(score),name,data) + f.close() + except: + pass + + def save(self): + """Save the high scores. + + <pre>Highs.save()</pre> + """ + + f = open(self.fname,"w") + for key,high in self._dict.items(): + for e in high: + f.write("%s\t%d\t%s\t%s\n"%(key,e.score,e.name,str(e.data))) + f.close() + + def __getitem__(self,key): + if key not in self._dict: + self._dict[key] = _High(self,self.limit) + return self._dict[key] |