【Python】ライフゲームをCUIで実行する

2次元配列を次の世代のセルに更新するためにupdate_cellsメソッドを作成し、
ライフゲームをCUIで実行できるようにする。

class LifeGame:
  def __init__(self):
    self.cells = [[0, 1, 0, 0, 0],
                  [0, 0, 1, 0, 0],
                  [1, 1, 1, 0, 0],
                  [0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0]]

  def update_cells(self):
    tmp = [[0]*len(self.cells[0]) for _ in range(len(self.cells))]
    for y in range(len(self.cells)):
      for x in range(len(self.cells[0])):
        tmp[y][x] = self._check_rules(x,y,sum(self._flatten(self._get_around_cells(x,y))))
    self.cells = tmp.copy()

  def print_cells(self):
    for x in self.cells:
      print(*x)

  def _get_around_cells(self,_x,_y):
    return [[self.cells[y][x] for x in range(max(_x-1,0),min(_x+2,len(self.cells[0]))) if x != _x or y != _y] for y in range(max(_y-1,0),min(_y+2,len(self.cells)))]

  def _flatten(self,_arr):
    return sum(_arr,[])

  def _check_rules(self,_x,_y,_num):
    if self.cells[_y][_x] == 0:
      if _num == 3:
        return 1
      else:
        return 0
    else:
      if _num <= 1 or _num >= 4:
        return 0
      else:
        return 1

lg = LifeGame()
for i in range(5):
  lg.update_cells()
  lg.print_cells()
  if i != 4:
    print()

今回は、以下のように出力される。

0 0 0 0 0
1 0 1 0 0
0 1 1 0 0
0 1 0 0 0
0 0 0 0 0

0 0 0 0 0
0 0 1 0 0
1 0 1 0 0
0 1 1 0 0
0 0 0 0 0

0 0 0 0 0
0 1 0 0 0
0 0 1 1 0
0 1 1 0 0
0 0 0 0 0

0 0 0 0 0
0 0 1 0 0
0 0 0 1 0
0 1 1 1 0
0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 1 0 1 0
0 0 1 1 0
0 0 1 0 0

参考

ライフゲーム - Wikipedia
タイトルとURLをコピーしました