Pella86

Game of life

Oct 4th, 2017
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.62 KB | None | 0 0
  1. from copy import deepcopy
  2.  
  3. from MyImage_class import MyImage
  4.  
  5. class Cell:
  6.    
  7.     def __init__(self, x, y, value):
  8.         self.x = x
  9.         self.y = y
  10.         self.value = value
  11.        
  12.     def __str__(self):
  13.         return "(" + str(self.x) + " " + str(self.y) +") "+str(self.value)
  14.  
  15.  
  16. class Table:
  17.    
  18.    
  19.     def __init__(self, size_x, size_y):
  20.        
  21.         self.size_x = size_x
  22.         self.size_y = size_y
  23.        
  24.        
  25.         self.table = []
  26.        
  27.         self.pixel_threshold = 0.5
  28.        
  29.         for x in range(size_x):
  30.             for y in range(size_y):
  31.                 self.table.append(Cell(x, y, 0))
  32.    
  33.     def __str__(self):
  34.         s = ""
  35.         for x in range(self.size_x):
  36.             for y in range(self.size_y):
  37.                 s += "|" + str(self.getCell(x, y).value) + "|"
  38.             s += "\n"
  39.         return s
  40.    
  41.    
  42.     def getNeighbors(self, x, y):
  43.        
  44.         neighbors = []
  45.         for i in (-1, 0, 1):
  46.             for j in (-1, 0, 1):
  47.                 nx = x + i
  48.                 ny = y + j
  49.                
  50.                
  51.                
  52.                 if nx >= 0 and nx < self.size_x and ny >= 0 and ny < self.size_y:
  53.                     if nx == x and ny == y:
  54.                         pass
  55.                     else:
  56.                         neighbors.append(self.getCell(nx, ny))
  57.         return neighbors
  58.        
  59.    
  60.     def setCell(self, x, y, value):
  61.         self.table[self.size_x*x + y].value = value
  62.        
  63.     def getCell(self, x, y):
  64.         return self.table[self.size_x*x + y]
  65.    
  66.     def saveFile(self, filename = "./text.txt"):
  67.         s = ""
  68.         for x in range(self.size_x):
  69.             for y in range(self.size_y):
  70.                 s += str(self.getCell(x, y).value) + " "
  71.             s += "\n"
  72.        
  73.         with open(filename, "w") as f:
  74.             f.write(s)
  75.    
  76.     def loadFile(self, filename = "./text.txt"):
  77.         self.table = []
  78.        
  79.         with open(filename, "r") as f:
  80.             lines = f.readlines()
  81.         x = 0
  82.        
  83.         for line in lines:
  84.             values = line.strip().split(" ")
  85.             for y, value in enumerate(values):
  86.                 self.table.append(Cell(x, y, int(value)))
  87.             x += 1    
  88.  
  89.        
  90.         self.size_x = x
  91.         self.size_y = y + 1
  92.        
  93.     def readFromImage(self, filename = "test_picture.png"):
  94.         img = MyImage()
  95.        
  96.         img.read_from_file(filename)
  97.         img.convert2grayscale()
  98.        
  99.         img.transpose()
  100.        
  101.         img.normalize()
  102.         img.limit(1)
  103.  
  104.         table_x = img.data.shape[0]
  105.         table_y = img.data.shape[1]
  106.        
  107.         # binarize the image
  108.         self.size_x = table_x
  109.         self.size_y = table_y
  110.  
  111.         self.table = []
  112.        
  113.         for x in range(table_y):
  114.             for y in range(table_x):
  115.                 if img.data[y][x] < self.pixel_threshold:
  116.                     self.table.append(Cell(x, y, 1))
  117.  
  118.                 else:
  119.                     self.table.append(Cell(x, y, 0))
  120.    
  121.     def saveToImage(self, filename = "turn_test_picture.png"):
  122.         img = MyImage((self.size_x, self.size_y))
  123.        
  124.         for cell in self.table:
  125.             if cell.value > self.pixel_threshold:
  126.                 img.data[cell.y][cell.x] = 1
  127.             else:
  128.                 img.data[cell.y][cell.x] = 0                
  129.  
  130.         img.save(filename)
  131.  
  132.  
  133. class GameLife:
  134.    
  135.     def __init__(self):
  136.        
  137.         table_x = 10
  138.         table_y = 10
  139.        
  140.         self.game_board = Table(table_x, table_y)
  141.    
  142.     def nextTurn(self):
  143.        
  144.         # copy the table
  145.        
  146.         delete = deepcopy(self.game_board)
  147.        
  148.         for cell in delete.table:
  149.             neighbors = self.game_board.getNeighbors(cell.x, cell.y)
  150.            
  151.             count = sum(n.value for n in neighbors)
  152.            
  153.             if count < 2:
  154.                 cell.value = 0
  155.             elif count > 3:
  156.  
  157.                 cell.value = 0
  158.             elif count == 3:
  159.  
  160.                 cell.value = 1
  161.        
  162.         for dele, cell in zip(delete.table, self.game_board.table):
  163.             cell.value = dele.value
  164.  
  165. gl = GameLife()
  166. print("read from file")
  167. gl.game_board.readFromImage()
  168. #gl.game_board.loadFile()
  169.  
  170. print("save file")
  171. gl.game_board.saveToImage("turn_0.png")
  172.  
  173. #print(gl.game_board)
  174.  
  175. total_turn = 200
  176. counter = 1
  177.  
  178. while counter <= total_turn:
  179.     print("calculating turn...", counter)
  180.  
  181.     gl.nextTurn()
  182.     gl.game_board.saveToImage("turn_" + str(counter)+ ".png")
  183.    
  184.     #print(gl.game_board)
  185.    
  186.     counter += 1
Advertisement
Add Comment
Please, Sign In to add comment