]>
git.saurik.com Git - wxWidgets.git/blob - utils/wxPython/tests/hangman.py
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 MyFrame(wxFrame
):
22 def __init__(self
, wf
):
24 wxFrame
.__init
__(self
, NULL
, -1, "test threads", wxDefaultPosition
, wxSize(300,200))
25 self
.panel
= wxPanel(self
, -1)
28 menu
.Append(1001, "New")
29 menu
.Append(1002, "End")
30 menu
.AppendSeparator()
31 menu
.Append(1003, "Exit")
34 menubar
.Append(menu
, "Game")
35 self
.SetMenuBar(menubar
)
36 self
.CreateStatusBar(2)
37 EVT_MENU(self
, 1001, self
.OnGameNew
)
38 EVT_MENU(self
, 1002, self
.OnGameEnd
)
39 EVT_MENU(self
, 1003, self
.OnWindowClose
)
40 EVT_CHAR(self
.panel
, self
.OnChar
)
46 def Draw(self
, dc
= None):
48 dc
= wxClientDC(self
.panel
)
50 (x
,y
) = self
.panel
.GetSizeTuple()
52 for letter
in self
.word
:
53 if self
.guess
.count(letter
):
54 dc
.DrawText(letter
, x1
, y1
)
56 dc
.DrawText('.', x1
, y1
)
59 dc
.DrawText("played: %d" % (self
.played
,), x1
, 50)
61 percent
= (100.*self
.won
)/self
.played
64 dc
.DrawText("won: %d (%g %%)" % (self
.won
, percent
), x1
, 70)
65 dc
.DrawText("average: %g" % (self
.average
,), x1
, 90)
66 dc
.SetUserScale(x
/1000., y
/1000.)
68 def DrawVictim(self
, dc
):
69 dc
.SetPen(wxPen(wxNamedColour('black'), 20))
70 dc
.DrawLines([(10, 980), (10,900), (700,900), (700,940), (720,940),
71 (720,980), (900,980)])
72 dc
.DrawLines([(100,900), (100, 100), (300,100)])
73 dc
.DrawLine(100,200,200,100)
74 if ( self
.misses
== 0 ): return
75 dc
.SetPen(wxPen(wxNamedColour('blue'), 10))
76 dc
.DrawLine(300,100,300,200)
77 if ( self
.misses
== 1 ): return
78 dc
.DrawEllipse(250,200,100,100)
79 if ( self
.misses
== 2 ): return
80 dc
.DrawLine(300,300,300,600)
81 if ( self
.misses
== 3) : return
82 dc
.DrawLine(300,300,250,550)
83 if ( self
.misses
== 4) : return
84 dc
.DrawLine(300,300,350,550)
85 if ( self
.misses
== 5) : return
86 dc
.DrawLine(300,600,350,850)
87 if ( self
.misses
== 6) : return
88 dc
.DrawLine(300,600,250,850)
89 def OnPaint(self
, event
):
90 dc
= wxPaintDC(self
.panel
)
92 def OnGameNew(self
, event
):
93 self
.word
= self
.wf
.Get()
99 def OnGameEnd(self
, event
):
100 self
.UpdateAverages(0)
102 self
.guess
= map(chr, range(ord('a'),ord('z')+1))
105 def UpdateAverages(self
, has_won
):
107 self
.won
= self
.won
+ 1
108 self
.played
= self
.played
+1
109 self
.history
.append(self
.misses
)
111 for m
in self
.history
:
113 self
.average
= float(total
/len(self
.history
))
114 def OnChar(self
, event
):
115 if not self
.in_progress
:
118 key
= event
.KeyCode();
119 if key
>= ord('A') and key
<= ord('Z'):
120 key
= key
+ ord('a') - ord('A')
122 if key
< 'a' or key
> 'z':
124 if self
.guess
.count(key
):
125 self
.SetStatusText('Already guessed %s' % (key
,),0)
127 self
.guess
.append(key
)
130 for letter
in self
.guess
:
131 guesses
= guesses
+ letter
132 self
.tries
= self
.tries
+1
133 if not key
in self
.word
:
134 self
.misses
= self
.misses
+1
136 self
.SetStatusText("Too bad, you're dead!",0)
137 self
.SetStatusText("Press a key to restart",1)
141 for letter
in self
.word
:
142 if not self
.guess
.count(letter
):
147 self
.UpdateAverages(has_won
)
148 self
.SetStatusText("Congratulations!",0)
149 self
.SetStatusText("Press a key to restart",1)
152 self
.SetStatusText(guesses
,1)
153 self
.SetStatusText("tries %d misses %d" % (self
.tries
,self
.misses
),0)
155 def OnWindowClose(self
, event
):
160 print "Reading word list"
161 wf
= WordFetcher("/usr/share/games/hangman-words")
163 self
.SetTopWindow(frame
)
167 if __name__
== '__main__':