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

snake

annotate engine.py @ 57:2f62804e21fc

Added example snake
author Daniil Alexeyevsky <me.dendik@gmail.com>
date Mon, 20 Dec 2010 00:03:35 +0300
parents b2eaeeb74d87
children f12238066c6d
rev   line source
martiran@12 1 import random as rnd
martiran@15 2 import Tkinter as tk
martiran@12 3
martiran@6 4 directions = [(0,1), (1,0), (0,-1), (-1,0)]
martiran@46 5 tm = [[0, -1], [1, 0]]
martiran@1 6
martiran@5 7 class Cell(object):
martiran@15 8 def __init__(self, x, y, canvas = None):
martiran@1 9 self.x = x
martiran@1 10 self.y = y
martiran@1 11 self.canvas = canvas
martiran@1 12 self.snake = None
martiran@28 13 self.type = 'empty'
martiran@1 14 return
martiran@6 15 def redraw(self):
martiran@32 16 field_size = min(self.canvas.height, self.canvas.width)
martiran@32 17 offset = (self.canvas.width - field_size, self.canvas.hieght - field_size)
martiran@15 18 if self.type == 'wall':
martiran@15 19 self.canvas.create_rectangle(offset[0], offset[1], offset[0] + self.x*field_size/21.0, offset[1] + self.y*field_size/21.0, fill="grey")
martiran@15 20 pass
martiran@15 21 elif self.type == 'empty':
martiran@15 22 self.canvas.create_rectangle(offset[0], offset[1], offset[0] + self.x*field_size/21.0, offset[1] + self.y*field_size/21.0, fill="black")
martiran@15 23 pass
martiran@15 24 elif self.type == 'body':
martiran@15 25 self.canvas.create_rectangle(offset[0], offset[1], offset[0] + self.x*field_size/21.0, offset[1] + self.y*field_size/21.0, fill=self.snake.color)
martiran@15 26 pass
martiran@15 27 elif self.type == 'head':
martiran@15 28 self.canvas.create_oval(offset[0], offset[1], offset[0] + self.x*field_size/21.0, offset[1] + self.y*field_size/21.0, fill=self.snake.color)
martiran@15 29 pass
martiran@15 30 elif self.type == 'tail':
martiran@15 31 self.canvas.create_polygon(offset[0], offset[1], offset[0] + self.x*field_size/21.0, offset[1], offset[0] + self.x*field_size/(2*21.0), offset[1] + self.y*field_size/21.0, fill=self.snake.color)
martiran@15 32 pass
martiran@15 33 return
martiran@6 34 def __eq__(self, pattern):
martiran@6 35 if pattern.type == self.type:
martiran@6 36 return True
martiran@6 37 else:
martiran@6 38 return False
martiran@6 39 return
martiran@6 40 def clear(self):
martiran@1 41 self.snake = None
martiran@1 42 self.type = 'empty'
martiran@1 43 return
martiran@1 44
martiran@2 45
martiran@5 46 class Engine(object):
martiran@6 47 def __init__(self, canvas):
martiran@1 48 self.canvas = canvas
martiran@28 49 #self.w = min(canvas.height, canvas.width)
martiran@28 50 #self.h = min(canvas.height, canvas.width)
martiran@12 51 self.snakes = [None, None, None, None]
martiran@9 52 self.init_field()
martiran@9 53 return
martiran@9 54 def init_field (self):
martiran@9 55 self.field = {}
martiran@9 56 for x in range(21):
martiran@9 57 for y in range(21):
martiran@9 58 self.field[x, y] = Cell(x, y, self.canvas)
martiran@9 59 for y in range(21):
martiran@9 60 self.field[0, y].type = 'wall'
martiran@9 61 self.field[20, y].type = 'wall'
martiran@9 62 for x in range(1,20):
martiran@9 63 self.field[x, 0].type = 'wall'
martiran@9 64 self.field[x, 20].type = 'wall'
martiran@1 65 return
martiran@6 66 def step(self):
martiran@9 67 for snake in self.snakes:
martiran@12 68 if snake == None:
martiran@12 69 pass
martiran@12 70 else:
martiran@12 71 self.legal_moves()
martiran@12 72 self.move_snake(snake)
martiran@12 73 self.refill()
martiran@9 74 self.redraw()
martiran@9 75 return
martiran@9 76 def move_snake(self, snake):
martiran@12 77 applied_dir = None
martiran@12 78 for rule in snake.rules:
martiran@12 79 if applied_dir != None:
martiran@12 80 choose_dir = []
martiran@12 81 for direction in snake.legal_dir:
martiran@12 82 rule.direction = direction
martiran@12 83 if rule.applies() == True:
martiran@12 84 choose_dir.append(direction)
martiran@12 85 pass
martiran@12 86 pass
martiran@12 87 if len(choose_move) != 0:
martiran@12 88 applied_dir = choose_dir[int(rnd.random()*len(choose_dir))]
martiran@12 89 pass
martiran@12 90 else:
martiran@17 91 dir_cell = self.field[snake.cells[0].y + applied_dir[0], snake.cells[0].x + applied_dir[1]]
martiran@17 92 if dir_cell.type == 'empty':
martiran@17 93 snake.cells.insert(0,dir_cell)
martiran@17 94 del snake.cells[-1]
martiran@12 95 pass
martiran@12 96 elif (dir_cell.type == 'tail' and dir_cell.snake != snake):
martiran@17 97 snake.cells.insert(0,dir_cell)
martiran@17 98 del dir_cell.snake.cells[-1]
martiran@12 99 pass
martiran@12 100 break
martiran@12 101 if applied_dir == None:
martiran@12 102 applied_dir = legal_dir[int(rnd.random()*len(legal_dir))]
martiran@17 103 dir_cell = self.field[snake.cells[0].y + applied_dir[0], snake.cells[0].x + applied_dir[1]]
martiran@17 104 if dir_cell.type == 'empty':
martiran@17 105 snake.cells.insert(0,dir_cell)
martiran@17 106 del snake.cells[-1]
martiran@12 107 pass
martiran@12 108 elif (dir_cell.type == 'tail' and dir_cell.snake != snake):
martiran@17 109 snake.cells.insert(0,dir_cell)
martiran@17 110 del dir_cell.snake.cells[-1]
martiran@12 111 pass
martiran@12 112 pass
martiran@14 113 return
martiran@6 114 def create_snake(self, snake_number):
martiran@46 115 cells_id = []
martiran@46 116 for y in range(10):
martiran@46 117 cells_id.append(10, y+1)
martiran@46 118 for rot_num in range(snake_number - 1):
martiran@46 119 for sell in cells_id:
martiran@46 120 cells_id[cells_id.index(sell)] = (tm[0][0]*sell[0] + tm[0][1]*sell[1],tm[1][0]*sell[0] + tm[1][1]*sell[1])
martiran@46 121 cells = []
martiran@46 122 for cell in cells_id:
martiran@46 123 cells.append(self.field[sell])
martiran@46 124 color_dic = {
martiran@46 125 1:'blue',
martiran@46 126 2:'green',
martiran@46 127 3:'yellow',
martiran@46 128 4:'red',}
martiran@46 129 self.snakes[snake_number-1] = snake.Snake(cells, color_dic[snake_number])
martiran@1 130 pass
martiran@6 131 def refill(self):
martiran@12 132 for x in range(1,20):
martiran@12 133 for y in range(1,20):
martiran@12 134 self.field[x, y].type = 'empty'
martiran@31 135 self.field[x, y].snake = None
martiran@12 136 pass
martiran@12 137 for snake in self.snakes:
martiran@12 138 if snake == None:
martiran@12 139 pass
martiran@12 140 else:
martiran@31 141 snake.fill()
martiran@12 142 pass
martiran@14 143 return
martiran@9 144 def redraw(self):
martiran@16 145 self.canvas.delete(all)
martiran@32 146 for cell_coord in self.field:
martiran@32 147 self.field[cell_coord].redraw()
martiran@15 148 return
martiran@6 149 def legal_moves(self, snake):
martiran@6 150 snake.legal_dir = []
martiran@6 151 for direction in directions:
martiran@17 152 dir_cell = self.field[snake.cells[0].y + direction[0], snake.cells[0].x + direction[1]]
martiran@12 153 if (dir_cell.type == 'empty' or (dir_cell.type == 'tail' and dir_cell.snake != snake)):
martiran@6 154 snake.legal_dir.append(direction)
martiran@6 155 return
martiran@6 156 return
martiran@6 157