Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/cca/annotate/ff86e9e36638/Automata.py
Дата изменения: Unknown
Дата индексирования: Fri Feb 28 22:51:42 2014
Кодировка:
cca: Automata.py annotate

cca

annotate Automata.py @ 42:ff86e9e36638

New next_step in Automata and new: draw_step
author darkhan
date Sun, 05 Dec 2010 16:20:10 +0300
parents 008b6e43ca47
children ba9fa6850b45
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