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

source: engine.py @ 90:5d7d9c19b6c2

Revision 90:5d7d9c19b6c2, 6.1 KB checked in by Alex Martynov, 5 years ago (diff)

engine.legal_moves added random shuffle + engine.move_do() added

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