Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/snake/annotate/21a5779088e6/snake.py
Дата изменения: Unknown
Дата индексирования: Fri Feb 28 20:49:03 2014
Кодировка:
snake: snake.py annotate

snake

annotate snake.py @ 42:21a5779088e6

main.py: added if __name__ == "__main__" condition to automatic ui startup
author Daniil Alexeyevsky <me.dendik@gmail.com>
date Sun, 19 Dec 2010 22:54:58 +0300
parents 94945f11c78d
children 2a7b76d66e78
rev   line source
me@34 1 import engine
me@34 2
me@34 3 def preprocess(line):
me@34 4 if '//' in line:
me@34 5 line = line[:line.index('//')]
me@34 6 line = line.rstrip()
me@34 7 return line
martiran@30 8
martiran@30 9 class Snake(object):
martiran@32 10 def __init__ (self, cells, color):
martiran@32 11 self.cells = cells
martiran@32 12 self.color = color
martiran@32 13 self.rules = []
me@34 14
me@34 15 def load (self, file):
me@34 16 magic, name = preprocess(file.readline()).split(' ', 1)
me@34 17 assert magic == "snake", "This is not snake file"
me@34 18 while True:
me@34 19 line = preprocess(file.readline())
me@34 20 if line == 'end':
me@34 21 break
me@34 22 assert line == '', "Rules must be separated by empty lines"
me@34 23 self.rules.append(Rule().load(file))
me@34 24
martiran@30 25 def fill (self):
martiran@32 26 for cell in self.cells:
martiran@32 27 cell.snake = self
martiran@31 28 snake.cells[0].type = 'head'
me@40 29 snake.cells[1:-1].type = 'body'
martiran@31 30 snake.cells[-1].type = 'tail'
martiran@31 31 return
me@34 32
martiran@30 33 class Rule(object):
me@34 34
me@34 35 codes = {
me@34 36 'h': 'head',
me@34 37 'b': 'body',
me@34 38 't': 'tail',
me@34 39 '#': 'wall',
me@34 40 ' ': 'any',
me@34 41 '-': 'empty',
me@34 42 }
me@34 43
martiran@32 44 def __init__ (self, snake):
martiran@32 45 self.snake = snake
me@34 46 self.direction = (1, 0)
me@34 47 self.pattern = {}
me@34 48
me@34 49 def load (self, file):
me@34 50 y = 0
me@34 51 for line in file:
me@34 52 line = preprocess(line)
me@34 53 if y == 0 and line == '':
me@34 54 continue
me@36 55 if y == 7:
me@36 56 break
me@41 57 assert len(line) == 8, "Rule lines must be exactly 7 chars long"
me@34 58 assert line[-1] == ';', "Rule lines must end with semicolon"
me@34 59 for x, char in enumerate(line[:8]):
me@34 60 self.parse_cell(x, y, char)
me@34 61 y += 1
me@34 62
me@34 63 def parse_cell(self, x, y, char):
me@34 64 assert char.lower() in self.codes, "Illegal symbol in rule: %s" % char
me@34 65 cell = engine.Cell(x, y, None)
me@34 66 if char in 'htb':
me@34 67 if char.islower():
me@34 68 cell.snake = 'my'
me@34 69 else:
me@34 70 cell.snake = 'enemy'
me@37 71 if char == 'h':
me@37 72 assert (x, y) == (3, 3), "Own head must in the center of rule"
me@37 73 if (x, y) == (3, 3):
me@37 74 assert char == 'h', "In the center of rule must be own head"
me@34 75 cell.type = self.codes[char.lower()]
me@34 76 self.pattern[x, y] = cell
me@34 77
martiran@32 78 def applies (self, field, x, y):
me@38 79 for px, fx in zip(range(7), range(x - 3, x + 4)):
me@38 80 for py, fy in zip(range(7), range(y - 3, y + 4)):
me@38 81 pcell = self.pattern[px, py]
me@38 82 fcell = field.get(fx, fy)
me@38 83 if pcell.type == 'any':
me@38 84 continue
me@38 85 if pcell.type != fcell.type:
me@38 86 return False
me@38 87 if pcell.snake == 'my' and fcell.snake != self.snake:
me@38 88 return False
me@38 89 elif pcell.snake == 'enemy' and fcell.snake == self.snake:
me@38 90 return False
me@38 91 return True
me@34 92
martiran@32 93 def rotate (self, rot):
me@39 94 for i in range(((rot % 4) + 4) % 4):
me@39 95 self.rotate_ccw()
me@39 96
me@39 97 def rotate_ccw(self):
me@39 98 pattern = {}
me@39 99 for x in range(7):
me@39 100 for y in range(7):
me@39 101 pattern[y, 6 - x] = self.pattern[x, y]
me@39 102 self.pattern = pattern
me@39 103 x, y = self.direction
me@39 104 self.direction = y, -x
me@34 105
me@34 106 # vim: set ts=4 sts=4 sw=4 et: