これまでは一人で限られた時間の中でプログラムを作成してきたため、規模の大きなものを作成することが難しかった。1年間続いたRubyの授業もそろそろ終わりを迎えようとしている。そこで、これまで学んだ技術を駆使して、グループで長めのプログラムを作ってみよう。
作成条件は以下の通りとする。
1位:12点
2位:10点
3位:8点
4位:7点
5位:6点
6位:5点
7位:5点
参考までに昨年度の自由製作課題の例を示す。
本日の後半より自由製作課題を実施する。5〜6人のグループで規模の大きなプログラムを作成する。以降の予定は以下の通りである。
1月15日
1月22日
補講期間
役割分担を決める。その上で何をいつまでにやるのかを相談する。役割としては例えば以下がある。
「応援」や「遊軍」、「後方支援」などの役割は定めず、各人が何かしらグループ活動に貢献できるように分担を考えること。
役割分担が決まったら、作成するプログラムやWebページのイメージ、作成する画像などについて相談し、早速作成に取り掛かること。
現時点でのグループの確定状況について示す。間違いがある場合は報告すること。
本日取り上げるTgifはドロー系のソフトである。前回のGIMPはペイント系ソフトと呼ばれる。GIMPは筆を使って塗る要領で、画像を加工するのに対して、ドロー系ソフトのTgifは線や四角、円などの図形を組み合わせて図形描画を行う。パワーポイントで図形を描画するのと同じ要領である。
ktermで
irsv{c10xxxx}% tgif &[Return]
終了はtgif画面でCtrl-qまたは、メニューバーのFileからQuit

もっと詳しい使い方は、Googleで「tgif 使い方」で検索して調べてみよう。
左側の作図ツールでT(Text)を選び、ドローエリア内の文字を配置したい場所をクリックする(後で移動できるので適当な位置でよい)。その後Ctrl-SPCを押すと、knput2(日本語入力窓)が起動する。アルファベットを先に入力してしまうと英語フォントに切り替わってしまい、Ctrl-SPCを押してもkinput2が起動しない。うまくいかない場合は、Fontメニューで日本語フォントであるRyuminかGothicを選択してからCtrl-SPCを押す。なお、Fontメニューはドローエリア内でマウスの中ボタンをクリックすると出現する。
日本語入力のOFFは、SHIFT+SPC
Ctrl+SPCを押したときに
There is no Selection Owner of _JAPANESE_CONVERSION_
というエラーが出るときは、kinput2が落ちている。ktermから
irsv{C10xxxx}% kinput2 &
とすると、kinput2が使えるようになる。
作成した画像をWebページに掲載する場合、保存形式に注意する必要がある。単にFileから保存を選ぶとobj形式で保存される(拡張子が.objとなる)。この形式はtgifでしか開くことができず、Webでも表示されない。Webページに掲載する場合は、PNG形式やJPG形式で保存をする必要がある。FileメニューよりPrint/Export Formatを選び、PNGやJPEGを選択する。この後で、印刷(Ctrl-pもしくはFileメニューからPrint)を選ぶとPNG形式やJPEG形式で画像が保存される。保存をするために印刷というメニューを選ぶのがおかしな気がするが、印刷の出力先がプリンタではなくファイルということである。
上記操作を行ったら、ktermでlsし、保存をしたファイルが正しく生成されているか確認しよう。
ktermでdisplayコマンドを利用すると、作成した画像ファイルをkterm上に表示することができる。
irsv{c10xxxx}% display filename.png&
Rubyのプログラム中でktermのコマンドを実行するsystemコマンドを利用すると、プログラム実行時に画像を表示させることができる。
Rubyのプログラム中でktermのコマンドを実行するsystemコマンドを利用すると、プログラム実行時に画像を表示させることができる。以下のプログラムでは、ハイパーリンクの3つの画像を表示することができるようになっている。3つの画像及びプログラムを全てruby用のディレクトリに保存し、実行してみよう。
なお、ktermのbannerコマンドは大きな文字を表示させるコマンドである。このプログラムではbannerコマンドも利用している。自由製作でも活用しよう。
#!/usr/koeki/bin/ruby
def enemy(x)
  if x == 2
    print "ついにラスボスの登場だ!\n"
    system 'display enemy3.png&'
  elsif x == 0
    system 'display enemy1.png&'
  else
    system 'display enemy2.png&'
  end
