Rubyでライフゲーム

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

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

実行結果

------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  -  *  -  -  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  *  *  -  -  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  *  *  -  -  -  -
 -  -  *  *  *  -  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  *  -  *  -  -  -
 -  *  -  -  *  -  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  *  *  -  *  *  -  -
 -  *  -  -  *  -  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  *  *  -  *  *  -  -
 -  *  -  -  *  *  -  -
 -  -  *  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  *  -  -  -  -
 -  *  *  -  *  *  -  -
 -  *  -  -  -  -  -  -
 -  *  -  -  -  *  -  -
 -  -  *  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  *  *  *  -  -  -
 -  *  *  *  *  -  -  -
 *  *  -  -  *  *  -  -
 -  *  -  *  *  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  *  -  -  *  -  -  -
 *  -  -  -  -  -  -  -
 *  -  -  -  -  *  -  -
 *  *  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 *  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  *  *  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  -  -  -  -  -  -  -
 *  *  -  *  -  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 *  *  *  *  *  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 *  -  -  -  *  -  -  -
 -  -  -  -  *  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 *  *  -  -  -  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  *  *  *  -  -  -
 -  -  -  *  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  *  -  *  -  -  -
 -  -  *  -  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  *  -  *  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  *  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
------------------------------
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -
 -  -  -  -  -  -  -  -

日時: 2010年09月04日 06:56
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/548

この記事にトラックバックされる方は、参照先が分かるようにするために、「Rubyでライフゲーム」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - Ruby勉強ルーム