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