Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ îðèãèíàëüíîãî äîêóìåíòà : http://kodomo.cmm.msu.su/trac/snake/browser/main.py?rev=173%3A008be193a0a3
Äàòà èçìåíåíèÿ: Unknown
Äàòà èíäåêñèðîâàíèÿ: Mon Apr 11 02:41:51 2016
Êîäèðîâêà: IBM-866
main.py òÀÓ Python Battle

source: main.py @ 173:008be193a0a3

Revision 173:008be193a0a3, 6.2 KB checked in by Alex Martynov, 5 years ago (diff)

fixed not correct work of UI.restart() if whole game was made by steps

  • 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.step_id ==ˆàself.game_length +ˆà666:
87ˆà ˆà ˆà ˆà ˆà ˆà self.restart(survived="yes")
88ˆà ˆà ˆà ˆà self.engine.psnakes =ˆàself.engine.snakes[:]
89ˆà ˆà ˆà ˆà self.run()
90ˆà ˆà ˆà ˆà
91ˆà ˆà defˆàrunˆà(self):
92ˆà ˆà ˆà ˆà """Run the game with 'step_length' ms step
93ˆà ˆà ˆà ˆà After the end of the game - restarts it with snakes survived in
94ˆà ˆà ˆà ˆà previous game"""
95ˆà ˆà ˆà ˆà ifˆàself.step_id >ˆàself.game_length:
96ˆà ˆà ˆà ˆà ˆà ˆà self.end()
97ˆà ˆà ˆà ˆà ˆà ˆà return
98ˆà ˆà ˆà ˆà ifˆàself.dead_snake_check()ˆà==ˆàFalse:
99ˆà ˆà ˆà ˆà ˆà ˆà return
100ˆà ˆà ˆà ˆà self.step_id =ˆàself.step_id+1
101ˆà ˆà ˆà ˆà self.engine.step()
102ˆà ˆà ˆà ˆà self.after_id =ˆàself.canvas.after(self.step_length,ˆàself.run)
103ˆà ˆà ˆà ˆà return
104ˆà ˆà
105ˆà ˆà defˆàstepˆà(self):
106ˆà ˆà ˆà ˆà """Do the next game step"""
107ˆà ˆà ˆà ˆà ifˆàself.dead_snake_check()ˆà==ˆàFalse:
108ˆà ˆà ˆà ˆà ˆà ˆà return
109ˆà ˆà ˆà ˆà ifˆàself.step_id ==ˆà0:
110ˆà ˆà ˆà ˆà ˆà ˆà self.engine.psnakes =ˆàself.engine.snakes[:]
111ˆà ˆà ˆà ˆà ifˆàself.step_id <=ˆàself.game_length:
112ˆà ˆà ˆà ˆà ˆà ˆà ifˆàself.after_id !=ˆàNone:
113ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.after_cancel(self.after_id)
114ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà pass
115ˆà ˆà ˆà ˆà ˆà ˆà self.step_id =ˆàself.step_id+1
116ˆà ˆà ˆà ˆà ˆà ˆà self.engine.step()
117ˆà ˆà ˆà ˆà ˆà ˆà pass
118ˆà ˆà ˆà ˆà else:
119ˆà ˆà ˆà ˆà ˆà ˆà self.end()
120ˆà ˆà ˆà ˆà ˆà ˆà pass
121ˆà ˆà ˆà ˆà return
122ˆà ˆà
123ˆà ˆà defˆàdead_snake_check(self):
124ˆà ˆà ˆà ˆà """Check the number of snakes alive.
125ˆà ˆà ˆà ˆà End the game if alive snake number is less than two."""
126ˆà ˆà ˆà ˆà dead_snakes =ˆà0
127ˆà ˆà ˆà ˆà forˆàsnake inˆàself.engine.snakes:
128ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake ==ˆàNone:
129ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà dead_snakes=dead_snakes+1
130ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà pass
131ˆà ˆà ˆà ˆà ifˆàdead_snakes >=ˆà3:
132ˆà ˆà ˆà ˆà ˆà ˆà self.end()
133ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse
134ˆà ˆà ˆà ˆà
135ˆà ˆà defˆàrestart(self,ˆàsurvived):
136ˆà ˆà ˆà ˆà """"Restarts snakes positions after the end of the game
137
138ˆà ˆà ˆà ˆà Options:
139ˆà ˆà ˆà ˆà survived = "yes" - restarts next round only with snakes survived in previous round
140ˆà ˆà ˆà ˆà survived = "no" - restart next roun with all snakes played in previous round"""
141ˆà ˆà ˆà ˆà ifˆàsurvived ==ˆà"yes":
142ˆà ˆà ˆà ˆà ˆà ˆà snake_set =ˆàself.engine.snakes
143ˆà ˆà ˆà ˆà else:
144ˆà ˆà ˆà ˆà ˆà ˆà snake_set =ˆàself.engine.psnakesˆà ˆà ˆà ˆà ˆà
145ˆà ˆà ˆà ˆà self.step_id =ˆà0
146ˆà ˆà ˆà ˆà forˆài,ˆàsnake inˆàenumerate(snake_set):
147ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake_set[i]ˆà!=ˆàNone:
148ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.engine.snakes[i]ˆà=ˆàsnake
149ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.engine.create_snake(i,ˆàsnake)
150ˆà ˆà ˆà ˆà self.engine.refill()
151ˆà ˆà ˆà ˆà self.engine.redraw()
152
153ˆà ˆà defˆàendˆà(self):
154ˆà ˆà ˆà ˆà """End the game and raise the window that tels about it."""
155ˆà ˆà ˆà ˆà ifˆàself.after_id !=ˆàNone:
156ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.after_cancel(self.after_id)
157ˆà ˆà ˆà ˆà ˆà ˆà pass
158ˆà ˆà ˆà ˆà self.step_id =ˆàself.game_length +ˆà666
159ˆà ˆà ˆà ˆà root =ˆàtk.Tk()
160ˆà ˆà ˆà ˆà end_label =ˆàtk.Label(root,ˆàtext="End")
161ˆà ˆà ˆà ˆà end_label.pack()
162ˆà ˆà ˆà ˆà root.mainloop()
163ˆà ˆà ˆà ˆà pass
164
165ifˆà__name__ ==ˆà"__main__":
166ˆà ˆà snake_batle =ˆàUI()
167ˆà ˆà snake_batle.root.mainloop()
Note: See TracBrowser for help on using the repository browser.