]> git.saurik.com Git - wxWidgets.git/blob - utils/wxPython/tests/hangman.py
8a359f77f1e86f10e3791bb208c5de91f78a666b
[wxWidgets.git] / utils / wxPython / tests / hangman.py
1 import random
2 from wxPython.wx import *
3
4 class WordFetcher:
5 def __init__(self, filename):
6 try:
7 f = open(filename, "r")
8 except:
9 print "Couldn't open dictionary file %s, using build-ins" % (filename,)
10 self.words = self.builtin_words
11 return
12 self.words = []
13 while f and len(self.words)<100:
14 line = f.readline()
15 self.words.append(line[0:-1])
16 print self.words
17 def Get(self):
18 return self.words[int(random.random()*len(self.words))]
19 builtin_words = [ 'albatros', 'banana', 'electrometer', 'eggshell' ]
20
21 class MyFrame(wxFrame):
22 def __init__(self, wf):
23 self.wf = wf
24 wxFrame.__init__(self, NULL, -1, "test threads", wxDefaultPosition, wxSize(300,200))
25 self.panel = wxPanel(self, -1)
26 self.panel.SetBackgroundColour(wxNamedColour('white'))
27 self.panel.SetFocus()
28 menu = wxMenu()
29 menu.Append(1001, "New")
30 menu.Append(1002, "End")
31 menu.AppendSeparator()
32 menu.Append(1003, "Exit")
33 self.cnt = 0;
34 menubar = wxMenuBar()
35 menubar.Append(menu, "Game")
36 self.SetMenuBar(menubar)
37 self.CreateStatusBar(2)
38 EVT_MENU(self, 1001, self.OnGameNew)
39 EVT_MENU(self, 1002, self.OnGameEnd)
40 EVT_MENU(self, 1003, self.OnWindowClose)
41 EVT_CHAR(self.panel, self.OnChar)
42 self.played = 0
43 self.won = 0
44 self.history = []
45 self.average = 0.0
46 self.OnGameNew(None)
47 def Draw(self, dc = None):
48 if not dc:
49 dc = wxClientDC(self.panel)
50 dc.Clear()
51 (x,y) = self.panel.GetSizeTuple()
52 x1 = x-150; y1 = 20
53 for letter in self.word:
54 if self.guess.count(letter):
55 dc.DrawText(letter, x1, y1)
56 else:
57 dc.DrawText('.', x1, y1)
58 x1 = x1 + 10
59 x1 = x-150
60 dc.DrawText("played: %d" % (self.played,), x1, 50)
61 if self.played:
62 percent = (100.*self.won)/self.played
63 else:
64 percent = 0.0
65 dc.DrawText("won: %d (%g %%)" % (self.won, percent), x1, 70)
66 dc.DrawText("average: %g" % (self.average,), x1, 90)
67 dc.SetUserScale(x/1000., y/1000.)
68 self.DrawVictim(dc)
69 def DrawVictim(self, dc):
70 dc.SetPen(wxPen(wxNamedColour('black'), 20))
71 dc.DrawLines([(10, 980), (10,900), (700,900), (700,940), (720,940),
72 (720,980), (900,980)])
73 dc.DrawLines([(100,900), (100, 100), (300,100)])
74 dc.DrawLine(100,200,200,100)
75 if ( self.misses == 0 ): return
76 dc.SetPen(wxPen(wxNamedColour('blue'), 10))
77 dc.DrawLine(300,100,300,200)
78 if ( self.misses == 1 ): return
79 dc.DrawEllipse(250,200,100,100)
80 if ( self.misses == 2 ): return
81 dc.DrawLine(300,300,300,600)
82 if ( self.misses == 3) : return
83 dc.DrawLine(300,300,250,550)
84 if ( self.misses == 4) : return
85 dc.DrawLine(300,300,350,550)
86 if ( self.misses == 5) : return
87 dc.DrawLine(300,600,350,850)
88 if ( self.misses == 6) : return
89 dc.DrawLine(300,600,250,850)
90 def OnPaint(self, event):
91 dc = wxPaintDC(self.panel)
92 self.Draw(dc)
93 def OnGameNew(self, event):
94 self.word = self.wf.Get()
95 self.guess = []
96 self.tries = 0
97 self.misses = 0
98 self.in_progress = 1
99 self.Draw()
100 def OnGameEnd(self, event):
101 self.UpdateAverages(0)
102 self.misses = 7;
103 self.guess = map(chr, range(ord('a'),ord('z')+1))
104 self.in_progress = 0
105 self.Draw()
106 def UpdateAverages(self, has_won):
107 if has_won:
108 self.won = self.won + 1
109 self.played = self.played+1
110 self.history.append(self.misses)
111 total = 0.0
112 for m in self.history:
113 total = total + m
114 self.average = float(total/len(self.history))
115 def OnChar(self, event):
116 if not self.in_progress:
117 self.OnGameNew(None)
118 return
119 key = event.KeyCode();
120 if key >= ord('A') and key <= ord('Z'):
121 key = key + ord('a') - ord('A')
122 key = chr(key)
123 if key < 'a' or key > 'z':
124 return
125 if self.guess.count(key):
126 self.SetStatusText('Already guessed %s' % (key,),0)
127 return
128 self.guess.append(key)
129 self.guess.sort()
130 guesses = ""
131 for letter in self.guess:
132 guesses = guesses + letter
133 self.tries = self.tries+1
134 if not key in self.word:
135 self.misses = self.misses+1
136 if self.misses == 7:
137 self.SetStatusText("Too bad, you're dead!",0)
138 self.SetStatusText("Press a key to restart",1)
139 self.OnGameEnd(None)
140 return
141 has_won = 1
142 for letter in self.word:
143 if not self.guess.count(letter):
144 has_won = 0
145 break
146 if has_won:
147 self.in_progress = 0
148 self.UpdateAverages(has_won)
149 self.SetStatusText("Congratulations!",0)
150 self.SetStatusText("Press a key to restart",1)
151 self.Draw()
152 return
153 self.SetStatusText(guesses,1)
154 self.SetStatusText("tries %d misses %d" % (self.tries,self.misses),0)
155 self.Draw()
156 def OnWindowClose(self, event):
157 self.Destroy()
158
159 class MyApp(wxApp):
160 def OnInit(self):
161 print "Reading word list"
162 wf = WordFetcher("/usr/share/games/hangman-words")
163 frame = MyFrame(wf)
164 self.SetTopWindow(frame)
165 frame.Show(TRUE)
166 return TRUE
167
168 if __name__ == '__main__':
169 app = MyApp(0)
170 app.MainLoop()