概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題やってみた。
練習問題
lifegameを書け。
参考にしたページ
写真
サンプルコード
class Map
ALIVE = 1
DEAD = 0
def initialize(xNum, yNum, isRandom = false)
@map = []
@xNum = xNum
@yNum = yNum
(0...xNum).each { |i|
@map[i] = []
(0...yNum).each { |j|
@map[i][j] = isRandom ? rand(ALIVE + 1) : DEAD
}
}
end
def getState(i, j)
if i < 0 || j < 0
return DEAD
end
if @map[i].nil?
DEAD
elsif @map[i][j].nil?
DEAD
else
@map[i][j]
end
end
def getSum8Neighborhood(i, j)
sum = 0
sum = sum + getState(i - 1, j)
sum = sum + getState(i + 1, j)
sum = sum + getState(i, j - 1)
sum = sum + getState(i, j + 1)
sum = sum + getState(i - 1, j - 1)
sum = sum + getState(i + 1, j - 1)
sum = sum + getState(i - 1, j + 1)
sum = sum + getState(i + 1, j + 1)
end
def update
newMap = []
(0...@xNum).each { |i|
newMap[i] = []
(0...@yNum).each { |j|
newMap[i][j] = calcNewState(i, j)
}
}
@map = newMap
end
def calcNewState(i, j)
state = @map[i][j]
sum = getSum8Neighborhood(i, j)
if state == DEAD && sum == 3
ALIVE
elsif state == ALIVE && (sum == 2 || sum == 3)
ALIVE
elsif state == ALIVE && (sum <= 1)
DEAD
elsif state == ALIVE && sum >= 4
DEAD
else
state
end
end
def clear
puts "\e[H\e[2j"
end
def draw
clear
(0...@xNum).each { |i|
(0...@yNum).each { |j|
if @map[i][j] == DEAD
print "_"
else
print "@"
end
}
puts ''
}
end
def setState(i, j, state)
@map[i][j] = state
end
def isExtinction
@map.flatten.inject(:+) == 0
end
def out
@map.flatten
end
end
def lifegame2
model = Sketchup.active_model
entities = model.active_entities
@view = model.active_view
@faces = []
@cycles = 0
ysize = 18
xsize = 18
blk = 2
@map = Map.new(18, 18, true)
for j in 0..(ysize - 1)
for i in 0..(xsize - 1)
i2 = i + 1
j2 = j + 1
pt1 = [(i * blk), (j * blk), 0]
pt2 = [(i2 * blk), (j * blk), 0]
pt3 = [(i2 * blk), (j2 * blk), 0]
pt4 = [(i * blk), (j2 * blk), 0]
face1 = entities.add_face(pt1, pt2, pt3, pt4)
@faces << face1
end
end
update_array = @map.out
#puts update_array
counter = 0
for facei in @faces
if update_array[counter] == 1
facei.reverse!
end
counter += 1
end
UI.messagebox("ok")
def run
@map.update
update_array = @map.out
counter = 0
for facei in @faces
if update_array[counter] == 1
facei.reverse!
end
counter += 1
end
@view.invalidate
@cycles += 1
puts @cycles
if @map.isExtinction == 0
#if @cycles > 2
UI.stop_timer(@conwaytimer)
end
end
@conwaytimer = UI.start_timer(0.9, true) {
run
}
end
以上。