Rubyでカーソルを勝手に動かして文字を上書きしてみる
今日は、カーソルを自由自在に動かせるような Ruby の記述があったので、実験してみました。
つまるところ以下のように書けば、カーソルが動くらしいのです。スゴイ。
# 上に動かす
printf "\e[nA"
STDOUT.flush
# 下に動かす
printf "\e[nB"
STDOUT.flush
# 右に動かす
printf "\e[nC"
STDOUT.flush
# 左に動かす
printf "\e[nD"
STDOUT.flush
と言うわけで、以下にお絵かきサンプルプログラムを載せてみました。
unix系専用ですが。windowsでは動きません(たぶん)。
コピペしたファイルをrubyコマンドで実行するだけで使えるので試してみてください!
class Pixel
def initialize
@sleep_time = 0.05
end
def left
move_cursor("D")
end
def right
move_cursor("C")
end
def up
move_cursor("A")
end
def down
move_cursor("B")
end
def clear
printf "\e[2J"
end
def draw_pixel
printf "#"
STDOUT.flush
sleep @sleep_time
end
def draw_background(x, y)
self.clear
background_line = ''
x.times { background_line += '.' }
y.times { puts background_line }
end
private
def move_cursor(direction_char)
if /^[ABCD]$/ !~ direction_char
raise "invalid direction char"
else
printf "\e[1#{direction_char}"
STDOUT.flush
sleep @sleep_time
end
end
end
class Drawer
def initialize(size_x, size_y, pic_data)
@pixel = Pixel.new
@pixel.draw_background(size_x, size_y)
@method_table = {
'l' => 'left',
'r' => 'right',
'u' => 'up',
'd' => 'down',
'p' => 'draw_pixel',
}
@pic_data = pic_data
@data_element = /(\d+)([a-z])/
end
def draw
@pic_data.strip.split("\n").join("").scan( @data_element ) do |s|
action(s)
end
end
private
def action(act)
num = act[0]
method = act[1]
eval <<" EOS"
#{num}.times { \@pixel.#{ @method_table[method] } }
EOS
end
end
pic_data=<<"EOS"
12u4r1p1l1u1p1u1p1d1p1d1p1l1d5p1u1p1l1u1p1u1p1d1p1d1p1d1p1d1p1d1p1l
1d1p1l1d1p1l1d1p1l1d1p2l1d1p2l1d1p16l8u2r1p2l1d1p2l1d1p1l1d1p1l1d1p1l1d1p1l1d1p
1d1p1d1p16r10u3p3l2d3p2l1u1p1l1d1p1l1d1p1l1d2p1r3u3p2l1u1p1l
1d1p1l1d1p1l1d1p2l1d1p3r4u3p3l2d3p2l1u1p1l1d1p1l1d1p1l1d2p1r3u3p2l1u1p1l
1d1p1l1d1p1l1d1p2l1d1p24l2d1p1l1d1p1l1d1p1d1p1d1p1u1p1u1p1l
1u1p1l1u1p4l1d3p5l4u1p2l1d1p6r1u1p1d1p16l9d
EOS
drawer = Drawer.new(36, 16, pic_data)
drawer.draw
【広告】