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
|