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

snake

annotate snake.py @ 34:8f8af9ef99e6

snake: implemented Snake.load, Rule.load; untested yet
author Daniil Alexeyevsky <me.dendik@gmail.com>
date Sun, 19 Dec 2010 22:22:42 +0300
parents 17f615088ed6
children dc8b4c81a72a
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'
martiran@31 29 snake.cells[-1].type = 'tail'
martiran@31 30 snake.cells[1:-1].type = 'body'
martiran@31 31 return
me@34 32
martiran@33 33 def error (self):
martiran@33 34 pass
martiran@30 35
martiran@30 36
martiran@30 37 class Rule(object):
me@34 38
me@34 39 codes = {
me@34 40 'h': 'head',
me@34 41 'b': 'body',
me@34 42 't': 'tail',
me@34 43 '#': 'wall',
me@34 44 ' ': 'any',
me@34 45 '-': 'empty',
me@34 46 }
me@34 47
martiran@32 48 def __init__ (self, snake):
martiran@32 49 self.snake = snake
me@34 50 self.direction = (1, 0)
me@34 51 self.pattern = {}
me@34 52
me@34 53 def load (self, file):
me@34 54 y = 0
me@34 55 for line in file:
me@34 56 line = preprocess(line)
me@34 57 if y == 0 and line == '':
me@34 58 continue
me@34 59 assert line[-1] == ';', "Rule lines must end with semicolon"
me@34 60 assert len(line) == 8, "Rule lines must be exactly 7 chars long"
me@34 61 for x, char in enumerate(line[:8]):
me@34 62 self.parse_cell(x, y, char)
me@34 63 y += 1
me@34 64
me@34 65 def parse_cell(self, x, y, char):
me@34 66 assert char.lower() in self.codes, "Illegal symbol in rule: %s" % char
me@34 67 cell = engine.Cell(x, y, None)
me@34 68 if char in 'htb':
me@34 69 if char.islower():
me@34 70 cell.snake = 'my'
me@34 71 else:
me@34 72 cell.snake = 'enemy'
me@34 73 cell.type = self.codes[char.lower()]
me@34 74 self.pattern[x, y] = cell
me@34 75
martiran@32 76 def applies (self, field, x, y):
me@34 77
martiran@30 78 pass
martiran@32 79 def rotate (self, rot):
martiran@30 80 pass
me@34 81
me@34 82 # vim: set ts=4 sts=4 sw=4 et: