rev |
line source |
darkhan@20
|
1 from State import * |
darkhan@20
|
2 |
Ilia@1
|
3 class Automata(object): |
darkhan@23
|
4 #field[][] - state symbol |
Ilia@1
|
5 #states[] |
darkhan@23
|
6 #symbols = {} - symbol: number_in_states |
darkhan@11
|
7 |
darkhan@35
|
8 def __init__(self, width=50, height=50, states=None): |
darkhan@11
|
9 self.width = width |
darkhan@11
|
10 self.height = height |
darkhan@20
|
11 if states == None: |
darkhan@25
|
12 self.states = [State("Dead", ' ', "white", [5]), |
darkhan@25
|
13 State("Alive", '+', "black", [1] + range(4, 9))] |
darkhan@20
|
14 else: |
darkhan@20
|
15 self.states = states |
darkhan@11
|
16 self.symbols = {} |
darkhan@11
|
17 for num, st in enumerate(self.states): |
darkhan@11
|
18 self.symbols[st.symbol] = num |
darkhan@11
|
19 self.field = [] |
darkhan@11
|
20 for row in range(height): |
darkhan@11
|
21 self.field.append([]) |
darkhan@11
|
22 for col in range(width): |
darkhan@25
|
23 self.field[row].append(self.states[0].symbol) |
darkhan@11
|
24 |
darkhan@17
|
25 def next_step(self): |
darkhan@42
|
26 changed = [] |
darkhan@11
|
27 new_state = [] |
darkhan@11
|
28 for row in range(self.height): |
darkhan@11
|
29 new_state.append([]) |
darkhan@11
|
30 for col in range(self.width): |
darkhan@28
|
31 symbol = self.field[row][col] |
darkhan@11
|
32 num = 0 |
darkhan@11
|
33 for vert_long in range(row + self.height - 1, |
darkhan@11
|
34 row + self.height + 2): |
darkhan@11
|
35 for horiz_long in range(col + self.width - 1, |
darkhan@11
|
36 col + self.width + 2): |
darkhan@11
|
37 vert = vert_long % self.height |
darkhan@11
|
38 horiz = horiz_long % self.width |
darkhan@24
|
39 if (vert == row) & (horiz == col): continue |
darkhan@11
|
40 if self.field[vert][horiz] == symbol: |
darkhan@11
|
41 num += 1 |
darkhan@11
|
42 new_state[row].append( |
darkhan@11
|
43 self.states[self.symbols[symbol]].next_state(num)) |
darkhan@11
|
44 |
darkhan@11
|
45 for row in range(self.height): |
darkhan@11
|
46 for col in range(self.width): |
darkhan@11
|
47 if new_state[row][col]: |
darkhan@42
|
48 changed.append((row, col)) |
darkhan@11
|
49 self.field[row][col] = self.states[(self.symbols[symbol] |
darkhan@41
|
50 + 1) % len(self.states)].symbol |
darkhan@42
|
51 return changed |
darkhan@11
|
52 |
darkhan@17
|
53 def change_size(self, value, side): |
darkhan@17
|
54 "0-up, 1-right, 2-down, 3-left" |
darkhan@17
|
55 new_field = [] |
darkhan@20
|
56 |
darkhan@17
|
57 if side == 0: |
darkhan@17
|
58 self.height += value |
darkhan@17
|
59 for row in range(value): |
darkhan@17
|
60 new_field.append([]) |
darkhan@17
|
61 for col in range(self.width): |
darkhan@17
|
62 new_field[row].append(states[0].symbol) |
darkhan@20
|
63 init = value |
darkhan@20
|
64 if value < 0: |
darkhan@20
|
65 init = 0 |
darkhan@20
|
66 for row in range(init, self.height): |
darkhan@17
|
67 new_field.append([]) |
darkhan@17
|
68 for col in range(self.width): |
darkhan@17
|
69 new_field[row].append(self.field[row - value][col]) |
darkhan@20
|
70 |
darkhan@17
|
71 if side == 2: |
darkhan@17
|
72 self.height += value |
darkhan@20
|
73 term = -value |
darkhan@20
|
74 if value > 0: |
darkhan@20
|
75 term = 0 |
darkhan@20
|
76 for row in range(self.height - term): |
darkhan@17
|
77 new_field.append([]) |
darkhan@17
|
78 for col in range(self.width): |
darkhan@17
|
79 new_field[row].append(self.field[row][col]) |
darkhan@17
|
80 for row in range(self.height, self.height + value): |
darkhan@17
|
81 new_field.append([]) |
darkhan@17
|
82 for col in range(self.width): |
darkhan@20
|
83 new_field[row].append(states[0].symbol) |
darkhan@20
|
84 |
darkhan@20
|
85 if side == 1: |
darkhan@20
|
86 self.width += value |
darkhan@20
|
87 term = -value |
darkhan@20
|
88 if value > 0: |
darkhan@20
|
89 term = 0 |
darkhan@20
|
90 for row in range(self.height): |
darkhan@20
|
91 new_field.append([]) |
darkhan@20
|
92 for col in range(self.width - term): |
darkhan@20
|
93 new_field[row].append(self.field[row][col]) |
darkhan@20
|
94 for row in range(self.height): |
darkhan@20
|
95 for col in range(self.width, self.width + value): |
darkhan@20
|
96 new_field[row].append(states[0].symbol) |
darkhan@20
|
97 |
darkhan@20
|
98 if side == 3: |
darkhan@20
|
99 self.width += value |
darkhan@20
|
100 for row in range(self.height): |
darkhan@20
|
101 new_field.append([]) |
darkhan@20
|
102 for col in range(value): |
darkhan@20
|
103 new_field[row].append(states[0].symbol) |
darkhan@20
|
104 init = value |
darkhan@20
|
105 if value < 0: |
darkhan@20
|
106 init = 0 |
darkhan@20
|
107 for row in range(self.height): |
darkhan@20
|
108 for col in range(init, self.width): |
darkhan@20
|
109 new_field[row].append(self.field[row][col - value]) |
darkhan@20
|
110 self.field = new_field |