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

source: engine.py @ 107:b38281ca9b5c

Revision 107:b38281ca9b5c, 5.6 KB checked in by Alex Martynov <martiran@òÀæ>, 5 years ago (diff)

fixed random sell snake movement

  • Property exe set to *
Lineˆà
1importˆàrandomˆàasˆàrnd
2importˆàTkinterˆàasˆàtk
3importˆàsnake
4
5directions =ˆà[(0,1),ˆà(1,0),ˆà(0,-1),ˆà(-1,0)]
6tm =ˆà[[0,ˆà-1],ˆà[1,ˆà0]]
7
8classˆàCell(object):
9ˆà ˆà defˆà__init__(self,ˆàx,ˆày,ˆàcanvas =ˆàNone):
10ˆà ˆà ˆà ˆà self.x =ˆàx
11ˆà ˆà ˆà ˆà self.y =ˆày
12ˆà ˆà ˆà ˆà self.canvas =ˆàcanvas
13ˆà ˆà ˆà ˆà self.snake =ˆàNone
14ˆà ˆà ˆà ˆà self.type =ˆà'empty'
15ˆà ˆà ˆà ˆà return
16ˆà ˆà defˆàredraw(self):
17ˆà ˆà ˆà ˆà field_size =ˆàmin(self.canvas.winfo_height(),ˆàself.canvas.winfo_width())
18ˆà ˆà ˆà ˆà offset =ˆà((self.canvas.winfo_width()ˆà-ˆàfield_size)/2.0,ˆà(self.canvas.winfo_height()ˆà-ˆàfield_size)/2.0)
19ˆà ˆà ˆà ˆà x0=offset[0]ˆà+ˆàself.x*field_size/21.0
20ˆà ˆà ˆà ˆà y0=offset[1]ˆà+ˆàself.y*field_size/21.0
21ˆà ˆà ˆà ˆà x1=offset[0]ˆà+ˆà(self.x+1)*field_size/21.0
22ˆà ˆà ˆà ˆà y1=offset[1]ˆà+ˆà(self.y+1)*field_size/21.0
23ˆà ˆà ˆà ˆà x2=offset[0]ˆà+ˆà(self.x+1/2.0)*field_size/21.0
24ˆà ˆà ˆà ˆà ifˆàself.type ==ˆà'wall':
25ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.create_rectangle(x0,ˆày0,ˆàx1,ˆày1,ˆàfill="grey")
26ˆà ˆà ˆà ˆà ˆà ˆà pass
27ˆà ˆà ˆà ˆà elifˆàself.type ==ˆà'empty':
28ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.create_rectangle(x0,ˆày0,ˆàx1,ˆày1,ˆàfill="black")
29ˆà ˆà ˆà ˆà ˆà ˆà pass
30ˆà ˆà ˆà ˆà elifˆàself.type ==ˆà'body':
31ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.create_rectangle(x0,ˆày0,ˆàx1,ˆày1,ˆàfill=self.snake.color)
32ˆà ˆà ˆà ˆà ˆà ˆà pass
33ˆà ˆà ˆà ˆà elifˆàself.type ==ˆà'head':
34ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.create_oval(x0,ˆày0,ˆàx1,ˆày1,ˆàfill=self.snake.color)
35ˆà ˆà ˆà ˆà ˆà ˆà pass
36ˆà ˆà ˆà ˆà elifˆàself.type ==ˆà'tail':
37ˆà ˆà ˆà ˆà ˆà ˆà self.canvas.create_polygon(x0,ˆày0,ˆàx1,ˆày0,ˆàx2,ˆày1,ˆàfill=self.snake.color)
38ˆà ˆà ˆà ˆà ˆà ˆà pass
39ˆà ˆà ˆà ˆà return
40ˆà ˆà defˆà__eq__(self,ˆàpattern):
41ˆà ˆà ˆà ˆà ifˆàpattern.type ==ˆà'any':
42ˆà ˆà ˆà ˆà ˆà ˆà returnˆàTrue
43ˆà ˆà ˆà ˆà ifˆàpattern.type !=ˆàself.type:
44ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse
45ˆà ˆà ˆà ˆà ifˆàpattern.snake_type ==ˆà'my'ˆàandˆàpattern.snake !=ˆàself.snake:
46ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse
47ˆà ˆà ˆà ˆà elifˆàpattern.snake_type ==ˆà'enemy'ˆàandˆàpattern.snake ==ˆàself.snake:
48ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse
49ˆà ˆà ˆà ˆà returnˆàTrue
50ˆà ˆà defˆàclear(self):
51ˆà ˆà ˆà ˆà self.snake =ˆàNone
52ˆà ˆà ˆà ˆà self.type =ˆà'empty'
53ˆà ˆà ˆà ˆà return
54
55
56classˆàEngine(object):
57ˆà ˆà defˆà__init__(self,ˆàcanvas):
58ˆà ˆà ˆà ˆà self.canvas =ˆàcanvas
59ˆà ˆà ˆà ˆà self.w =ˆàmin(canvas.winfo_height(),ˆàcanvas.winfo_width())
60ˆà ˆà ˆà ˆà self.h =ˆàmin(canvas.winfo_height(),ˆàcanvas.winfo_width())
61ˆà ˆà ˆà ˆà self.snakes =ˆà[None,ˆàNone,ˆàNone,ˆàNone]
62ˆà ˆà ˆà ˆà self.init_field()
63ˆà ˆà ˆà ˆà return
64ˆà ˆà defˆàinit_fieldˆà(self):
65ˆà ˆà ˆà ˆà self.field =ˆà{}
66ˆà ˆà ˆà ˆà forˆàx inˆàrange(21):
67ˆà ˆà ˆà ˆà ˆà ˆà forˆày inˆàrange(21):
68ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.field[x,ˆày]ˆà=ˆàCell(x,ˆày,ˆàself.canvas)
69ˆà ˆà ˆà ˆà forˆày inˆàrange(21):
70ˆà ˆà ˆà ˆà ˆà ˆà self.field[0,ˆày].type =ˆà'wall'
71ˆà ˆà ˆà ˆà ˆà ˆà self.field[20,ˆày].type =ˆà'wall'
72ˆà ˆà ˆà ˆà forˆàx inˆàrange(1,20):
73ˆà ˆà ˆà ˆà ˆà ˆà self.field[x,ˆà0].type =ˆà'wall'
74ˆà ˆà ˆà ˆà ˆà ˆà self.field[x,ˆà20].type =ˆà'wall'
75ˆà ˆà ˆà ˆà self.refill()
76ˆà ˆà ˆà ˆà self.redraw()
77ˆà ˆà ˆà ˆà return
78ˆà ˆà defˆàstep(self):
79ˆà ˆà ˆà ˆà forˆài,ˆàsnake inˆàenumerate(self.snakes):
80ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake !=ˆàNone:
81ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ifˆàlen(snake.cells)ˆà==ˆà0:
82ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.snakes[i]ˆà=ˆàNone
83ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà continue
84ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.legal_moves(snake)
85ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.move_snake(snake)
86ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.refill()
87ˆà ˆà ˆà ˆà self.redraw()ˆà ˆà
88ˆà ˆà ˆà ˆà return
89ˆà ˆà defˆàmove_snake(self,ˆàsnake):
90ˆà ˆà ˆà ˆà head =ˆàsnake.cells[0]
91ˆà ˆà ˆà ˆà forˆàrule inˆàsnake.rules:
92ˆà ˆà ˆà ˆà ˆà ˆà forˆàdirection inˆàsnake.legal_dir:
93ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà rule.rotate(direction)
94ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ifˆàrule.applies(self.field,ˆàhead.x,ˆàhead.y)ˆà==ˆàTrue:
95ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.move_do(snake,ˆàdirection)
96ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà return
97ˆà ˆà ˆà ˆà ifˆàsnake.legal_dir !=ˆà[]:
98ˆà ˆà ˆà ˆà ˆà ˆà self.move_do(snake,ˆàsnake.legal_dir[0])
99ˆà ˆà ˆà ˆà ˆà ˆà pass
100ˆà ˆà ˆà ˆà return
101ˆà ˆà defˆàmove_do(self,ˆàsnake,ˆàapplied_dir):
102ˆà ˆà ˆà ˆà head =ˆàsnake.cells[0]
103ˆà ˆà ˆà ˆà dir_cell =ˆàself.field[head.x +ˆàapplied_dir[0],ˆàhead.y +ˆàapplied_dir[1]]
104ˆà ˆà ˆà ˆà ifˆàdir_cell.type ==ˆà'empty':
105ˆà ˆà ˆà ˆà ˆà ˆà snake.cells.insert(0,dir_cell)
106ˆà ˆà ˆà ˆà ˆà ˆà delˆàsnake.cells[-1]
107ˆà ˆà ˆà ˆà ˆà ˆà pass
108ˆà ˆà ˆà ˆà elifˆà(dir_cell.type ==ˆà'tail'ˆàandˆàdir_cell.snake !=ˆàsnake):
109ˆà ˆà ˆà ˆà ˆà ˆà snake.cells.insert(0,dir_cell)
110ˆà ˆà ˆà ˆà ˆà ˆà delˆàdir_cell.snake.cells[-1]
111ˆà ˆà ˆà ˆà ˆà ˆà pass
112
113ˆà ˆà defˆàcreate_snake(self,ˆàsnake_number):
114ˆà ˆà ˆà ˆà cells_id =ˆà[]
115ˆà ˆà ˆà ˆà forˆày inˆàrange(10):
116ˆà ˆà ˆà ˆà ˆà ˆà cells_id.append((10,ˆày+1))
117ˆà ˆà ˆà ˆà forˆàrot_num inˆàrange(snake_number -ˆà1):
118ˆà ˆà ˆà ˆà ˆà ˆà forˆài,ˆàcell inˆàenumerate(cells_id):
119ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà cells_id[i]ˆà=ˆà((tm[0][0]*(cell[0]-10)ˆà+ˆàtm[0][1]*(cell[1]-10))+10,(tm[1][0]*(cell[0]-10)ˆà+ˆàtm[1][1]*(cell[1]-10))+10)
120ˆà ˆà ˆà ˆà cells =ˆà[]
121ˆà ˆà ˆà ˆà forˆàcell inˆàcells_id:
122ˆà ˆà ˆà ˆà ˆà ˆà cells.append(self.field[cell])
123ˆà ˆà ˆà ˆà color_dic =ˆà{
124ˆà ˆà ˆà ˆà ˆà ˆà 1:'blue',
125ˆà ˆà ˆà ˆà ˆà ˆà 2:'green',
126ˆà ˆà ˆà ˆà ˆà ˆà 3:'yellow',
127ˆà ˆà ˆà ˆà ˆà ˆà 4:'red',}
128ˆà ˆà ˆà ˆà self.snakes[snake_number-1]ˆà=ˆàsnake.Snake(cells,ˆàcolor_dic[snake_number])
129ˆà ˆà ˆà ˆà returnˆàself.snakes[snake_number-1]
130ˆà ˆà defˆàrefill(self):
131ˆà ˆà ˆà ˆà forˆàx inˆàrange(1,20):
132ˆà ˆà ˆà ˆà ˆà ˆà forˆày inˆàrange(1,20):
133ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.field[x,ˆày].type =ˆà'empty'
134ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.field[x,ˆày].snake =ˆàNone
135ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà pass
136ˆà ˆà ˆà ˆà forˆàsnake inˆàself.snakes:
137ˆà ˆà ˆà ˆà ˆà ˆà ifˆàsnake ==ˆàNone:
138ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà pass
139ˆà ˆà ˆà ˆà ˆà ˆà else:
140ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà snake.fill()
141ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà pass
142ˆà ˆà ˆà ˆà return
143ˆà ˆà defˆàredraw(self):
144ˆà ˆà ˆà ˆà self.canvas.delete(all)
145ˆà ˆà ˆà ˆà forˆàcell_coord inˆàself.field:
146ˆà ˆà ˆà ˆà ˆà ˆà self.field[cell_coord].redraw()
147ˆà ˆà ˆà ˆà return
148ˆà ˆà defˆàlegal_moves(self,ˆàsnake):
149ˆà ˆà ˆà ˆà snake.legal_dir =ˆà[]
150ˆà ˆà ˆà ˆà forˆàdirection inˆàdirections:
151ˆà ˆà ˆà ˆà ˆà ˆà dir_cell =ˆàself.field[snake.cells[0].y +ˆàdirection[0],ˆàsnake.cells[0].x +ˆàdirection[1]]
152ˆà ˆà ˆà ˆà ˆà ˆà ifˆà(dir_cell.type ==ˆà'empty'ˆàorˆà(dir_cell.type ==ˆà'tail'ˆàandˆàdir_cell.snake !=ˆàsnake)):
153ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà snake.legal_dir.append(direction)
154ˆà ˆà ˆà ˆà rnd.shuffle(snake.legal_dir)
155ˆà ˆà ˆà ˆà return
156
Note: See TracBrowser for help on using the repository browser.