]> git.saurik.com Git - wxWidgets.git/commitdiff
very silly sample
authorHarco de Hilster <harcoh@caos.kun.nl>
Fri, 26 Mar 1999 23:07:46 +0000 (23:07 +0000)
committerHarco de Hilster <harcoh@caos.kun.nl>
Fri, 26 Mar 1999 23:07:46 +0000 (23:07 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1984 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

utils/wxPython/tests/hangman.py [new file with mode: 0644]

diff --git a/utils/wxPython/tests/hangman.py b/utils/wxPython/tests/hangman.py
new file mode 100644 (file)
index 0000000..7b4e89d
--- /dev/null
@@ -0,0 +1,169 @@
+import random
+from wxPython.wx import *
+
+class WordFetcher:
+    def __init__(self, filename):
+       try:
+           f = open(filename, "r")
+       except:
+           print "Couldn't open dictionary file %s, using build-ins" % (filename,)
+           self.words = self.builtin_words
+           return
+       self.words = []
+       while f and len(self.words)<100:
+           line = f.readline()
+           self.words.append(line[0:-1])
+       print self.words
+    def Get(self):
+       return self.words[int(random.random()*len(self.words))]
+    builtin_words = [ 'albatros', 'banana', 'electrometer', 'eggshell' ]
+
+class MyFrame(wxFrame):
+    def __init__(self, wf):
+       self.wf = wf
+       wxFrame.__init__(self, NULL, -1, "test threads", wxDefaultPosition, wxSize(300,200))
+       self.panel = wxPanel(self, -1)
+       self.panel.SetFocus()
+       menu = wxMenu()
+       menu.Append(1001, "New")
+       menu.Append(1002, "End")
+       menu.AppendSeparator()
+       menu.Append(1003, "Exit")
+       self.cnt = 0;
+       menubar = wxMenuBar()
+       menubar.Append(menu, "Game")
+       self.SetMenuBar(menubar)
+       self.CreateStatusBar(2)
+       EVT_MENU(self, 1001, self.OnGameNew)
+       EVT_MENU(self, 1002, self.OnGameEnd)
+       EVT_MENU(self, 1003, self.OnWindowClose)
+       EVT_CHAR(self.panel, self.OnChar)
+       self.played = 0
+       self.won = 0
+       self.history = []
+       self.average = 0.0
+       self.OnGameNew(None)
+    def Draw(self, dc = None):
+       if not dc:
+           dc = wxClientDC(self.panel)
+       dc.Clear()
+       (x,y) = self.panel.GetSizeTuple()
+       x1 = x-150; y1 = 20
+       for letter in self.word:
+           if self.guess.count(letter):
+               dc.DrawText(letter, x1, y1)
+           else:
+               dc.DrawText('.', x1, y1)
+           x1 = x1 + 10
+       x1 = x-150
+       dc.DrawText("played: %d" % (self.played,), x1, 50)
+       if self.played:
+           percent = (100.*self.won)/self.played
+       else:
+           percent = 0.0
+       dc.DrawText("won: %d (%g %%)" % (self.won, percent), x1, 70)
+       dc.DrawText("average: %g" % (self.average,), x1, 90)
+       dc.SetUserScale(x/1000., y/1000.)
+       self.DrawVictim(dc)
+    def DrawVictim(self, dc):
+       dc.SetPen(wxPen(wxNamedColour('black'), 20))
+       dc.DrawLines([(10, 980), (10,900), (700,900), (700,940), (720,940),
+                     (720,980), (900,980)])
+       dc.DrawLines([(100,900), (100, 100), (300,100)])
+       dc.DrawLine(100,200,200,100)
+       if ( self.misses == 0 ): return
+       dc.SetPen(wxPen(wxNamedColour('blue'), 10))
+       dc.DrawLine(300,100,300,200)
+       if ( self.misses == 1 ): return
+       dc.DrawEllipse(250,200,100,100)
+       if ( self.misses == 2 ): return
+       dc.DrawLine(300,300,300,600)
+       if ( self.misses == 3) : return
+       dc.DrawLine(300,300,250,550)
+       if ( self.misses == 4) : return
+       dc.DrawLine(300,300,350,550)
+       if ( self.misses == 5) : return
+       dc.DrawLine(300,600,350,850)
+       if ( self.misses == 6) : return
+       dc.DrawLine(300,600,250,850)
+    def OnPaint(self, event):
+       dc = wxPaintDC(self.panel)
+       self.Draw(dc)
+    def OnGameNew(self, event):
+       self.word = self.wf.Get()
+       self.guess = []
+       self.tries = 0
+       self.misses = 0
+       self.in_progress = 1
+       self.Draw()
+    def OnGameEnd(self, event):
+       self.UpdateAverages(0)
+       self.misses = 7;
+       self.guess = map(chr, range(ord('a'),ord('z')+1))
+       self.in_progress = 0
+       self.Draw()
+    def UpdateAverages(self, has_won):
+       if has_won:
+           self.won = self.won + 1
+       self.played = self.played+1
+       self.history.append(self.misses)
+       total = 0.0
+       for m in self.history:
+           total = total + m
+       self.average = float(total/len(self.history))
+    def OnChar(self, event):
+       if not self.in_progress:
+           self.OnGameNew(None)
+           return
+       key = event.KeyCode();
+       if key >= ord('A') and key <= ord('Z'):
+           key = key + ord('a') - ord('A')
+       key = chr(key)
+       if key < 'a' or key > 'z':
+           return
+       if self.guess.count(key):
+           self.SetStatusText('Already guessed %s' % (key,),0)
+           return
+       self.guess.append(key)
+       self.guess.sort()
+       guesses = ""
+       for letter in self.guess: 
+           guesses = guesses + letter
+       self.tries = self.tries+1
+       if not key in self.word:
+           self.misses = self.misses+1
+       if self.misses == 7:
+           self.SetStatusText("Too bad, you're dead!",0)
+           self.SetStatusText("Press a key to restart",1)
+           self.OnGameEnd(None)
+           return
+       has_won = 1
+       for letter in self.word:
+           if not self.guess.count(letter):
+               has_won = 0
+               break
+       if has_won:    
+           self.in_progress = 0
+           self.UpdateAverages(has_won)
+           self.SetStatusText("Congratulations!",0)
+           self.SetStatusText("Press a key to restart",1)
+           self.Draw()
+           return
+       self.SetStatusText(guesses,1)
+       self.SetStatusText("tries %d misses %d" % (self.tries,self.misses),0)
+       self.Draw()
+    def OnWindowClose(self, event):
+       self.Destroy()
+       
+class MyApp(wxApp):
+    def OnInit(self):
+       print "Reading word list"
+       wf = WordFetcher("/usr/share/games/hangman-words")
+       frame = MyFrame(wf)
+       self.SetTopWindow(frame)
+       frame.Show(TRUE)
+       return TRUE
+
+if __name__ == '__main__':
+    app = MyApp(0)
+    app.MainLoop()