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

snake

annotate engine.py @ 80:2f56e186e75c

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