(12) 1/15の授業内容:自由製作課題

自由製作課題について

これまでは一人で限られた時間の中でプログラムを作成してきたため、規模の大きなものを作成することが難しかった。1年間続いたRubyの授業もそろそろ終わりを迎えようとしている。そこで、これまで学んだ技術を駆使して、グループで長めのプログラムを作ってみよう。

作成条件は以下の通りとする。

  1. プログラムを作成し、Webページに掲載する。
  2. 発表会では、プレゼンテーションソフトを用いて概要を説明し、プログラムのデモも実施する。
  3. 発表時間は10分とする。
  4. 評価方法:発表後、プログラム、プレゼン資料、Webページ、発表方法を踏まえ一番気に入ったグループに投票する。投票数に応じてグループの構成メンバー全員に以下の点を与える(1限・2限それぞれ別々に)。
  5. ただし、自分のグループに投票することを許可するとメンバーの多いグループが有利になるため、自分以外のグループに投票するものとする。なお、メンバー全員が欠席するなどの理由により、当日発表をしなかったグループは0点とする。

1位:12点

2位:10点

3位:8点

4位:7点

5位:6点

6位:5点

7位:5点

参考までに昨年度の自由製作課題の例を示す。

2005年度自由製作課題

今後の予定

本日の後半より自由製作課題を実施する。5〜6人のグループで規模の大きなプログラムを作成する。以降の予定は以下の通りである。

1月15日

  • メンバーの確定
  • チーム名の決定
  • プログラムの検討・決定
  • 役割分担の決定

1月22日

  • プログラムの完成
  • プログラムの公開
  • 発表練習

補講期間

  • 発表会

本日の作業内容

役割分担を決める。その上で何をいつまでにやるのかを相談する。役割としては例えば以下がある。

  • プログラム作成
  • Webページ作成
  • プレゼンファイル作成
  • 画像作成
  • 当日の発表役

「応援」や「遊軍」、「後方支援」などの役割は定めず、各人が何かしらグループ活動に貢献できるように分担を考えること。

役割分担が決まったら、作成するプログラムやWebページのイメージ、作成する画像などについて相談し、早速作成に取り掛かること。

グループの確定状況

現時点でのグループの確定状況について示す。間違いがある場合は報告すること。

1限

  • 赤木滝一、菊池佳彦、菅野幸恵、休石秀孝
  • 大渕晃太郎、丸藤和也
  • 鈴木 大輔、村山翔太、前田 正俊

2限

  • 愉快な6人の仲間達:加賀裕輔、金野朋哉、佐藤孔紀、佐藤康史、菅原拓、長谷川一真
  • トラバ303:佐藤慎太郎、高山ひとみ、成澤克洋、松井武史
  • 鳥海:佐藤雄也、塩松暁浩、長谷川悠希、本間隆樹
  • アルアハリ:佐藤吉弘、土井洋紀、富樫拓也、原田紹仁、廣野怜介
  • シャドウ(仮):渋谷典芳、冨田恭仁、中村幸司、福井昴明
  • たぶん右利き:庄司由貴、鈴木貴也、鈴木陽平、高橋佳一、本間吉貴、山口弘人
  • ヨボセヨ:菅原純、鈴木佑果、高橋まり子、土門佳織、三浦瑛子

ドロー系ソフトTgifを使ってみよう

本日取り上げるTgifはドロー系のソフトである。前回のGIMPはペイント系ソフトと呼ばれる。GIMPは筆を使って塗る要領で、画像を加工するのに対して、ドロー系ソフトのTgifは線や四角、円などの図形を組み合わせて図形描画を行う。パワーポイントで図形を描画するのと同じ要領である。

起動と終了

ktermで

irsv{c10xxxx}% tgif &[Return]

終了はtgif画面でCtrl-qまたは、メニューバーのFileからQuit

メニュー

  • 左ボタン → オブジェクトの選択
  • 中ボタン → 編集機能全般メニュー(上に並ぶメニューの統合版)
  • 右ボタン → 作図メニュー(tgifウィンドウ左のものと同じ)
  • グリッド (Alt-d, Alt-i)
  • カット・コピー (C-x, C-v)
  • グループ・アングループ (C-g, C-u)
  • プリントアウト (C-p)
  • 保存 (C-s)

tgifのメニュー構成

もっと詳しい使い方は、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が使えるようになる。

tgifで作った画像をWebページに掲載する

作成した画像を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用のディレクトリに保存し、実行してみよう。

enemy1.png

enemy2.png

enemy3.png

enemy.rb

なお、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点減点とする。

提出要領は下記の通り。

  • 提出先:naoya@e.koeki-u.ac.jp
  • メールのSubject(問題1):ruby12
  • メールのSubject(問題2):自分の学籍番号-kadai09
  • 提出期限(問題1):授業終了時まで
  • 提出期限(問題2):1月21日(日)23:59まで

Tips:emacsでの日本語入力のオンオフはCtrl-oです

Tips:Mewによるメールの送り方はMewコマンドを参照