rev |
line source |
darkhan@105
|
1 """Copyright 2010 Aydarkhanov Ruslan, Kurochkin Ilya, Rusinov Ivan |
darkhan@105
|
2 |
darkhan@105
|
3 This file is part of Foobar. |
darkhan@105
|
4 |
darkhan@105
|
5 Foobar is free software: you can redistribute it and/or modify it under |
darkhan@105
|
6 the terms of the GNU General Public License as published |
darkhan@105
|
7 by the Free Software Foundation, either version 2 of the License, |
darkhan@105
|
8 or (at your option) any later version. |
darkhan@105
|
9 |
darkhan@105
|
10 Foobar is distributed in the hope that it will be useful, |
darkhan@105
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty |
darkhan@105
|
12 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
darkhan@105
|
13 See the GNU General Public License for more details. |
darkhan@105
|
14 |
darkhan@105
|
15 You should have received a copy of the GNU General Public License |
darkhan@105
|
16 along with Foobar. If not, see http://www.gnu.org/licenses/. |
darkhan@105
|
17 """ |
darkhan@105
|
18 |
darkhan@88
|
19 from state import * |
darkhan@20
|
20 |
Ilia@1
|
21 class Automata(object): |
darkhan@80
|
22 def __init__(self, width=150, height=70, states=None): |
darkhan@11
|
23 self.width = width |
darkhan@11
|
24 self.height = height |
darkhan@20
|
25 if states == None: |
darkhan@81
|
26 self.states = [State("Dead", '-', "white", '0', [5]), |
darkhan@88
|
27 State("Alive", '+', "black", '1', [0, 1] + range(4, 9))] |
darkhan@20
|
28 else: |
darkhan@20
|
29 self.states = states |
darkhan@11
|
30 self.symbols = {} |
darkhan@62
|
31 self.st_sym = {} |
darkhan@11
|
32 for num, st in enumerate(self.states): |
darkhan@11
|
33 self.symbols[st.symbol] = num |
darkhan@62
|
34 self.st_sym[st.symbol] = st |
darkhan@11
|
35 self.field = [] |
darkhan@11
|
36 for row in range(height): |
darkhan@11
|
37 self.field.append([]) |
darkhan@11
|
38 for col in range(width): |
darkhan@25
|
39 self.field[row].append(self.states[0].symbol) |
darkhan@11
|
40 |
darkhan@17
|
41 def next_step(self): |
darkhan@42
|
42 changed = [] |
darkhan@62
|
43 for row in range(1, self.height - 1): |
darkhan@62
|
44 for col in range(1, self.width - 1): |
darkhan@28
|
45 symbol = self.field[row][col] |
darkhan@11
|
46 num = 0 |
darkhan@62
|
47 for vert in range(row - 1, row + 2): |
darkhan@62
|
48 for horiz in range(col - 1, col + 2): |
darkhan@11
|
49 if self.field[vert][horiz] == symbol: |
darkhan@11
|
50 num += 1 |
darkhan@62
|
51 if self.st_sym[symbol].next_state(num - 1): |
darkhan@49
|
52 changed.append((row, col)) |
darkhan@62
|
53 |
darkhan@62
|
54 for row in range(1, self.height - 1): |
darkhan@62
|
55 symbol1 = self.field[row][0] |
darkhan@62
|
56 symbol2 = self.field[row][self.width - 1] |
darkhan@62
|
57 num1 = 0 |
darkhan@62
|
58 num2 = 0 |
darkhan@62
|
59 for vert in range(row - 1, row + 2): |
darkhan@62
|
60 for horiz in [0, 1, self.width - 1]: |
darkhan@62
|
61 if self.field[vert][horiz] == symbol1: |
darkhan@62
|
62 num1 += 1 |
darkhan@62
|
63 for horiz in [self.width - 2, self.width - 1, 0]: |
darkhan@62
|
64 if self.field[vert][horiz] == symbol2: |
darkhan@62
|
65 num2 += 1 |
darkhan@62
|
66 if self.st_sym[symbol1].next_state(num1 - 1): |
darkhan@62
|
67 changed.append((row, 0)) |
darkhan@62
|
68 if self.st_sym[symbol2].next_state(num2 - 1): |
|