fc2ブログ

2023.08 «  - - - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 » 2023.10
TOP > Rubyでカーソルを勝手に動かして文字を上書きしてみる

 ← ひらがなの「あ」と表示する6つの方法 | TOP | rubyでハッシュのハッシュのハッシュとかを簡単に作る方法

Rubyでカーソルを勝手に動かして文字を上書きしてみる 

2009年08月27日 ()
MATZさんの本の読書感想文は、あまり一般の人が興味がなさそうだったので、いっそのことやめて、読書中に気に留めたことについての記事を書くことにしました。

今日は、カーソルを自由自在に動かせるような 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



【広告】

[2009.08.27(Thu) 01:26] Rubyの文法Trackback(0) | Comments(0)
↑TOPへ

 ← ひらがなの「あ」と表示する6つの方法 | TOP | rubyでハッシュのハッシュのハッシュとかを簡単に作る方法

COMMENT

COMMENT POST















管理者にだけ表示

 ← ひらがなの「あ」と表示する6つの方法 | TOP | rubyでハッシュのハッシュのハッシュとかを簡単に作る方法