view engine.py @ 107:b38281ca9b5c
fixed random sell snake movement
author |
Alex Martynov <martiran@kodomo.fbb.msu.ru> |
date |
Mon, 20 Dec 2010 11:52:45 +0300 |
parents |
020c62119e6f |
children |
d29a90f5095d |
line source
5 directions = [(0,1), (1,0), (0,-1), (-1,0)]
9 def __init__(self, x, y, canvas = None):
17 field_size = min(self.canvas.winfo_height(), self.canvas.winfo_width())
18 offset = ((self.canvas.winfo_width() - field_size)/2.0, (self.canvas.winfo_height() - field_size)/2.0)
19 x0=offset[0] + self.x*field_size/21.0
20 y0=offset[1] + self.y*field_size/21.0
21 x1=offset[0] + (self.x+1)*field_size/21.0
22 y1=offset[1] + (self.y+1)*field_size/21.0
23 x2=offset[0] + (self.x+1/2.0)*field_size/21.0
24 if self.type == 'wall':
25 self.canvas.create_rectangle(x0, y0, x1, y1, fill="grey")
27 elif self.type == 'empty':
28 self.canvas.create_rectangle(x0, y0, x1, y1, fill="black")
30 elif self.type == 'body':
31 self.canvas.create_rectangle(x0, y0, x1, y1, fill=self.snake.color)
33 elif self.type == 'head':
34 self.canvas.create_oval(x0, y0, x1, y1, fill=self.snake.color)
36 elif self.type == 'tail':
37 self.canvas.create_polygon(x0, y0, x1, y0, x2, y1, fill=self.snake.color)
40 def __eq__(self, pattern):
41 if pattern.type == 'any':
43 if pattern.type != self.type:
45 if pattern.snake_type == 'my' and pattern.snake != self.snake:
47 elif pattern.snake_type == 'enemy' and pattern.snake == self.snake:
57 def __init__(self, canvas):
59 self.w = min(canvas.winfo_height(), canvas.winfo_width())
60 self.h = min(canvas.winfo_height(), canvas.winfo_width())
61 self.snakes = [None, None, None, None]
64 def init_field (self):
68 self.field[x, y] = Cell(x, y, self.canvas)
70 self.field[0, y].type = 'wall'
71 self.field[20, y].type = 'wall'
73 self.field[x, 0].type = 'wall'
74 self.field[x, 20].type = 'wall'
79 for i, snake in enumerate(self.snakes):
81 if len(snake.cells) == 0:
84 self.legal_moves(snake)
85 self.move_snake(snake)
89 def move_snake(self, snake):
91 for rule in snake.rules:
92 for direction in snake.legal_dir:
93 rule.rotate(direction)
94 if rule.applies(self.field, head.x, head.y) == True:
95 self.move_do(snake, direction)
97 if snake.legal_dir != []:
98 self.move_do(snake, snake.legal_dir[0])
101 def move_do(self, snake, applied_dir):
102 head = snake.cells[0]
103 dir_cell = self.field[head.x + applied_dir[0], head.y + applied_dir[1]]
104 if dir_cell.type == 'empty':
105 snake.cells.insert(0,dir_cell)
108 elif (dir_cell.type == 'tail' and dir_cell.snake != snake):
109 snake.cells.insert(0,dir_cell)
110 del dir_cell.snake.cells[-1]
113 def create_snake(self, snake_number):
116 cells_id.append((10, y+1))
117 for rot_num in range(snake_number - 1):
118 for i, cell in enumerate(cells_id):
119 cells_id[i] = ((tm[0][0]*(cell[0]-10) + tm[0][1]*(cell[1]-10))+10,(tm[1][0]*(cell[0]-10) + tm[1][1]*(cell[1]-10))+10)
121 for cell in cells_id:
122 cells.append(self.field[cell])
128 self.snakes[snake_number-1] = snake.Snake(cells, color_dic[snake_number])
129 return self.snakes[snake_number-1]
131 for x in range(1,20):
132 for y in range(1,20):
133 self.field[x, y].type = 'empty'
134 self.field[x, y].snake = None
136 for snake in self.snakes:
144 self.canvas.delete(all)
145 for cell_coord in self.field:
146 self.field[cell_coord].redraw()
148 def legal_moves(self, snake):
150 for direction in directions:
151 dir_cell = self.field[snake.cells[0].y + direction[0], snake.cells[0].x + direction[1]]
152 if (dir_cell.type == 'empty' or (dir_cell.type == 'tail' and dir_cell.snake != snake)):
153 snake.legal_dir.append(direction)
154 rnd.shuffle(snake.legal_dir)