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

source: main.py @ 175:fde515c7a4c8

Revision 175:fde515c7a4c8, 6.3 KB checked in by Alex Martynov, 5 years ago (diff)

fixed bug of encreased speed of the game by multiple

clicking the run button,

added UI.run_cancel()

  • 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ˆà ˆà ˆà ˆà
142ˆà ˆà defˆàrestart(self,ˆàsurvived):
143ˆà ˆà ˆà ˆà """"Restarts snakes positions after the end of the game
144
145ˆà ˆà ˆà ˆà Options:
146ˆà ˆà ˆà ˆà survived = "yes" - restarts next round only with snakes survived in previous round
147ˆà ˆà ˆà ˆà survived = "no" - restart next roun with all snakes played in previous round"""
148ˆà ˆà ˆà ˆà ifˆàsurvived ==ˆà"yes":
149ˆà ˆà ˆà ˆà ˆà ˆà snake_set =ˆàself.engine.snakes
150ˆà ˆà ˆà ˆà else:
151ˆà ˆà ˆà ˆà ˆà ˆà snake_set =ˆàself.engine.psnakesˆà ˆà ˆà ˆà ˆà
152ˆà ˆà ˆà ˆà self.step_id =ˆà0
153ˆà ˆà ˆà ˆà forˆài,ˆàsnake inˆàenumerate(snake_set):
154ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake_set[i]ˆà!=ˆàNone:
155ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.engine.snakes[i]ˆà=ˆàsnake
156ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.engine.create_snake(i,ˆàsnake)
157ˆà ˆà ˆà ˆà self.engine.refill()
158ˆà ˆà ˆà ˆà self.engine.redraw()
159
160ˆà ˆà defˆàendˆà(self):
161ˆà ˆà ˆà ˆà """End the game and raise the window that tels about it."""
162ˆà ˆà ˆà ˆà self.run_cancel()
163ˆà ˆà ˆà ˆà self.step_id =ˆàself.game_length +ˆà666
164ˆà ˆà ˆà ˆà root =ˆàtk.Tk()
165ˆà ˆà ˆà ˆà end_label =ˆàtk.Label(root,ˆàtext="End")
166ˆà ˆà ˆà ˆà end_label.pack()
167ˆà ˆà ˆà ˆà root.mainloop()
168ˆà ˆà ˆà ˆà pass
169
170ifˆà__name__ ==ˆà"__main__":
171ˆà ˆà snake_batle =ˆàUI()
172ˆà ˆà snake_batle.root.mainloop()
Note: See TracBrowser for help on using the repository browser.