| 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 |