Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python을 사용하는 Conway의 Game Of Life?

<시간/>

1970년경 영국의 한 수학자는 자신의 "Game of Life"를 만들었습니다. 이 게임은 기본적으로 생물학적 유기체 군체의 혼란스럽지만 패턴화된 성장을 묘사하는 일련의 규칙입니다. "Game of Life"는 "살아있는" 세포와 "죽은" 세포로 구성된 2차원 격자입니다.

인생 게임의 규칙

  • 인구 과잉 :세포가 3개 이상의 살아있는 세포에 둘러싸여 있으면 세포가 죽습니다(꺼짐).

  • 정적 :세포가 2~3개의 살아있는 세포로 둘러싸여 있으면 세포가 살아(on)합니다.

  • 인구 부족 :세포가 2개 미만의 살아있는 세포로 둘러싸여 있으면 세포가 죽습니다(꺼짐).

  • 복제 :죽은 세포가 정확히 3개의 세포로 둘러싸여 있으면 세포가 살아있는(켜짐) 상태가 됩니다.

Python을 사용하는 Conway의 Game Of Life?

Python을 사용하는 Conway의 Game Of Life? 다음 타임스탬프에서 셀이 죽습니다.

Python을 사용하는 Conway의 Game Of Life? 다음 타임스탬프에서 셀이 활성화됩니다.

Python을 사용하는 Conway의 Game Of Life? 셀이 활성 상태입니다.

Python을 사용하는 Conway의 Game Of Life? 셀이 죽었습니다.

위의 규칙을 순차적으로 적용하면 아름답고 예상치 못한 패턴을 얻을 수 있습니다.

구현 단계:

i. Initialise an empty universe
ii. Fill the universe with the seed
iii. Calculate if the current cell survives to the next timestamps, based on its neighbours
iv. Repeat this survival function(like step-iii) over all the cells in the universe neighbours.
v. Repeat steps iii-iv for the desired number of generations.

설치:

conways 삶의 게임을 만들려면 matplotlib 및 numpy 배열 라이브러리를 사용할 것입니다. numpy와 matplolib를 설치하려면 pip-

를 사용하세요.
$pip install numpy, matplolib

conways 게임 오브 라이프를 구현하는 프로그램:

이제 위의 규칙 세트에 따라 프로그램을 작성할 시간입니다. 아래는 Game of Life를 구현하는 프로그램입니다.

#Import required library

import numpy as np
import matplotlib.pyplot as plt

import argparse
import time

#-------------------------------------------------------------------------
class Board(object):
   def __init__(self, size, seed = 'Random'):
      if seed == 'Random':
         self.state = np.random.randint(2, size = size)
      self.engine = Engine(self)
      self.iteration = 0
   def animate(self):
      i = self.iteration
      im = None
      plt.title("Conway's Game of Life")
      while True:
         if i == 0:
            plt.ion()
            im = plt.imshow(self.state, vmin = 0, vmax = 2, cmap = plt.cm.gray)
         else:
            im.set_data(self.state)
         i += 1
         self.engine.applyRules()
         print('Life Cycle: {} Birth: {} Survive: {}'.format(i, self.engine.nBirth, self.engine.nSurvive))
         plt.pause(0.01)
         yield self

#-------------------------------------------------------------------------

class Engine(object):
   def __init__(self, board):
      self.state = board.state
   def countNeighbors(self):
      state = self.state
      n = (state[0:-2,0:-2] + state[0:-2,1:-1] + state[0:-2,2:] +
          state[1:-1,0:-2] + state[1:-1,2:] + state[2:,0:-2] +
          state[2:,1:-1] + state[2:,2:])
      return n
   def applyRules(self):
      n = self.countNeighbors()
      state = self.state
      birth = (n == 3) & (state[1:-1,1:-1] == 0)
      survive = ((n == 2) | (n == 3)) & (state[1:-1,1:-1] == 1)
      state[...] = 0
      state[1:-1,1:-1][birth | survive] = 1
      nBirth = np.sum(birth)
      self.nBirth = nBirth
      nSurvive = np.sum(survive)
      self.nSurvive = nSurvive
   return state

#-------------------------------------------------------------------------

def main():
   ap = argparse.ArgumentParser(add_help = False) # Intilialize Argument Parser
   ap.add_argument('-h', '--height', help = 'Board Height', default = 256)
   ap.add_argument('-w', '--width', help = 'Board Width', default = 256)
   args = vars(ap.parse_args()) # Gather Arguments
   bHeight = int(args['height'])
   bWidth = int(args['width'])
   board = Board((bHeight,bWidth))
   for _ in board.animate():
      pass
#-------------------------------------------------------------------------

if __name__ == '__main__':
   main()

출력

Console:
Life Cycle: 1 Birth: 7166 Survive: 10621
Life Cycle: 2 Birth: 7930 Survive: 8409
Life Cycle: 3 Birth: 7574 Survive: 8756
Life Cycle: 4 Birth: 7114 Survive: 8406
Life Cycle: 5 Birth: 7005 Survive: 8126
Life Cycle: 6 Birth: 6644 Survive: 7926
Life Cycle: 7 Birth: 6266 Survive: 7711
Life Cycle: 8 Birth: 6132 Survive: 7427
Life Cycle: 9 Birth: 5957 Survive: 7322
Life Cycle: 10 Birth: 5769 Survive: 7290
Life Cycle: 11 Birth: 5585 Survive: 6937
Life Cycle: 12 Birth: 5381 Survive: 6791
Life Cycle: 13 Birth: 5208 Survive: 6686
Life Cycle: 14 Birth: 5063 Survive: 6563
….
…

위의 결과는 터미널에서 Ctrl-C를 눌러 프로그램을 중지할 때까지 계속 표시됩니다.

그래픽 디스플레이:

Python을 사용하는 Conway의 Game Of Life?

세포는 계속 변경되며 매우 아름다운 패턴을 시뮬레이션합니다.

설정을 변경하고 슬라이더 값을 변경하여 위의 서브플롯을 변경할 수 있습니다.

Python을 사용하는 Conway의 Game Of Life?