Rubyでライフゲーム

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

Rubyでライフゲーム。
マス目の端を考えなくていいように、配列は上下左右とも実際のマス目より1大きくしておく。

スポンサーリンク

コード

N = 10
ALIVE = 1
DEAD = 0
 
# 8 x 8 のマス目、配列は、10 x 10
@board = Array.new(N) { Array.new(N) { DEAD } }
 
def compute_next
  arr = Marshal.load(Marshal.dump(@board))
  1.step(N-2, 1) do |row|
    1.step(N-2, 1) do |column|
      count = 0
      count += 1 if arr[row-1][column-1] == ALIVE   # 左上
      count += 1 if arr[row-1][column]   == ALIVE   # 上
      count += 1 if arr[row-1][column+1] == ALIVE   # 右上
      count += 1 if arr[row][column-1]   == ALIVE   # 左
      count += 1 if arr[row][column+1]   == ALIVE   # 右
      count += 1 if arr[row+1][column-1] == ALIVE   # 左下
      count += 1 if arr[row+1][column]   == ALIVE   # 下
      count += 1 if arr[row+1][column+1] == ALIVE   # 右下
 
      # update @borad
      if (count <= 1 || 4 <= count)
        @board[row][column] = DEAD
      elsif (arr[row][column] == ALIVE && ( count == 2 || count == 3))
        @board[row][column] = ALIVE
      elsif (arr[row][column] == DEAD && count == 3)
        @board[row][column] = ALIVE
      else
        @board[row][column] = DEAD
      end
    end
  end
end
 
def print_board
  puts "-" * 30
  1.step(N-2, 1) do |row|
    1.step(N-2, 1) do |column|
      print " * " if @board[row][column] == ALIVE
      print " - " if @board[row][column] == DEAD
    end
    print "\n"
  end
end
 
def life_game(n)
  n.times do
    print_board
    compute_next
  end
end
 
@board[3][4] = ALIVE
@board[3][5] = ALIVE
@board[4][3] = ALIVE
@board[4][4] = ALIVE
@board[5][4] = ALIVE
 
life_game 20

実行結果

------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  -  *  -  -  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  *  *  -  -  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  *  *  -  -  -  -
 -  -  *  *  *  -  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  *  -  *  -  -  -
 -  *  -  -  *  -  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  *  *  -  *  *  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  *  *  -  *  *  -  -
 -  *  -  -  *  *  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  *  -  -  -  -
 -  *  *  -  *  *  -  -
 -  *  -  -  -  -  -  -
 -  *  -  -  -  *  -  -
 -  -  *  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  *  *  *  -  -  -
 -  *  *  *  *  -  -  -
 *  *  -  -  *  *  -  -
 -  *  -  *  *  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  *  -  -  *  -  -  -
 *  -  -  -  -  -  -  -
 *  -  -  -  -  *  -  -
 *  *  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 *  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  *  *  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  -  -  -  -  -  -  -
 *  *  -  *  -  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 *  *  *  *  *  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 *  -  -  -  *  -  -  -
 -  -  -  -  *  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  *  -  *  -  -  -
 -  -  *  -  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  *  -  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
スポンサーリンク
 
スポンサーリンク