先輩と話したり後輩と遊んだり、人間的な一日。たまにはこういうのも良い。
最近プログラミングが楽しいです。今まで何か一つのものを完成させるということをほとんどやったことがなかったのだけど、この前人工無脳を作って以来、なんか自分でも出来る気がしてきていて、今日は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