楽しいプログラムのための部品

プログラムに彩りを与える以下の2つについて紹介する。

画面制御

ESC文字のあとに決まった文字列を出力すると、様々な 画面制御が行なえる。これをエスケープシーケンスという。

ESC文字はプログラム中 \e で表せるので、

print("\e[2J")

とすると、ESC文字に続けて [2J の文字が出力される。これは画面消去を意味する。 他に、Terminal上のカーソルを狙った位置に移動するためのものを含めて示す。

並び意味
ESC[2J画面消去 printf("\e[2J")
ESC[y;xH y行x桁目に移動
(省略すると1行1桁)
printf("\e[%d;%dH", y, x)
ESC[nAn行上移動 printf("\e[%dA", n)
ESC[nBn行下移動 printf("\e[%dB", n)
ESC[nCn桁右に移動 printf("\e[%dC", n)
ESC[nDn桁左に移動 printf("\e[%dD", n)
ESC7現在のカーソル位置を保存 print("\e7")
ESC8ESC 7 で保存したカーソル位置に戻る print("\e8")

次に出力する文字に 色を付けるためのエスケープシーケンスは 既に第8回で示した。色以外にも飾りを付けられる。

ESC [Xm

のXに対応する数字を以下のように指定する。

Xの値意味
0標準状態に戻す
1太字にする
4下線を引く
7反転文字にする
30文字色を黒に
31文字色を赤に
32文字色を緑に
33文字色を黄色に
34文字色を青に
35文字色を紫に
36文字色を水色に
37文字色を白に
40背景色を黒に
41背景色を赤に
42背景色を緑に
43背景色を黄色に
44背景色を青に
45背景色を紫に
46背景色を水色に
47背景色を白に

文字飾りと文字色と背景色を同時指定するときは数字をセミコロンで区切っ て列挙する。
例: 黄色(33)の文字にアンダーライン(4)を引く

print("Hi \e[4;33mMike!\n")
Hi Mike!
=> nil
irb(main):002:0> 

このままだと、残る画面も全部黄色アンダーラインになるので、 ESC [ m を出力して元に戻す。

printf("\e[m")
=>
irb(main):003:0> 

適用例

●が右から左へ、下から上へ移動する。

pitch.rb

#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-

print("これから●が\e[33m動\e[34mき\e[36mま\e[32mす!\e[m\n")
sleep 2				# 2秒間待機
print("\e[2J")			# 画面を消す
ball = "●"
kesu = "  "
wait = 0.05			# タイマー

x = 60				# 60桁目の
y = 10				# 10行目から
STDOUT.sync = true		# すぐ画面に反映させるため

while x > 10			# 右から左へ
  printf("\e[%d;%dH", y, x)	# カーソルを今の位置へ
  printf("%s", kesu)		# 前のボールを消す
  x -= 1
  printf("\e[%d;%dH", y, x)	# カーソルを次の位置へ
  color = 30 + x%8		# ボールの色をx座標によって変える
  printf("\e[%dm%s\e[m", color, ball)	# ボールを書く
  printf("\e[1;1H")		# カーソルを邪魔でないところへ
  sleep(wait)			# 一定時間休む
end

while y > 1			# 下から上へ
  printf("\e[%d;%dH", y, x)	# カーソルを今の位置へ
  printf("%s", kesu)		# 前のボールを消す
  y -= 1
  printf("\e[%d;%dH", y, x)	# カーソルを次の位置へ
  printf("%s", ball)		# ボールを書く
  printf("\e[1;1H")		# カーソルを邪魔でないところへ
  sleep(wait*2)			# 一定時間休む
end

printf("\e[%d;%dHおしまい\n", y+1, 1)

本日の目次