parent
e9a4e53454
commit
36e87307dd
@ -0,0 +1,21 @@
|
|||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
@ -0,0 +1,144 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from numpy import matrix
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
class Board():
|
||||||
|
|
||||||
|
# Board should be a n x n matix of cells that describes a flat torus
|
||||||
|
def __init__(self, cells=None):
|
||||||
|
if cells is None:
|
||||||
|
self.cells = self.from_file("board.txt")
|
||||||
|
self.shape = self.cells.shape
|
||||||
|
else:
|
||||||
|
self.cells = cells
|
||||||
|
self.shape = cells.shape
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
string = ""
|
||||||
|
shape = self.shape
|
||||||
|
for row in range(shape[0]):
|
||||||
|
for i in range(shape[1]):
|
||||||
|
cell = self.cells.item(row,i)
|
||||||
|
string = string + str(cell) + ' '
|
||||||
|
string = string + '\n'
|
||||||
|
return string[:-2]
|
||||||
|
|
||||||
|
def from_file(self, file_name):
|
||||||
|
self.save_file = open(file_name,'r')
|
||||||
|
rowc = 0
|
||||||
|
board = []
|
||||||
|
for row in self.save_file:
|
||||||
|
board.append([])
|
||||||
|
cellc = 0
|
||||||
|
for cell in row[:-1].split(','):
|
||||||
|
board[rowc].append( Cell(rowc,cellc,bool(int(cell))) )
|
||||||
|
cellc = cellc + 1
|
||||||
|
rowc = rowc + 1
|
||||||
|
return matrix(board)
|
||||||
|
|
||||||
|
def get_neighbours(self, cell):
|
||||||
|
# It is from the neighbours that we know we are on a torus
|
||||||
|
my_row = cell.x
|
||||||
|
my_col = cell.y
|
||||||
|
row = self.shape[0] -1
|
||||||
|
col = self.shape[1] -1
|
||||||
|
first_row = my_row - 1
|
||||||
|
first_col = my_col - 1
|
||||||
|
last_row = my_row + 1
|
||||||
|
last_col = my_col + 1
|
||||||
|
|
||||||
|
if my_row == 0:
|
||||||
|
first_row = row
|
||||||
|
|
||||||
|
if my_col == 0:
|
||||||
|
first_col = col
|
||||||
|
|
||||||
|
if my_row == row:
|
||||||
|
last_row = 0
|
||||||
|
|
||||||
|
if my_col == col:
|
||||||
|
last_col = 0
|
||||||
|
|
||||||
|
return MooreN( [ self.cells.item(first_row,first_col), self.cells.item(first_row,my_col), self.cells.item(first_row,last_col),
|
||||||
|
self.cells.item(my_row,first_col), self.cells.item(my_row,last_col), self.cells.item(last_row,first_col),
|
||||||
|
self.cells.item(last_row,my_col), self.cells.item(last_row,last_col) ], cell)
|
||||||
|
|
||||||
|
|
||||||
|
def next_gen(self):
|
||||||
|
board = []
|
||||||
|
shape = self.shape
|
||||||
|
for row in range(shape[0]):
|
||||||
|
board.append([])
|
||||||
|
for col in range(shape[1]):
|
||||||
|
cell = self.cells.item(row,col)
|
||||||
|
board[row].append( Cell( row, col , self.get_neighbours(cell).is_alive() ) )
|
||||||
|
return Board(matrix (board))
|
||||||
|
|
||||||
|
class Cell:
|
||||||
|
|
||||||
|
# A cell is either dead or alive and has coordinates
|
||||||
|
|
||||||
|
def __init__(self, x, y, alive):
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.alive = alive
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if self.alive:
|
||||||
|
return "*"
|
||||||
|
else:
|
||||||
|
return " "
|
||||||
|
|
||||||
|
def kill(self):
|
||||||
|
self.alive = False
|
||||||
|
|
||||||
|
def hatch(self):
|
||||||
|
self.alive = True
|
||||||
|
|
||||||
|
class MooreN:
|
||||||
|
|
||||||
|
# Moore Neighbourhood is all eight cells surrounding a central cell
|
||||||
|
# ***
|
||||||
|
# * *
|
||||||
|
# ***
|
||||||
|
|
||||||
|
def __init__(self, cells, cell):
|
||||||
|
self.cells = cells
|
||||||
|
self.cell = cell
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
string = ""
|
||||||
|
for cell in self.cells:
|
||||||
|
string = string + str(cell) + '\n'
|
||||||
|
return string[:-1]
|
||||||
|
|
||||||
|
def count(self):
|
||||||
|
count = 0
|
||||||
|
for cell in self.cells:
|
||||||
|
if cell.alive:
|
||||||
|
count = count + 1
|
||||||
|
return count
|
||||||
|
|
||||||
|
def is_alive(self):
|
||||||
|
if self.cell.alive:
|
||||||
|
if self.count() == 2 or self.count() == 3:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.count() == 3:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
board = Board()
|
||||||
|
while True:
|
||||||
|
print("\033[H\033[J")
|
||||||
|
print(board)
|
||||||
|
time.sleep(0.3)
|
||||||
|
board = board.next_gen()
|
||||||
|
|
||||||
|
|
Loading…
Reference in new issue