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

source: snake.py @ 44:a7e53eb3f54d

Revision 44:a7e53eb3f54d, 4.1 KB checked in by Daniil Alexeyevsky <me.dendik@?>, 5 years ago (diff)

snake.py: added some (ugly) docstrings, closes #7

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().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š š š š snake.cells[1:-1].type =š'body'
49š š š š snake.cells[-1].type =š'tail'
50š š š š return
51
52classšRule(object):
53š š """Rule defining possible behaviour of snake."""
54
55š š codes =š{
56š š š š 'h':š'head',
57š š š š 'b':š'body',
58š š š š 't':š'tail',
59š š š š '#':š'wall',
60š š š š ' ':š'any',
61š š š š '-':š'empty',
62š š }
63
64š š defš__init__š(self,šsnake):
65š š š š self.snake =šsnake
66š š š š self.direction =š(1,š0)
67š š š š self.pattern =š{}
68
69š š defšloadš(self,šfile):
70š š š š """Load rule definition from file. Ignore any leading empty lines."""
71š š š š y =š0
72š š š š foršline inšfile:
73š š š š š š line =špreprocess(line)
74š š š š š š ifšy ==š0šandšline ==š'':
75š š š š š š š š continue
76š š š š š š ifšy ==š7:
77š š š š š š š š break
78š š š š š š assertšlen(line)š==š8,š"Rule lines must be exactly 7 chars long"
79š š š š š š assertšline[-1]š==š';',š"Rule lines must end with semicolon"
80š š š š š š foršx,šchar inšenumerate(line[:8]):
81š š š š š š š š self.parse_cell(x,šy,šchar)
82š š š š š š y +=š1
83
84š š defšparse_cell(self,šx,šy,šchar):
85š š š š """Parse definition of cell in rule file.
86
87š š š š Cell is defined by one character.
88š š š š """
89š š š š assertšchar.lower()šinšself.codes,š"Illegal symbol in rule: %s"š%šchar
90š š š š cell =šengine.Cell(x,šy,šNone)
91š š š š ifšchar inš'htb':
92š š š š š š ifšchar.islower():
93š š š š š š š š cell.snake =š'my'
94š š š š š š else:
95š š š š š š š š cell.snake =š'enemy'
96š š š š ifšchar ==š'h':
97š š š š š š assertš(x,šy)š==š(3,š3),š"Own head must in the center of rule"
98š š š š ifš(x,šy)š==š(3,š3):
99š š š š š š assertšchar ==š'h',š"In the center of rule must be own head"
100š š š š cell.type =šself.codes[char.lower()]
101š š š š self.pattern[x,šy]š=šcell
102
103š š defšappliesš(self,šfield,šx,šy):
104š š š š """True if the rule applies in the field at position (x,y)."""
105š š š š foršpx,šfx inšzip(range(7),šrange(x -š3,šx +š4)):
106š š š š š š foršpy,šfy inšzip(range(7),šrange(y -š3,šy +š4)):
107š š š š š š š š ifšfx,šfy inšfield:
108š š š š š š š š š š ifšfield[fx,šfy]š!=šself.pattern[px,špy]:
109š š š š š š š š š š š š returnšFalse
110š š š š š š š š else:
111š š š š š š š š š š ifšself.pattern[px,špy].type !=š'any':
112š š š š š š š š š š š š returnšFalse
113š š š š returnšTrue
114
115š š defšrotateš(self,šrot):
116š š š š """Rotate rule pattern `rot` times counterclockwise."""
117š š š š forši inšrange(((rot %š4)š+š4)š%š4):
118š š š š š š self.rotate_ccw()
119
120š š defšrotate_ccw(self):
121š š š š """Rotate rule pattern one time counterclockwise."""
122š š š š pattern =š{}
123š š š š foršx inšrange(7):
124š š š š š š foršy inšrange(7):
125š š š š š š š š pattern[y,š6š-šx]š=šself.pattern[x,šy]
126š š š š self.pattern =špattern
127š š š š x,šy =šself.direction
128š š š š self.direction =šy,š-x
129
130# vim: set ts=4 sts=4 sw=4 et:
Note: See TracBrowser for help on using the repository browser.