roy > naoya > 基礎プログラミングI·情報検索 > (11)楽しいプログラムを作ろう > 補足

(11) 06/30の授業内容:楽しいプログラムを作ろう

プログラムを楽しくするテクニック

ここでは、楽しいプログラムや実用的なプログラムを作成する上で役に立つメソッドや構文を確認する。

乱数の発生

#!/usr/koeki/bin/ruby

hoi = ["上","下","右","左"]

srand
comp=rand(4)

STDERR.print"あっちむいてほい!(0: 上,1: 下,2: 右,3: 左) :"
user = gets.chomp!.to_i

printf("あなたは %s でした \n", hoi[comp])
printf("わたしは %s でした。\n", hoi[user])
  • rand(4):4未満の整数(0、1、2、3)からランダムな値を返す
  • srand:乱数発生の種を作る。これがないとrandで毎回同じ値が出てきてしまう

少し間を空ける

#!/usr/koeki/bin/ruby

print"爆弾の解体だ!最後に二本のコードが残された。\n"
print"どちらを切る?\n"
print"0:赤、1:青\n"
bomb = gets.chomp!.to_i
sleep(2)
print"よし!切るぞ!\n"
sleep(1)
print"チョキッ\n"
sleep(1)
srand
target = rand(2)

if bomb == target
  print"解体成功!!\n"
else
  print"ドカーン!!\n"
end
  • sleep(1):次の行に進むまでに1秒間停止する。sleep(2)なら2秒間停止する。

時刻を取得する

#! /usr/koeki/bin/ruby
list = ["赤","黄","青"]

print"あなたの反応時間を計測します。準備は良いですか(y or n)"
junbi = gets.chomp!

if junbi == "y"
  sleep(1)
  print"赤と表示されたら1、黄なら2、青なら3を押してください。\n"
else
  print"そうですかさようなら\n"
  exit(1)
end

sleep(1)

srand
color = rand(3)
print"\n"
printf("%s\n",list[color])

start = Time.now

choice = gets.chomp.to_i

reaction_time = Time.now - start
printf("表示されたのは%s、あなたの回答は%s\n",
list[color],list[choice-1])

if color == choice-1
  print"正解です\n"
else
  print"はずれです\n"
end

printf("反応時間は%3.2f秒でした\n",reaction_time)
  • Time.now:現在時刻を返す。2地点で現在時刻を取得し、差をとると経過時間を調べることができる。このプログラムでは刺激提示直後と反応直後の時刻の差を取って反応時間としている。
  • exit(1):プログラムを強制終了する。

大きな文字を出す

#!/usr/koeki/bin/ruby

print "1〜3の好きな数字を入力してください。\n"
print "コンピュータが選んだ数字と同じならあなたの勝ち。\n"
number = gets.chomp!.to_i

srand
comp = rand(3) + 1

if number == comp
  system 'banner YOU WIN'
else
  system 'banner YOU LOSE'
end
irsv{c10xxxx}% ruby banner.rb[Return]
1〜3の好きな数字を入力してください。
コンピュータが選んだ数字と同じならあなたの勝ち。
1[Return]

#     # ####### #     #
 #   #  #     # #     #
  # #   #     # #     #
   #    #     # #     #
   #    #     # #     #
   #    #     # #     #
   #    #######  #####


#     #   ###   #     #
#  #  #    #    ##    #
#  #  #    #    # #   #
#  #  #    #    #  #  #
#  #  #    #    #   # #
#  #  #    #    #    ##
 ## ##    ###   #     #
  • banner:ktermで大きな文字を表示させるコマンド。'banner MESSAGE'でMESSAGEを大きな文字で表示する。
  • system:ktermのコマンドを実施させるためのコマンド。

ポップアップで画像を表示

ktermで画像ファイルを表示させるコマンドであるdisplayコマンドをsystemコマンドと組み合わせて使用することで、プログラム実行中に画像を表示させることができる。

あらかじめ画像を作成しておき(以下のプログラムではimage001.png)、プログラムと同じディレクトリに保存しておく。実行すると、ktermとは別に新規のウィンドウがポップアップで出現し、画像が表示される。表示されたまま消えないので、消したい場合にはpkillコマンドを使用する。

#!/usr/koeki/bin/ruby

print"1〜3の好きな数字を選んでください"
number = gets.chomp!.to_i

if number == 1
  system 'display image001.png&'
  print"おめでとう\n"
else
  print"残念\n"
end

sleep(3)
system 'pkill display -U `whoami`'
  • display:ktermでImageMagickというソフトウェアを起動するためのコマンド。'display 画像ファイル名&'で指定した画像ファイルを開いて表示する。ファイル名の後ろに&を必ずつけること。
  • pkill:ktermのコマンドを実施させるためのコマンド。
pkill コマンド を実行し、ImageMagick をプログラム内で強制終了させる必要がある。 -U はオプションで、-U ユーザ とすると、特定のユーザの指定したコマンドを止める。 whoami は、今その Kterm を動かしているユーザ ID を知るためのコマンド。

文字色変更・画面操作

ESCの後ろに決まった文字列を出力すると、画面制御や文字色の変更を行うことが出来る。これをエスケープシーケンスという。ESCはプログラム中では\eで表現できるので\eと組み合わせることになる。

文字色の変更

ESC [XmのXの部分に以下の数字を指定することで、対応する色やスタイルが適用される。

Xの値

意味

Xの値

意味

0

標準状態に戻す

1

太字にする

4

下線を引く

7

反転文字にする

30

文字色を黒に

31

文字色を赤に

32

文字色を緑に

33

文字色を黄色に

34

文字色を青に

35

文字色を紫に

36

文字色を水色に

37

文字色を白に

40

背景色を黒に

41

背景色を赤に

42

背景色を緑に

43

背景色を黄色に

44

背景色を青に

45

背景色を紫に

46

背景色を水色に

47

背景色を白に

文字色や背景色を同時に指定する場合は数字をセミコロンで区切ってつなげて指定する。

例:文字色を黄色(33)にする

printf("Hello \e[33mRuby\n")

例:背景色を水色(46)にしてアンダーライン(4)を引く

printf("Hello \e[4;46mRuby\n")

これらの設定をすると次の行以降も全部同じ色になるのでESC [ m を出力して文字の属性を元に戻す。

printf("\e[m\n")

画面操作

画面消去やカーソルを移動するエスケープシーケンスについて示す。

並び

意味

ESC[2J

画面消去

printf("\e[2J")

ESC[y;xH

y行x桁目に移動

printf("\e[%d;%dH", y, x)

ESC[nA

n行上移動

printf("\e[%dA", n)

ESC[nB

n行下移動

printf("\e[%dB", n)

ESC[nC

n桁右に移動

printf("\e[%dC", n)

ESC[nD

n桁左に移動

printf("\e[%dD", n)