Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pgu/high.py
diff options
context:
space:
mode:
Diffstat (limited to 'pgu/high.py')
-rw-r--r--pgu/high.py154
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]