Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/cca/raw-annotate/749533cdfc67/Automata.py
Дата изменения: Unknown
Дата индексирования: Fri Feb 11 14:46:55 2011
Кодировка: Windows-1251

darkhan@20: from State import *
darkhan@20:
Ilia@1: class Automata(object):
darkhan@11: #field[][] - Хранит символ состояния
Ilia@1: #states[]
darkhan@11: #symbols = {} - символ: номер_в_states
darkhan@11:
darkhan@20: def __init__(self, width, height, states=None):
darkhan@11: self.width = width
darkhan@11: self.height = height
darkhan@20: if states == None:
darkhan@20: self.states = [State("Dead", ' ', white, [5]),
darkhan@20: State("Alive", '+', black, [1] + range(4, 9))]
darkhan@20: else:
darkhan@20: self.states = states
darkhan@11: self.symbols = {}
darkhan@11: for num, st in enumerate(self.states):
darkhan@11: self.symbols[st.symbol] = num
darkhan@11: self.field = []
darkhan@11: for row in range(height):
darkhan@11: self.field.append([])
darkhan@11: for col in range(width):
darkhan@11: self.field[row].append(states[0].symbol)
darkhan@11:
darkhan@17: def next_step(self):
darkhan@11: new_state = []
darkhan@11: for row in range(self.height):
darkhan@11: new_state.append([])
darkhan@11: for col in range(self.width):
darkhan@11: symbol = field[row][col]
darkhan@11: num = 0
darkhan@11: for vert_long in range(row + self.height - 1,
darkhan@11: row + self.height + 2):
darkhan@11: for horiz_long in range(col + self.width - 1,
darkhan@11: col + self.width + 2):
darkhan@11: vert = vert_long % self.height
darkhan@11: horiz = horiz_long % self.width
darkhan@11: if (vert == row) & (horiz = col): continue
darkhan@11: if self.field[vert][horiz] == symbol:
darkhan@11: num += 1
darkhan@11: new_state[row].append(
darkhan@11: self.states[self.symbols[symbol]].next_state(num))
darkhan@11:
darkhan@11: for row in range(self.height):
darkhan@11: for col in range(self.width):
darkhan@11: if new_state[row][col]:
darkhan@11: self.field[row][col] = self.states[(self.symbols[symbol]
darkhan@11: + 1) % len(states)].symbol
darkhan@11:
darkhan@17: def change_size(self, value, side):
darkhan@17: "0-up, 1-right, 2-down, 3-left"
darkhan@17: new_field = []
darkhan@20:
darkhan@17: if side == 0:
darkhan@17: self.height += value
darkhan@17: for row in range(value):
darkhan@17: new_field.append([])
darkhan@17: for col in range(self.width):
darkhan@17: new_field[row].append(states[0].symbol)
darkhan@20: init = value
darkhan@20: if value < 0:
darkhan@20: init = 0
darkhan@20: for row in range(init, self.height):
darkhan@17: new_field.append([])
darkhan@17: for col in range(self.width):
darkhan@17: new_field[row].append(self.field[row - value][col])
darkhan@20:
darkhan@17: if side == 2:
darkhan@17: self.height += value
darkhan@20: term = -value
darkhan@20: if value > 0:
darkhan@20: term = 0
darkhan@20: for row in range(self.height - term):
darkhan@17: new_field.append([])
darkhan@17: for col in range(self.width):
darkhan@17: new_field[row].append(self.field[row][col])
darkhan@17: for row in range(self.height, self.height + value):
darkhan@17: new_field.append([])
darkhan@17: for col in range(self.width):
darkhan@20: new_field[row].append(states[0].symbol)
darkhan@20:
darkhan@20: if side == 1:
darkhan@20: self.width += value
darkhan@20: term = -value
darkhan@20: if value > 0:
darkhan@20: term = 0
darkhan@20: for row in range(self.height):
darkhan@20: new_field.append([])
darkhan@20: for col in range(self.width - term):
darkhan@20: new_field[row].append(self.field[row][col])
darkhan@20: for row in range(self.height):
darkhan@20: for col in range(self.width, self.width + value):
darkhan@20: new_field[row].append(states[0].symbol)
darkhan@20:
darkhan@20: if side == 3:
darkhan@20: self.width += value
darkhan@20: for row in range(self.height):
darkhan@20: new_field.append([])
darkhan@20: for col in range(value):
darkhan@20: new_field[row].append(states[0].symbol)
darkhan@20: init = value
darkhan@20: if value < 0:
darkhan@20: init = 0
darkhan@20: for row in range(self.height):
darkhan@20: for col in range(init, self.width):
darkhan@20: new_field[row].append(self.field[row][col - value])
darkhan@20: self.field = new_field