0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

windows11で、sketchup6 その86

Posted at

概要

windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題やってみた。

練習問題

lifegameを書け。

参考にしたページ

写真

image.png

サンプルコード



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




以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?