roy > naoya > 基礎プログラミングII・情報表現[月1] > (11)自由課題実施期間[1]&trr
授業開始直後より20分間trrの試験を行う。150点で1点。以降25点ごとに1点加点で、最大5点まで。つまり250点以上は何点でも5点となる。
出席、レポート、trrの合計得点により試験免除者を決定する。発表は1月に入ってからであり、出席は免除者発表の直前までの状況を全て加味する。未提出のレポートがある場合は早めに提出すること。また、採点結果が戻ってきていない課題がある場合は今年中に申し出ること。
20分経過後、念のためこの間にマークした最高得点をメールで報告してください。
これまでは一人で限られた時間の中でプログラムを作成してきたため、規模の大きなものを作成することが難しかった。1年間続いたRubyの授業もそろそろ終わりを迎えようとしている。そこで、これまで学んだ技術を駆使して、グループで長めのプログラムを作ってみよう。
作成条件は以下の通りとする。
参考までに過去の自由製作課題の例を示す。
本日の後半より自由製作課題を実施する。5〜6人のグループで規模の大きなプログラムを作成する。以降の予定は以下の通りである。
役割分担を決める。その上で何をいつまでにやるのかを相談する。役割としては例えば以下がある。
「応援」や「遊軍」、「パシリ」などの実質的に仕事のない役割は定めず、各人が何かしらグループ活動に貢献できるように分担を考えること。
役割分担が決まったら、作成するプログラムや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 &[Return]
とすると、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&[Return]
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点満点):グループのメンバー、チーム名、役割分担、作成するプログラムの案について報告する。グループの他のメンバーにお任せにしていないことを確認するため、グループの代表者のみではなく、全員が提出する。
問題2:これまでの累積得点があまり高くないと感じる人は、問題1に加えて、tgifでとっても素敵な絵を描いてpng形式で保存して添付ファイルで送る。提出点として別途3点を追加する。出来栄えにより芸術点をさらに加算することがある。
提出要領は下記の通り。
Tips:emacsでの日本語入力のオンオフはCtrl-oです
Tips:Mewによるメールの送り方はMewコマンドを参照