Receita: Jogo de adivinhação
A lógica desse jogo é que o usuário pensa em um número de 1 à 60, e selecionando as tabelas em que o número aparece, o jogo adivinha o número que o usuário pensou.
Este exemplo mostra como trabalhar com o Tkinter para carregar imagens, criar frames, trabalhar com botões e caixas de checagem, messagebox.
Esse jogo foi criado com o intuito de utilizar Python para gerar programas em modo gráfico, sem ter que recorrer a instalação de novos recursos como PyGame, PyGtk.
Código
1 # -*- coding: cp1252 -*-
2 import Tkinter; Tk = Tkinter
3 import tkMessageBox
4
5 class App(Tk.Frame):
6 #cria o Frame e seta as variáveis do jogo
7 def __init__(self, master = None):
8 Tk.Frame.__init__ (self, master)
9
10 self.varA = Tk.IntVar()
11 self.varB = Tk.IntVar()
12 self.varC = Tk.IntVar()
13 self.varD = Tk.IntVar()
14 self.varE = Tk.IntVar()
15 self.varF = Tk.IntVar()
16
17 # carrega as imagens
18
19 def criaImagens(self):
20 self.__image_runner1__ = Tk.PhotoImage('runner1',file="1.gif")
21 self.__image_runner2__ = Tk.PhotoImage('runner2',file="2.gif")
22 self.__image_runner3__ = Tk.PhotoImage('runner3',file="3.gif")
23 self.__image_runner4__ = Tk.PhotoImage('runner4',file="4.gif")
24 self.__image_runner5__ = Tk.PhotoImage('runner5',file="5.gif")
25 self.__image_runner6__ = Tk.PhotoImage('runner6',file="6.gif")
26
27 # seta onde as imagens devem ser carregadas
28
29 self.img_1 = Tk.Label (self, {'image' : 'runner1'})
30 self.img_2 = Tk.Label (self, {'image' : 'runner2'})
31 self.img_3 = Tk.Label (self, {'image' : 'runner3'})
32 self.img_4 = Tk.Label (self, {'image' : 'runner4'})
33 self.img_5 = Tk.Label (self, {'image' : 'runner5'})
34 self.img_6 = Tk.Label (self, {'image' : 'runner6'})
35
36 #cria as caixas de checagem atribuindo a variável usada
37
38 def criaCheck(self):
39 self.a = Tk.Checkbutton(self, variable=self.varA)
40 self.b = Tk.Checkbutton(self, variable=self.varB)
41 self.c = Tk.Checkbutton(self, variable=self.varC)
42 self.d = Tk.Checkbutton(self, variable=self.varD)
43 self.e = Tk.Checkbutton(self, variable=self.varE)
44 self.f = Tk.Checkbutton(self, variable=self.varF)
45
46 #cria os botões
47
48 def criaBot(self):
49 self.btOK=Tk.Button(self, text = "Resultado", command=self.btOK)
50 self.btSAIR=Tk.Button(self, text = "Sair", command=self.btSAIR)
51
52 #configura as linhas e colunas do frame, que serão usadas para carregar as imagens, botões e caixas de checagem
53
54 def configuraFrame(self):
55 self.rowconfigure (1, {'weight' : 1, 'minsize' : 30})
56 self.rowconfigure (2, {'weight' : 0, 'minsize' : 30})
57 self.rowconfigure (3, {'weight' : 0, 'minsize' : 30})
58 self.rowconfigure (4, {'weight' : 0, 'minsize' : 30})
59 self.columnconfigure (1, {'weight' : 0, 'minsize' : 30})
60 self.columnconfigure (2, {'weight' : 0, 'minsize' : 30})
61 self.columnconfigure (3, {'weight' : 0, 'minsize' : 30})
62 self.columnconfigure (4, {'weight' : 0, 'minsize' : 30})
63 self.columnconfigure (5, {'weight' : 0, 'minsize' : 30})
64
65 #coloca o objeto(caixas, botões e imagens) em suas posições na tela (coluna x linha)
66
67 def posicionaObjetos(self):
68 self.img_1.grid({
69 'in' : self,
70 'column' : '1',
71 'row' : '1',
72 'sticky' : ''
73 })
74
75 self.img_2.grid({
76 'in' : self,
77 'column' : '2',
78 'row' : '1',
79 'sticky' : ''
80 })
81
82 self.img_3.grid({
83 'in' : self,
84 'column' : '3',
85 'row' : '1',
86 'sticky' : ''
87 })
88
89 self.img_4.grid({
90 'in' : self,
91 'column' : '1',
92 'row' : '3',
93 'sticky' : ''
94 })
95
96 self.img_5.grid({
97 'in' : self,
98 'column' : '2',
99 'row' : '3',
100 'sticky' : ''
101 })
102
103 self.img_6.grid({
104 'in' : self,
105 'column' : '3',
106 'row' : '3',
107 'sticky' : ''
108 })
109
110 self.a.grid({
111 'in' : self,
112 'column' : '1',
113 'row' : '2',
114 'sticky' : ''
115 })
116
117 self.b.grid({
118 'in' : self,
119 'column' : '2',
120 'row' : '2',
121 'sticky' : ''
122 })
123
124 self.c.grid({
125 'in' : self,
126 'column' : '3',
127 'row' : '2',
128 'sticky' : ''
129 })
130
131 self.d.grid({
132 'in' : self,
133 'column' : '1',
134 'row' : '4',
135 'sticky' : ''
136 })
137
138 self.e.grid({
139 'in' : self,
140 'column' : '2',
141 'row' : '4',
142 'sticky' : ''
143 })
144
145 self.f.grid({
146 'in' : self,
147 'column' : '3',
148 'row' : '4',
149 'sticky' : ''
150 })
151
152 self.btOK.grid({
153 'in' : self,
154 'column' : '2',
155 'row' : '5',
156 'sticky' : ''
157 })
158 self.btSAIR.grid({
159 'in' : self,
160 'column' : '3',
161 'row' : '5',
162 'sticky' : ''
163 })
164 #cria a função de retorno das variáveis das checkbox
165
166 def pegarA(self):
167 return self.varA.get()
168
169 def pegarB(self):
170 return self.varB.get()
171
172 def pegarC(self):
173 return self.varC.get()
174
175 def pegarD(self):
176 return self.varD.get()
177
178 def pegarE(self):
179 return self.varE.get()
180
181 def pegarF(self):
182 return self.varF.get()
183
184 #desenha a tela
185
186 def mostraFrame(self, **packOptions):
187 self.pack(packOptions)
188
189
190 def setres(self,res):
191 self.res = res
192
193 #define as funções do botão sair (fechar o jogo)
194
195 def btSAIR(self):
196 self.master.destroy()
197 self.destroy()
198
199 #define as funções do botão OK (pegar o valor das variáveis)
200
201 def btOK(self):
202 self.res.calcula(self)
203 self.varA.set(0)
204 self.varB.set(0)
205 self.varC.set(0)
206 self.varD.set(0)
207 self.varE.set(0)
208 self.varF.set(0)
209
210
211 #faz o calculo do número pensado, seguindo a lógica que se a primeira checkbox for selecionada o valor será 1, a segunda será 2, a terceira será 4, a quarta será 8, a quinta 16 e sexta 32. Pois a soma dos variáveis onde o número pensado aparece utiliza-se desta regra para dar a resposta ao usuário
212
213 class Resultado(Tk.Frame):
214 def calcula(self,app):
215 self.x = 0
216 if app.pegarA() == 1:
217 self.x+= 1
218 if app.pegarB() == 1:
219 self.x+= 2
220 if app.pegarC() == 1:
221 self.x+= 4
222 if app.pegarD() == 1:
223 self.x+= 8
224 if app.pegarE() == 1:
225 self.x+= 16
226 if app.pegarF() == 1:
227 self.x+= 32
228
229 res = self.montaTela()
230 return res
231 #cria a tela do resultado
232
233 def montaTela(self, master2=None):
234
235 if self.x <= 0:
236 res = tkMessageBox.showinfo("RESULTADO ", "Você não pensou em nenhum número")
237 elif self.x > 60:
238 res = tkMessageBox.showinfo("RESULTADO ", "Por favor pense em números de 1 a 60")
239 else:
240 res = tkMessageBox.showinfo("RESULTADO ", "Você pensou no número: "+str(self.x))
241
242 return res
243
244 def btSAIR(self):
245 self.master2.destroy()
246 #cria o aplicativo propriamente dito
247 def inicia():
248 app = App()
249 res = Resultado()
250
251 app.setres(res)
252 app.criaImagens()
253 app.criaCheck()
254 app.criaBot()
255 app.configuraFrame()
256 app.posicionaObjetos()
257 app.mostraFrame(fill = 'both', expand = 1)
258
259 app.mainloop ()
260
261
262 if __name__ == '__main__':
263 inicia()
Volta para CookBook.
Fabio Meincheim <fabio.jgs@gmail.com> Graduando em Sistemas de Informação no IST - Instituto Superior Tupy - Joinville - SC
Eduardo da Silva <eduardo.silva@gmail.com> Professor de programação do IST.