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

source: snake.py @ 51:995c5300f498

Revision 51:995c5300f498, 4.1 KB checked in by Daniil Alexeyevsky <me.dendik@òÀæ>, 5 years ago (diff)

Added Cell attribute snake_type to snake.Rule pattern cells

Lineˆà
1"""Guts of snakes."""
2
3importˆàengine
4
5defˆàpreprocess(line):
6ˆà ˆà """Remove comments and junk spaces from line of snake definition file."""
7ˆà ˆà ifˆà'//'ˆàinˆàline:
8ˆà ˆà ˆà ˆà line =ˆàline[:line.index('//')]
9ˆà ˆà line =ˆàline.rstrip()
10ˆà ˆà returnˆàline
11
12classˆàSnake(object):
13ˆà ˆà """Snakes.
14
15ˆà ˆà Attributes:
16
17ˆà ˆà - `cells` -- list of cells belonging to the snake The first of these cells
18ˆà ˆà ˆà becomes head, the last one becomes tail, the rest ar body. If snake has
19ˆà ˆà ˆà only one cell, it is tail.
20ˆà ˆà - `color` -- color of snake
21ˆà ˆà - `rules` -- a list of Rule objects
22ˆà ˆà """
23
24ˆà ˆà defˆà__init__ˆà(self,ˆàcells,ˆàcolor):
25ˆà ˆà ˆà ˆà self.cells =ˆàcells
26ˆà ˆà ˆà ˆà self.color =ˆàcolor
27ˆà ˆà ˆà ˆà self.rules =ˆà[]
28
29ˆà ˆà defˆàloadˆà(self,ˆàfile):
30ˆà ˆà ˆà ˆà """Load snake description from file.
31ˆà ˆà ˆà ˆà
32ˆà ˆà ˆà ˆà See program design docs for file syntax.
33ˆà ˆà ˆà ˆà """
34ˆà ˆà ˆà ˆà magic,ˆàname =ˆàpreprocess(file.readline()).split(' ',ˆà1)
35ˆà ˆà ˆà ˆà assertˆàmagic ==ˆà"snake",ˆà"This is not snake file"
36ˆà ˆà ˆà ˆà whileˆàTrue:
37ˆà ˆà ˆà ˆà ˆà ˆà line =ˆàpreprocess(file.readline())
38ˆà ˆà ˆà ˆà ˆà ˆà ifˆàline ==ˆà'end':
39ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà break
40ˆà ˆà ˆà ˆà ˆà ˆà assertˆàline ==ˆà'',ˆà"Rules must be separated by empty lines"
41ˆà ˆà ˆà ˆà ˆà ˆà self.rules.append(Rule(self).load(file))
42
43ˆà ˆà defˆàfillˆà(self):
44ˆà ˆà ˆà ˆà """Mark every cell in `self.cells` as belonging to self."""
45ˆà ˆà ˆà ˆà forˆàcell inˆàself.cells:
46ˆà ˆà ˆà ˆà ˆà ˆà cell.snake =ˆàself
47ˆà ˆà ˆà ˆà snake.cells[0].type =ˆà'head'
48ˆà ˆà ˆà ˆà forˆàcell inˆàself.cells[1:-1]:
49ˆà ˆà ˆà ˆà ˆà ˆà cell.type =ˆà'body'
50ˆà ˆà ˆà ˆà snake.cells[-1].type =ˆà'tail'
51ˆà ˆà ˆà ˆà return
52
53classˆàRule(object):
54ˆà ˆà """Rule defining possible behaviour of snake."""
55
56ˆà ˆà codes =ˆà{
57ˆà ˆà ˆà ˆà 'h':ˆà'head',
58ˆà ˆà ˆà ˆà 'b':ˆà'body',
59ˆà ˆà ˆà ˆà 't':ˆà'tail',
60ˆà ˆà ˆà ˆà '#':ˆà'wall',
61ˆà ˆà ˆà ˆà ' ':ˆà'any',
62ˆà ˆà ˆà ˆà '-':ˆà'empty',
63ˆà ˆà }
64
65ˆà ˆà defˆà__init__ˆà(self,ˆàsnake):
66ˆà ˆà ˆà ˆà self.snake =ˆàsnake
67ˆà ˆà ˆà ˆà self.direction =ˆà(1,ˆà0)
68ˆà ˆà ˆà ˆà self.pattern =ˆà{}
69
70ˆà ˆà defˆàloadˆà(self,ˆàfile):
71ˆà ˆà ˆà ˆà """Load rule definition from file. Ignore any leading empty lines."""
72ˆà ˆà ˆà ˆà y =ˆà0
73ˆà ˆà ˆà ˆà forˆàline inˆàfile:
74ˆà ˆà ˆà ˆà ˆà ˆà line =ˆàpreprocess(line)
75ˆà ˆà ˆà ˆà ˆà ˆà ifˆày ==ˆà0ˆàandˆàline ==ˆà'':
76ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà continue
77ˆà ˆà ˆà ˆà ˆà ˆà ifˆày ==ˆà7:
78ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà break
79ˆà ˆà ˆà ˆà ˆà ˆà assertˆàlen(line)ˆà==ˆà8,ˆà"Rule lines must be exactly 7 chars long"
80ˆà ˆà ˆà ˆà ˆà ˆà assertˆàline[-1]ˆà==ˆà';',ˆà"Rule lines must end with semicolon"
81ˆà ˆà ˆà ˆà ˆà ˆà forˆàx,ˆàchar inˆàenumerate(line[:8]):
82ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà self.parse_cell(x,ˆày,ˆàchar)
83ˆà ˆà ˆà ˆà ˆà ˆà y +=ˆà1
84
85ˆà ˆà defˆàparse_cell(self,ˆàx,ˆày,ˆàchar):
86ˆà ˆà ˆà ˆà """Parse definition of cell in rule file.
87
88ˆà ˆà ˆà ˆà Cell is defined by one character.
89ˆà ˆà ˆà ˆà """
90ˆà ˆà ˆà ˆà assertˆàchar.lower()ˆàinˆàself.codes,ˆà"Illegal symbol in rule: %s"ˆà%ˆàchar
91ˆà ˆà ˆà ˆà cell =ˆàengine.Cell(x,ˆày,ˆàself.snake)
92ˆà ˆà ˆà ˆà ifˆàchar inˆà'htb':
93ˆà ˆà ˆà ˆà ˆà ˆà ifˆàchar.islower():
94ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà cell.snake_type =ˆà'my'
95ˆà ˆà ˆà ˆà ˆà ˆà else:
96ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà cell.snake_type =ˆà'enemy'
97ˆà ˆà ˆà ˆà ifˆàchar ==ˆà'h':
98ˆà ˆà ˆà ˆà ˆà ˆà assertˆà(x,ˆày)ˆà==ˆà(3,ˆà3),ˆà"Own head must in the center of rule"
99ˆà ˆà ˆà ˆà ifˆà(x,ˆày)ˆà==ˆà(3,ˆà3):
100ˆà ˆà ˆà ˆà ˆà ˆà assertˆàchar ==ˆà'h',ˆà"In the center of rule must be own head"
101ˆà ˆà ˆà ˆà cell.type =ˆàself.codes[char.lower()]
102ˆà ˆà ˆà ˆà self.pattern[x,ˆày]ˆà=ˆàcell
103
104ˆà ˆà defˆàappliesˆà(self,ˆàfield,ˆàx,ˆày):
105ˆà ˆà ˆà ˆà """True if the rule applies in the field at position (x,y)."""
106ˆà ˆà ˆà ˆà forˆàpx,ˆàfx inˆàzip(range(7),ˆàrange(x -ˆà3,ˆàx +ˆà4)):
107ˆà ˆà ˆà ˆà ˆà ˆà forˆàpy,ˆàfy inˆàzip(range(7),ˆàrange(y -ˆà3,ˆày +ˆà4)):
108ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ifˆà(fx,ˆàfy)ˆàinˆàfield:
109ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ifˆàfield[fx,ˆàfy]ˆà!=ˆàself.pattern[px,ˆàpy]:
110ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse
111ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà else:
112ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ifˆàself.pattern[px,ˆàpy].type !=ˆà'any':
113ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà returnˆàFalse
114ˆà ˆà ˆà ˆà returnˆàTrue
115
116ˆà ˆà defˆàrotateˆà(self,ˆàrot):
117ˆà ˆà ˆà ˆà """Rotate rule pattern `rot` times counterclockwise."""
118ˆà ˆà ˆà ˆà forˆài inˆàrange(((rot %ˆà4)ˆà+ˆà4)ˆà%ˆà4):
119ˆà ˆà ˆà ˆà ˆà ˆà self.rotate_ccw()
120
121ˆà ˆà defˆàrotate_ccw(self):
122ˆà ˆà ˆà ˆà """Rotate rule pattern one time counterclockwise."""
123ˆà ˆà ˆà ˆà pattern =ˆà{}
124ˆà ˆà ˆà ˆà forˆàx inˆàrange(7):
125ˆà ˆà ˆà ˆà ˆà ˆà forˆày inˆàrange(7):
126ˆà ˆà ˆà ˆà ˆà ˆà ˆà ˆà pattern[y,ˆà6ˆà-ˆàx]ˆà=ˆàself.pattern[x,ˆày]
127ˆà ˆà ˆà ˆà self.pattern =ˆàpattern
128ˆà ˆà ˆà ˆà x,ˆày =ˆàself.direction
129ˆà ˆà ˆà ˆà self.direction =ˆày,ˆà-x
130
131# vim: set ts=4 sts=4 sw=4 et:
Note: See TracBrowser for help on using the repository browser.