Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ îðèãèíàëüíîãî äîêóìåíòà : http://kodomo.cmm.msu.su/trac/snake/browser/main.py?rev=184
Äàòà èçìåíåíèÿ: Unknown
Äàòà èíäåêñèðîâàíèÿ: Sun Apr 10 19:57:16 2016
Êîäèðîâêà: IBM-866
main.py òÀÓ Python Battle

source: main.py @ 184:59c2be771f94

Revision 184:59c2be771f94, 7.6 KB checked in by Alex Martynov, 5 years ago (diff)

added the color presentation of the winer snake

  • Property exe set to *
Lineˆà
1importˆàTkinterˆàasˆàtk
2importˆàtkFileDialogˆàasˆàtkfd
3importˆàengine
4importˆàsnake
5
6
7
8classˆàUI(object):
9ˆà ˆà """User Interface:
10
11ˆà ˆà Atributes:
12
13ˆà ˆà - 'root' - root Window game placed at
14ˆà ˆà - 'engine' - engine of the game
15ˆà ˆà - 'canvas' - Widget field is pictured at
16ˆà ˆà - 'step_id' - current step of the game
17ˆà ˆà - 'after_id' - identificator of runing game process
18ˆà ˆà - 'step_legth' - length of the step (in ms)
19ˆà ˆà - 'game_length' - number of the steps in one round of the game"""
20ˆà ˆà defˆà__init__ˆà(self):
21ˆà ˆà ˆà ˆà """Create Python Battle game window.
22ˆà ˆà ˆà ˆà Initialyze engige of the game."""
23ˆà ˆà ˆà ˆà self.root =ˆàtk.Tk()
24ˆà ˆà ˆà ˆà self.root.title("Python Battle")
25ˆà ˆà ˆà ˆà self.canvas =ˆàtk.Canvas(self.root,ˆàbackground =ˆà"black")
26ˆà ˆà ˆà ˆà self.canvas.pack(side ="top",ˆàfill="both",ˆàexpand="yes")
27ˆà ˆà ˆà ˆà self.buttons_pack(self.root).pack(side ="bottom",ˆàfill="both",ˆàexpand="no")
28ˆà ˆà ˆà ˆà self.step_id =ˆà0
29ˆà ˆà ˆà ˆà self.engine =ˆàengine.Engine(self.canvas)
30ˆà ˆà ˆà ˆà self.after_id =ˆàNone
31ˆà ˆà ˆà ˆà self.step_length =ˆà150
32ˆà ˆà ˆà ˆà self.game_length =ˆà200
33ˆà ˆà ˆà ˆà return
34ˆà ˆà
35ˆà ˆà defˆàbuttons_pack(self,ˆàroot):
36ˆà ˆà ˆà ˆà """Packing the buttons in root frame.
37ˆà ˆà ˆà ˆà Definition of button functions.
38
39ˆà ˆà ˆà ˆà 'Load' - ask for snake file load
40ˆà ˆà ˆà ˆà 'Run' - runs the game/next round. Next round starts with snakes survived in previous
41ˆà ˆà ˆà ˆà 'Step' - do the next dtep of the game
42ˆà ˆà ˆà ˆà 'End' - manual end of the game
43ˆà ˆà ˆà ˆà 'Restart" - restart the field with snakes of previous round"""
44ˆà ˆà ˆà ˆà buttons =ˆàtk.Frame(root)
45ˆà ˆà ˆà ˆà load_1 =ˆàtk.Button(buttons,ˆàtext="Load 1",ˆàcommand=lambda:ˆàself.load(0))
46ˆà ˆà ˆà ˆà load_1.grid(row=1,ˆàcolumn=2,ˆàstick="news")
47ˆà ˆà ˆà ˆà load_2 =ˆàtk.Button(buttons,ˆàtext="Load 2",ˆàcommand=lambda:ˆàself.load(1))
48ˆà ˆà ˆà ˆà load_2.grid(row=2,ˆàcolumn=3,ˆàstick="news")
49ˆà ˆà ˆà ˆà run_b =ˆàtk.Button(buttons,ˆàtext="Run",ˆàcommand=lambda:ˆàself.start())
50ˆà ˆà ˆà ˆà run_b.grid(row=2,ˆàcolumn=2,ˆàstick="news")
51ˆà ˆà ˆà ˆà restart_b =ˆàtk.Button(buttons,ˆàtext="Restart",ˆàcommand=lambda:ˆàself.restart(survived="no"))
52ˆà ˆà ˆà ˆà restart_b.grid(row=1,ˆàcolumn=5,ˆàstick="news")
53ˆà ˆà ˆà ˆà load_3 =ˆàtk.Button(buttons,ˆàtext="Load 3",ˆàcommand=lambda:ˆàself.load(2))
54ˆà ˆà ˆà ˆà load_3.grid(row=3,ˆàcolumn=2,ˆàstick="news")
55ˆà ˆà ˆà ˆà load_4 =ˆàtk.Button(buttons,ˆàtext="Load 4",ˆàcommand=lambda:ˆàself.load(3))
56ˆà ˆà ˆà ˆà load_4.grid(row=2,ˆàcolumn=1,ˆàstick="news")
57ˆà ˆà ˆà ˆà step_b =ˆàtk.Button(buttons,ˆàtext="Step",ˆàcommand=lambda:ˆàself.step())
58ˆà ˆà ˆà ˆà step_b.grid(row=2,ˆàcolumn=5,ˆàstick="news")
59ˆà ˆà ˆà ˆà end_b =ˆàtk.Button(buttons,ˆàtext="End",ˆàcommand=lambda:ˆàself.end())
60ˆà ˆà ˆà ˆà end_b.grid(row=3,ˆàcolumn=5,ˆàstick="news")
61ˆà ˆà ˆà ˆà forˆàcolumn inˆàrange(1,ˆà6):
62ˆà ˆà ˆà ˆà ˆà buttons.grid_columnconfigure(column,ˆàweight=1)
63ˆà ˆà ˆà ˆà returnˆàbuttons
64ˆà ˆà
65ˆà ˆà defˆàloadˆà(self,ˆàsnake_number):
66ˆà ˆà ˆà ˆà """Ask for snake file loading.
67ˆà ˆà ˆà ˆà Initialyzing snake and draw it on the field.
68ˆà ˆà ˆà ˆà Return field back to default (without snakes) after end of the game."""
69ˆà ˆà ˆà ˆà ifˆàself.step_id ==ˆàself.game_length +ˆà666:
70ˆà ˆà ˆà ˆà ˆà ˆà self.step_id =ˆà0
71ˆà ˆà ˆà ˆà ˆà ˆà self.engine.snakes =ˆà[None,ˆàNone,ˆàNone,ˆàNone]
72ˆà ˆà ˆà ˆà ˆà ˆà pass
73ˆà ˆà ˆà ˆà ifˆàself.step_id ==ˆà0:
74ˆà ˆà ˆà ˆà ˆà ˆà fileˆà=ˆàtkfd.askopenfile(title="Open file")
75ˆà ˆà ˆà ˆà ˆà ˆà ifˆàfileˆà==ˆàNone:
76ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà return
77ˆà ˆà ˆà ˆà ˆà ˆà snake =ˆàself.engine.create_snake(snake_number)
78ˆà ˆà ˆà ˆà ˆà ˆà snake.load(file)
79ˆà ˆà ˆà ˆà ˆà ˆà pass
80ˆà ˆà ˆà ˆà self.engine.refill()
81ˆà ˆà ˆà ˆà self.engine.redraw()
82ˆà ˆà ˆà ˆà return
83
84ˆà ˆà defˆàstartˆà(self):
85ˆà ˆà ˆà ˆà """Init running of the game."""
86ˆà ˆà ˆà ˆà ifˆàself.after_id !=ˆàNone:
87ˆà ˆà ˆà ˆà ˆà ˆà return
88ˆà ˆà ˆà ˆà ifˆàself.step_id ==ˆàself.game_length +ˆà666:
89ˆà ˆà ˆà ˆà ˆà ˆà self.restart(survived="yes")
90ˆà ˆà ˆà ˆà ifˆàself.step_id ==ˆà0:
91ˆà ˆà ˆà ˆà ˆà ˆà self.engine.psnakes =ˆàself.engine.snakes[:]
92ˆà ˆà ˆà ˆà self.run()
93ˆà ˆà ˆà ˆà
94ˆà ˆà defˆàrunˆà(self):
95ˆà ˆà ˆà ˆà """Run the game with 'step_length' ms step
96ˆà ˆà ˆà ˆà After the end of the game - restarts it with snakes survived in
97ˆà ˆà ˆà ˆà previous game"""
98ˆà ˆà ˆà ˆà ifˆàself.step_id >ˆàself.game_length:
99ˆà ˆà ˆà ˆà ˆà ˆà self.end()
100ˆà ˆà ˆà ˆà ˆà ˆà return
101ˆà ˆà ˆà ˆà ifˆàself.dead_snake_check()ˆà==ˆàFalse:
102ˆà ˆà ˆà ˆà ˆà ˆà return
103ˆà ˆà ˆà ˆà self.step_id =ˆàself.step_id+1
104ˆà ˆà ˆà ˆà self.engine.step()
105ˆà ˆà ˆà ˆà self.after_id =ˆàself.canvas.after(self.step_length,ˆàself.run)
106ˆà ˆà ˆà ˆà return
107ˆà ˆà
108ˆà ˆà defˆàstepˆà(self):
109ˆà ˆà ˆà ˆà """Do the next game step"""
110ˆà ˆà ˆà ˆà ifˆàself.dead_snake_check()ˆà==ˆàFalse:
111ˆà ˆà ˆà ˆà ˆà ˆà return
112ˆà ˆà ˆà ˆà ifˆàself.step_id ==ˆà0:
113ˆà ˆà ˆà ˆà ˆà ˆà self.engine.psnakes =ˆàself.engine.snakes[:]
114ˆà ˆà ˆà ˆà ifˆàself.step_id <=ˆàself.game_length:
115ˆà ˆà ˆà ˆà ˆà ˆà self.run_cancel()
116ˆà ˆà ˆà ˆà ˆà ˆà self.step_id =ˆàself.step_id+1
117ˆà ˆà ˆà ˆà ˆà ˆà self.engine.step()
118ˆà ˆà ˆà ˆà ˆà ˆà pass
119ˆà ˆà ˆà ˆà else:
120ˆà ˆà ˆà ˆà ˆà ˆà self.end()
121ˆà ˆà ˆà ˆà ˆà ˆà pass
122ˆà ˆà ˆà ˆà return
123
124ˆà ˆà defˆàrun_cancel(self):
125ˆà ˆà ˆà ˆà """Stops runnin of the game"""
126ˆà ˆà ˆà ˆà ifˆàself.after_id !=ˆàNone:
127ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.after_cancel(self.after_id)
128ˆà ˆà ˆà ˆà ˆà ˆà self.after_id =ˆàNone
129ˆà ˆà
130ˆà ˆà defˆàdead_snake_check(self):
131ˆà ˆà ˆà ˆà """Check the number of snakes alive.
132ˆà ˆà ˆà ˆà End the game if alive snake number is less than two."""
133ˆà ˆà ˆà ˆà dead_snakes =ˆà0
134ˆà ˆà ˆà ˆà forˆàsnake inˆàself.engine.snakes:
135ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake ==ˆàNone:
136ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà dead_snakes=dead_snakes+1
137ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà pass
138ˆà ˆà ˆà ˆà ifˆàdead_snakes >=ˆà3:
139ˆà ˆà ˆà ˆà ˆà ˆà self.end()
140ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse
141ˆà ˆà defˆàsnake_len_check(self):
142ˆà ˆà ˆà ˆà """Get the snake with maximum length - the winer
143
144ˆà ˆà ˆà ˆà Return:
145ˆà ˆà ˆà ˆà winer - list of snake or snakes with max length
146ˆà ˆà ˆà ˆà length - this maximum length"""
147ˆà ˆà ˆà ˆà length=0
148ˆà ˆà ˆà ˆà winer =ˆà[]
149ˆà ˆà ˆà ˆà forˆàsnake inˆàself.engine.snakes:
150ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake !=ˆàNone:
151ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ifˆàlen(snake.cells)ˆà>ˆàlength:
152ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà length =ˆàlen(snake.cells)
153ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà winer =ˆà[snake]
154ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà elifˆàlen(snake.cells)ˆà==ˆàlength:
155ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà winer.append(snake)ˆà ˆà
156ˆà ˆà ˆà ˆà returnˆàwiner,ˆàlength
157ˆà ˆà ˆà ˆà
158ˆà ˆà ˆà ˆà
159ˆà ˆà defˆàrestart(self,ˆàsurvived):
160ˆà ˆà ˆà ˆà """"Restarts snakes positions after the end of the game
161
162ˆà ˆà ˆà ˆà Options:
163ˆà ˆà ˆà ˆà survived = "yes" - restarts next round only with snakes survived in previous round
164ˆà ˆà ˆà ˆà survived = "no" - restart next roun with all snakes played in previous round"""
165ˆà ˆà ˆà ˆà ifˆàsurvived ==ˆà"yes":
166ˆà ˆà ˆà ˆà ˆà ˆà snake_set =ˆàself.engine.snakes
167ˆà ˆà ˆà ˆà else:
168ˆà ˆà ˆà ˆà ˆà ˆà snake_set =ˆàself.engine.psnakesˆà ˆà ˆà ˆà ˆà
169ˆà ˆà ˆà ˆà self.step_id =ˆà0
170ˆà ˆà ˆà ˆà forˆài,ˆàsnake inˆàenumerate(snake_set):
171ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake_set[i]ˆà!=ˆàNone:
172ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.engine.snakes[i]ˆà=ˆàsnake
173ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.engine.create_snake(i,ˆàsnake)
174ˆà ˆà ˆà ˆà self.engine.refill()
175ˆà ˆà ˆà ˆà self.engine.redraw()
176
177ˆà ˆà defˆàendˆà(self):
178ˆà ˆà ˆà ˆà """End the round and raise the label that tels about it."""
179ˆà ˆà ˆà ˆà self.run_cancel()
180ˆà ˆà ˆà ˆà self.step_id =ˆàself.game_length +ˆà666
181ˆà ˆà ˆà ˆà field_geometry,ˆàoffset =ˆàself.engine.field_geometry_calc()[0:2]
182ˆà ˆà ˆà ˆà self.engine.redraw()
183ˆà ˆà ˆà ˆà self.canvas.create_text(offset[0]+ˆàfield_geometry[0]/2.0,ˆàoffset[1]+field_geometry[1]/2.0,ˆàtext="End of the round",ˆàfill="white",ˆàfont="bold")
184ˆà ˆà ˆà ˆà winer,ˆàlength =ˆàself.snake_len_check()
185ˆà ˆà ˆà ˆà ifˆàlen(winer)ˆà>ˆà1:
186ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.create_text(offset[0]+ˆàfield_geometry[0]/2.0,ˆàoffset[1]+field_geometry[1]*2.0/3.0,ˆàtext="Number of winers: %s"ˆà%(len(winer)),ˆàfill="white",ˆàfont="bold")
187ˆà ˆà ˆà ˆà else:
188ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.create_text(offset[0]+ˆàfield_geometry[0]/2.0,ˆàoffset[1]+field_geometry[1]*2.0/3.0,ˆàtext="Winer: %s(%s)"ˆà%(winer[0].name,ˆàwiner[0].color),ˆàfill="white",ˆàfont="bold")
189ˆà ˆà ˆà ˆà self.canvas.create_text(offset[0]+ˆàfield_geometry[0]/2.0,ˆàoffset[1]+field_geometry[1]*3.0/4.0,ˆàtext="Total winer length: %s"ˆà%(length),ˆàfill="white",ˆàfont="bold")
190ˆà ˆà ˆà ˆà pass
191
192ifˆà__name__ ==ˆà"__main__":
193ˆà ˆà snake_batle =ˆàUI()
194ˆà ˆà snake_batle.root.mainloop()
Note: See TracBrowser for help on using the repository browser.