読者です 読者をやめる 読者になる 読者になる

Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

ターミナルウィンドウに雪を降らせよう!を調べてみました

ターミナルウィンドウに雪を降らせよう! - Macの手書き説明書」で紹介されているワンライナーがどんな風に動いているのか調べてみました。
ワンライナーだと難しく感じますが、以下のように書き直すと案外分かりやすくなりますね。エスケープシーケンスの勉強にもなりました。

snow.rb

# -*- coding: utf-8 -*-
C = `stty size`.scan(/\d+/)[1].to_i # 画面 横のサイズ
S = ["2743".to_i(16)].pack("U*")    # 雪の形をつくる
a = {}                              # それぞれの雪の座標を管理
puts "\033[2J"                      # 画面のクリア
loop {
  a[rand(C)] = 0
  a.each{|x,o|
    a[x] += 1                   # 雪のy座標をひとつ下へ降ろす
    # 直前の繰り返しで描画した雪を消去し、新たに雪を描く。
    # 雪が降っているように見せる。
    print "\033[#{o};#{x}H \033[#{a[x]};#{x}H#{S} \033[0;0H"
  }
  $stdout.flush
  sleep 0.1
}