| rev |
line source |
|
me@44
|
1 """Guts of snakes.""" |
|
me@44
|
2 |
|
me@34
|
3 import engine |
|
me@34
|
4 |
|
me@34
|
5 def preprocess(line): |
|
me@44
|
6 """Remove comments and junk spaces from line of snake definition file.""" |
|
me@34
|
7 if '//' in line: |
|
me@34
|
8 line = line[:line.index('//')] |
|
me@34
|
9 line = line.rstrip() |
|
me@34
|
10 return line |
|
martiran@30
|
11 |
|
martiran@30
|
12 class Snake(object): |
|
me@44
|
13 """Snakes. |
|
me@44
|
14 |
|
me@44
|
15 Attributes: |
|
me@44
|
16 |
|
me@44
|
17 - `cells` -- list of cells belonging to the snake The first of these cells |
|
me@44
|
18 becomes head, the last one becomes tail, the rest ar body. If snake has |
|
me@44
|
19 only one cell, it is tail. |
|
me@44
|
20 - `color` -- color of snake |
|
me@44
|
21 - `rules` -- a list of Rule objects |
|
me@44
|
22 """ |
|
me@44
|
23 |
|
martiran@32
|
24 def __init__ (self, cells, color): |
|
martiran@32
|
25 self.cells = cells |
|
martiran@32
|
26 self.color = color |
|
martiran@32
|
27 self.rules = [] |
|
me@34
|
28 |
|
me@34
|
29 def load (self, file): |
|
me@44
|
30 """Load snake description from file. |
|
me@44
|
31 |
|
me@44
|
32 See program design docs for file syntax. |
|
me@44
|
33 """ |
|
me@65
|
34 for line in file: |
|
me@65
|
35 magic, name = preprocess(line).split(' ', 1) |
|
me@65
|
36 break |
|
me@34
|
37 assert magic == "snake", "This is not snake file" |
|
me@65
|
38 for line in file: |
|
me@65
|
39 line = preprocess(line) |
|
me@34
|
40 if line == 'end': |
|
me@34
|
41 break |
|
me@34
|
42 assert line == '', "Rules must be separated by empty lines" |
|
me@51
|
43 self.rules.append(Rule(self).load(file)) |
|
me@34
|
44 |
|
martiran@30
|
45 def fill (self): |
|
me@44
|
46 """Mark every cell in `self.cells` as belonging to self.""" |
|
martiran@32
|
47 for cell in self.cells: |
|
martiran@32
|
48 cell.snake = self |
|
martiran@31
|
49 snake.cells[0].type = 'head' |
|
me@45
|
50 for cell in self.cells[1:-1]: |
|
me@45
|
51 cell.type = 'body' |
|
martiran@31
|
52 snake.cells[-1].type = 'tail' |
|
martiran@31
|
53 return |
|
me@34
|
54 |
|
martiran@30
|
55 class Rule(object): |
|
me@44
|
56 """Rule defining possible behaviour of snake.""" |
|
me@34
|
57 |
|
me@34
|
58 codes = { |
|
me@34
|
59 'h': 'head', |
|
me@34
|
60 'b': 'body', |
|
me@34
|
61 't': 'tail', |
|
me@34
|
62 '#': 'wall', |
|
me@34
|
63 ' ': 'any', |
|
me@34
|
64 '-': 'empty', |
|
me@34
|
65 } |
|
me@34
|
66 |
|
martiran@32
|
67 def __init__ (self, snake): |
|
martiran@32
|
68 self.snake = snake |
|
me@34
|
69 self.direction = (1, 0) |
|
me@34
|
70 self.pattern = {} |
|
me@34
|
71 |
|
me@34
|
72 def load (self, file): |
|
me@44
|
73 """Load rule definition from file. Ignore any leading empty lines.""" |
|
me@34
|
74 y = 0 |
|
me@34
|
75 for line in file: |
|
me@34
|
76 line = preprocess(line) |
|
me@34
|
77 if y == 0 and line == '': |
|
me@34
|
78 continue |
|
me@36
|
79 if y = |