Redundanz

僕の言葉は、人と話をするためにあるんじゃない。

0510

 先輩と話したり後輩と遊んだり、人間的な一日。たまにはこういうのも良い。

 最近プログラミングが楽しいです。今まで何か一つのものを完成させるということをほとんどやったことがなかったのだけど、この前人工無脳を作って以来、なんか自分でも出来る気がしてきていて、今日は2048をrubyで書いていました。コマンドライン上で実行するちゃちなものですけど。あんまり技術的なことを知らないため、かなり強引に処理を書いた気がします。出来た物自体は稚拙ではあるのだけど、Twitter情報科学科の友人がアドバイスしてくれたりして書くこと自体は楽しかった。ああ、習った内容を反映させなきゃな。ああ、それからbot形態素解析に対応しました。一文字ずつ区切っていたのが単語レベルになったので、発言のまともさは増したのですが、その分つまらなくなった気もする。もうちょっと文法的なところに切り込みたい感じ。僕にできるかどうかは知らない。

 えっちらおっちら考えながら書いたのでずいぶん汚いんですが、記念に2048.rbを載っけておきます。

#-*-encoding:utf-8-*-

class Board
	def initialize()
		@Board = Array.new(16)
		for i in 0..15
			@Board[i] = 0
		end
		2.times{
			add_number()
		}
		print_board()
	end
	
	def add_number()
		unless @Board.include?(0)
			return 9999
		else
			if rand() < 0.9
				next_number = 1
			else
				next_number = 2
			end
			n_p = rand(0..15)
			if @Board[n_p]==0
			@Board[n_p] = next_number
			else
				add_number()
			end
		end
	end
	
	def calc_index(a)
		if a == 0
			return "     "
		end
		if a > 0 && a <= 3
			return "  #{2**a}  "
		end
		if a >3 && a<= 6
			return "  #{2**a} "
		end
		if a >6
			return " #{2**a} "
		end
	end
		
	
	def print_board()
		board = @Board
		top_frame		= "┌─┬─┬─┬─┐"
		middle_frame	= "├─┼─┼─┼─┤"
		bottm_frame	= "└─┴─┴─┴─┘"
		
		puts top_frame
		for line in 0..2
			puts calc_index(board[(4*line)]) + calc_index(board[(4*line+1)])  + calc_index(board[(4*line+2)])  + calc_index(board[(4*line+3)]) 
			puts middle_frame
		end
		line = 3
		puts calc_index(board[(4*line)]) + calc_index(board[(4*line+1)])  + calc_index(board[(4*line+2)])  + calc_index(board[(4*line+3)]) 
		puts bottm_frame
	end
	
	def move(direction)
		old_board = Marshal.load(Marshal.dump(@Board))
		case direction
			when :left
			4.times{
			1.upto(15){|i|
				if @Board[i-1] == 0 && i%4 != 0
					@Board[i-1] = @Board[i]
					@Board[i] = 0
				end
				if @Board[i-1] == @Board[i] && i%4 != 0 &&@Board[i] != 0
					@Board[i-1] = @Board[i-1] + 1 + i.to_f/100
					@Board[i] = 0
				end
			}
			}
			for j in 0..15
				@Board[j] = @Board[j].to_i
			end
			
			when :right
			4.times{
			14.downto(0){|i|
				if @Board[i+1] == 0 && i%4 != 3
					@Board[i+1] = @Board[i]
					@Board[i] = 0
				end
				if @Board[i+1] == @Board[i] && i%4 != 3 &&@Board[i] != 0
					@Board[i+1] = @Board[i+1] + 1  + i.to_f/100
					@Board[i] = 0
				end
			}
			}
			for j in 0..15
				@Board[j] = @Board[j].to_i
			end
			
			when :up
			4.times{
			4.upto(15){|i|
				if @Board[i-4] == 0
					@Board[i-4] = @Board[i]
					@Board[i] = 0
				end
				if @Board[i-4] == @Board[i]  &&@Board[i] != 0
					@Board[i-4] = @Board[i-4] + 1 + i.to_f/100
					@Board[i] = 0
				end
			}
			}
			for j in 0..15
				@Board[j] = @Board[j].to_i
			end
			
			when :down
			4.times{
			11.downto(0){|i|
				if @Board[i+4] == 0
					@Board[i+4] = @Board[i]
					@Board[i] = 0
				end
				if @Board[i+4] == @Board[i]  &&@Board[i] != 0
					@Board[i+4] = @Board[i+4] + 1 + i.to_f/100
					@Board[i] = 0
				end
			}
			}
			for j in 0..15
				@Board[j] = @Board[j].to_i
			end			
		end
		if !equal(@Board,old_board)
			add_number()
		end
		print_board()
	end
	
	def get_key(dirkey)
		case dirkey
			when "j"
			move(:left)
			when "l"
			move(:right)
			when "i"
			move(:up)
			when "k"
			move(:down)
		end
	end
	def equal(a,b)
		length = a.length()
		c = 0
		for i in 0..(length-1)
			if a[i] == b[i]
				c = c + 1
			end
		end
		c == length
	end
end

	
game = Board.new



while true
	dirkey = gets.chomp
	game.get_key(dirkey)
end