]>
git.saurik.com Git - wxWidgets.git/blob - utils/wxPython/tests/hangman.py
0f339f00bcfe6261fc9c9a2fd39e69d5226e2f74
2 from wxPython
.wx
import *
5 def __init__(self
, filename
):
7 f
= open(filename
, "r")
9 print "Couldn't open dictionary file %s, using build-ins" % (filename
,)
10 self
.words
= self
.builtin_words
13 while f
and len(self
.words
)<100:
15 self
.words
.append(line
[0:-1])
18 return self
.words
[int(random
.random()*len(self
.words
))]
19 builtin_words
= [ 'albatros', 'banana', 'electrometer', 'eggshell' ]
21 class HangmanWnd(wxWindow
):
22 def __init__(self
, parent
, id):
23 wxWindow
.__init
__(self
, parent
, id)
24 self
.SetBackgroundColour(wxNamedColour('white'))
26 self
.frame
= parent
# ugly
27 def StartGame(self
, word
):
35 self
.guess
= map(chr, range(ord('a'),ord('z')+1))
37 def HandleKey(self
, key
):
38 if self
.guess
.count(key
):
39 self
.frame
.SetStatusText('Already guessed %s' % (key
,),0)
41 self
.guess
.append(key
)
43 self
.tries
= self
.tries
+1
44 if not key
in self
.word
:
45 self
.misses
= self
.misses
+1
50 for letter
in self
.word
:
51 if not self
.guess
.count(letter
):
59 def Draw(self
, dc
= None):
63 (x
,y
) = self
.GetSizeTuple()
65 for letter
in self
.word
:
66 if self
.guess
.count(letter
):
67 dc
.DrawText(letter
, x1
, y1
)
69 dc
.DrawText('.', x1
, y1
)
72 dc
.DrawText("tries %d misses %d" % (self
.tries
,self
.misses
),x1
,50)
74 for letter
in self
.guess
:
75 guesses
= guesses
+ letter
76 dc
.DrawText("guessed:", x1
, 70)
77 dc
.DrawText(guesses
[:13], x1
+70, 70)
78 dc
.DrawText(guesses
[13:], x1
+70, 90)
79 dc
.SetUserScale(x
/1000., y
/1000.)
81 def DrawVictim(self
, dc
):
82 dc
.SetPen(wxPen(wxNamedColour('black'), 20))
83 dc
.DrawLines([(10, 980), (10,900), (700,900), (700,940), (720,940),
84 (720,980), (900,980)])
85 dc
.DrawLines([(100,900), (100, 100), (300,100)])
86 dc
.DrawLine(100,200,200,100)
87 if ( self
.misses
== 0 ): return
88 dc
.SetPen(wxPen(wxNamedColour('blue'), 10))
89 dc
.DrawLine(300,100,300,200)
90 if ( self
.misses
== 1 ): return
91 dc
.DrawEllipse(250,200,100,100)
92 if ( self
.misses
== 2 ): return
93 dc
.DrawLine(300,300,300,600)
94 if ( self
.misses
== 3) : return
95 dc
.DrawLine(300,300,250,550)
96 if ( self
.misses
== 4) : return
97 dc
.DrawLine(300,300,350,550)
98 if ( self
.misses
== 5) : return
99 dc
.DrawLine(300,600,350,850)
100 if ( self
.misses
== 6) : return
101 dc
.DrawLine(300,600,250,850)
102 def OnPaint(self
, event
):
106 class MyFrame(wxFrame
):
107 def __init__(self
, wf
):
109 wxFrame
.__init
__(self
, NULL
, -1, "hangman", wxDefaultPosition
, wxSize(400,300))
110 self
.wnd
= HangmanWnd(self
, -1)
112 menu
.Append(1001, "New")
113 menu
.Append(1002, "End")
114 menu
.AppendSeparator()
115 menu
.Append(1003, "Reset")
116 menu
.AppendSeparator()
117 menu
.Append(1004, "Exit")
118 menubar
= wxMenuBar()
119 menubar
.Append(menu
, "Game")
121 menu
.Append(1010, "Internal", "Use internal dictionary", TRUE
)
122 menu
.Append(1011, "ASCII File...")
123 menubar
.Append(menu
, "Dictionary")
124 self
.SetMenuBar(menubar
)
125 self
.CreateStatusBar(2)
126 EVT_MENU(self
, 1001, self
.OnGameNew
)
127 EVT_MENU(self
, 1002, self
.OnGameEnd
)
128 EVT_MENU(self
, 1003, self
.OnGameReset
)
129 EVT_MENU(self
, 1004, self
.OnWindowClose
)
130 EVT_MENU(self
, 1011, self
.OnDictFile
)
131 EVT_CHAR(self
.wnd
, self
.OnChar
)
133 def OnGameNew(self
, event
):
136 self
.SetStatusText("",0)
137 self
.wnd
.StartGame(word
)
138 def OnGameEnd(self
, event
):
139 self
.UpdateAverages(0)
141 self
.SetStatusText("",0)
143 def OnGameReset(self
, event
=None):
149 def OnDictFile(self
, event
):
151 def UpdateAverages(self
, has_won
):
153 self
.won
= self
.won
+ 1
154 self
.played
= self
.played
+1
155 self
.history
.append(self
.wnd
.misses
) # ugly
157 for m
in self
.history
:
159 self
.average
= float(total
/len(self
.history
))
160 def OnChar(self
, event
):
161 if not self
.in_progress
:
164 key
= event
.KeyCode();
165 if key
>= ord('A') and key
<= ord('Z'):
166 key
= key
+ ord('a') - ord('A')
168 if key
< 'a' or key
> 'z':
171 res
= self
.wnd
.HandleKey(key
)
173 self
.UpdateAverages(0)
174 self
.SetStatusText("Too bad, you're dead!",0)
178 self
.UpdateAverages(1)
179 self
.SetStatusText("Congratulations!",0)
181 percent
= (100.*self
.won
)/self
.played
184 self
.SetStatusText("p %d, w %d (%g %%), av %g" % (self
.played
,self
.won
, percent
, self
.average
),1)
186 def OnWindowClose(self
, event
):
191 print "Reading word list"
192 wf
= WordFetcher("/usr/share/games/hangman-words")
194 self
.SetTopWindow(frame
)
198 if __name__
== '__main__':