From: Harco de Hilster Date: Fri, 26 Mar 1999 23:07:46 +0000 (+0000) Subject: very silly sample X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/35c1ca4bea22cd95ab36b358f4184dc498dcf3c6 very silly sample git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1984 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/utils/wxPython/tests/hangman.py b/utils/wxPython/tests/hangman.py new file mode 100644 index 0000000000..7b4e89d327 --- /dev/null +++ b/utils/wxPython/tests/hangman.py @@ -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()