Ruby/SDLでライフゲーム

3 月 11th, 2009

tnct.Seminar9.03#1が無事?終了しました^^

なんだかんだ頑張ったぞ俺

午前中は無線鯖立てに時間を使っていたので何もできなかったけど

午後は急加速!!

作成したのはライフゲ

kwskWikipedia

簡単にいうと周りの個体数が多いと死亡

周りの個体がいなくても死亡

適度な個体がいれば生き残るという条件をコーディングします。

# -*- coding: utf-8 -*-
require 'sdl'#画面描画SDL
require 'rubygems'#gemInstallしたのもを使用
require 'narray'#多次元配列拡張ライブラリ
 
width = 100
height = width
$window = 400
$window_life = width
 
SDL.init(SDL::INIT_VIDEO)
$screen = .setVideoMode($window,$window,16,SDL::SWSURFACE)
$screen.fillRect(0,0,$window,$window,[0,0,0])
 
$life_table1 = NArray.int(width,height)
$life_table2 = NArray.int(width,height)
 
for i in 1..(width - 1)
for j in 1..(height - 1)
$life_table1[i,j] = rand(2)
end
end
 
def life_num(i,j)#周りの生きているを数える
num = 0
num = $life_table1[i+1,j]
num = num + $life_table1[i+1,j-1]
num = num + $life_table1[i+1,j+1]
num = num + $life_table1[i-1,j]
num = num + $life_table1[i-1,j-1]
num = num + $life_table1[i-1,j+1]
num = num + $life_table1[i,j+1]
num = num + $life_table1[i,j-1]
return num #いらないとわかりつつ念のため
end
 
def life_func(i,j)#マスの生死を判断する関数
if $life_table1[i,j] == 0
if life_num(i,j) == 3
live = 1
else
live = 0
end
else
if life_num(i,j) == 3 || life_num(i,j) == 2
live = 1
else
live = 0
end
end
end
 
def display_life(i,j,num)
 
width_life_start = i * ($window/$window_life) + 1
height_life_start = j * ($window/$window_life) + 1
width_life_end =  $window/$window_life
height_life_end = $window/$window_life
if num == 1
$screen.fill_rect(width_life_start,height_life_start,width_life_end,height_life_end,[255,255,255])
else
$screen.fill_rect(width_life_start,height_life_start,width_life_end,height_life_end,[0,0,0])
end
end
 
1000.times{
 
for i in 1..(width - 2)
for j in 1..(height - 2)
$life_table2[i,j] = life_func(i,j)
display_life(i,j,life_func(i,j))
end
end
 
#p $life_table1
$screen.updateRect(0,0,0,0)
#sleep 1
 
$life_table1 = $life_table2
$life_table2 = NArray.int(width,height)
}

最初のほうコード直してないからwidthとか意味のない代入してるけどw

これは意味ないのわかってて放置してるから愛嬌でw

とりあえず今回も楽しい勉強会でした^^

(うわうpしたらインデントなくなってるwww見づらいw