end
def damage()
  srand
  x = rand(10)+1
  return x
end
def bonus()
  srand
  x = rand(3)
  print "敵は宝箱をおとした\n"
  sleep(1)
  if x == 0
    print "しかし中身は空だった\n\n"
    return 0
  elsif x == 1
    print "薬草をみつけた! HPが20回復した\n\n"  
    return 20
  else
    print "ポーションをみつけた! HPが40回復した\n\n"
    return 40
  end
end
#----設定-------------------------
name = ["ぷよ","くるくる","ぴかぴか"]
option = ["石つぶて","さむいギャグ","バルス",]
attack = {
  "ぷよ" => ["ぷよアタック","ぷよボンバー","ぷよフラッシュ"],
  "くるくる" => ["くるくるビーム","くるくるサンダー","くるくるファイア"],
  "ぴかぴか" => ["ぴかぴかワンダフルボンバー","ぴかぴかオーバードライブ","ぴかぴかインフェルノ"]
}
hp_you = 200
turn = 0
#----------------------------------
print "名前を入力して下さい:"
you = gets.chomp!
sleep(1)
printf ("%sよ。街を救うのじゃ(以下略)!!\n\n",you)
sleep(1)
print ("敵を5匹倒せばあなたの勝ちです\n\n")
sleep(1)
while turn < 5
  srand
  encount = rand(2)
  
  if turn == 4
    encount = 2
  end
  printf ("%sが現れた!\n\n",name[encount])
  enemy(encount)
  
  sleep(2)
  srand
  hp_enemy = rand(20)+10
  
  while true
    0.upto(2) do |j|
      printf (" %d:%s\n",j+1,option[j])
    end
    
    your_choice = gets.chomp!.to_i
    
    sleep(1)
    printf ("よし%sだ!\n\n",option[your_choice-1])
    sleep(1)
    srand
    choice_of_enemy = rand(3)
    
    printf ("%sの攻撃:%s!\n\n",name[encount],attack[name[encount]][choice_of_enemy])
    sleep(1)
    if choice_of_enemy == your_choice - 1
      printf ("%s:いたーい!\n",name[encount])
      hp_enemy -= damage
      printf ("%sのHPは%dになった\n\n",name[encount],hp_enemy)
    else
      printf ("%s:いたーい!\n",you)
      hp_you -= damage
      printf ("%sのHPは%dになった\n\n",you,hp_you)
    end
    
    if hp_enemy <= 0
      system 'banner YOU WIN'
      hp_you += bonus
      sleep(2)
      break
    elsif hp_you <= 0
      print "あなたは負けてしまった\n"
      system 'banner YOU LOSE'
      exit(1)
    end
    sleep(1)
  end
  turn += 1
end
print "\nおめでとう!! これで街の平和は保たれた!\n"
問題1(2点満点):グループのメンバー、チーム名、役割分担、作成するプログラムの案、各作業(プログラム、Webページ、プレゼンファイル作成、画像作成)の進捗状況について、まだ報告をしていないものを報告する。出席も兼ねるのでグループの代表者のみではなく、全員が提出する。
問題2:出席状況やレポートの提出状況が悪く、これまでの累積得点があまり高くないと感じる人は、問題1に加えて、tgifでとっても素敵な絵を描いてpng形式で保存して添付ファイルで送る。提出点として4点を追加する。出来栄えにより芸術点をさらに加算することがある。ただし期限外提出は2点減点とする。
提出要領は下記の通り。
Tips:emacsでの日本語入力のオンオフはCtrl-oです
Tips:Mewによるメールの送り方はMewコマンドを参照