課題
キャンバスに宝物が隠されます. 宝物の位置(x,y)はランダムに決められます(どこに隠されるかは分かりません). 宝物は発見されるまで表示されません. 以下を参照して,キャンバス上で亀を動かしながら,宝物を見つけ出してください.
- 宝物の近くで亀が「地面を掘る」と宝物を見つけられます(宝物とちょうど同じ位置でなくても,近くで掘れば見つけられます).
- 宝物を探すためのヒントが利用できます(詳細は後述).
- ヒントを利用しつつ亀を動かすことを繰り返すことで,宝物を見つけるようにします.
- 宝物は,発見された時点で,自動的に画面に表示されます.
- 宝物を発見したら適当なメッセージを画面にポップアップ表示して終了してください.メッセージのポップアップ表示にはタートルグラフィクスの「say」が利用できます.
(後述する)宝物の位置に関するヒントを利用しながら, 亀が自律的に動くのであれば,基本的にはどのような方法で探しても構いません. 一切ヒントを使わない方法,たとえばキャンバスをくまなく機械的に巡回する方法(いわゆるローラー作戦)は避けてください.
テンプレート
次に示すプログラムのテンプレート(雛型)を使ってください. このプログラムは名前を適宜変えた上で保存して利用してください(リンクを右クリックして「リンク先に名前をつけて保存」に相当する項目を選んでください).
今回はテンプレートをダウンロードした後,次のように「require 'gtr/turtle'」の次に「require 'gtr/treasure_hunt'」の行を追加してください.
# タートルグラフィクスパッケージの読み込み require 'gtr/turtle' require 'gtr/treasure_hunt' # この行を追加する(太字にしているのは説明のためです) include Gtr
「require 'gtr/treasure_hunt'」によって,'treasure_hunt'を読み込んで, この課題のために利用するメソッドを亀に追加で定義します(追加されるメソッドについては後述). また同時に,宝物をキャンバスに配置して,亀をキャンバス上に(宝物と重ならないように)ランダムに配置するような設定を施します.
探索方法の概要説明
この課題では,どのようなに宝物を探すようにしているのか, 宝物を探す方針についての説明をプログラムの先頭の部分に次のように記述してください.
=begin
所属:
氏名:
学生番号:
難易度(5段階評価):
宝物を探す方針の説明
感想など(任意)
=end
備考
タートルグラフィクスで亀を動かす距離が極端に短い場合に亀が期待通りに動作しない場合があります. 亀を動かしても位置が変わらない場合は,この問題が生じていると考えて,移動距離を少し大きくするようにしてください.
利用可能なメソッド
この課題で利用可能な亀のメソッドを紹介します. なおすべてのメソッドを使わなければならないわけではありません.
- probe_treasure()
宝物の位置のヒントを得る. 値は0,1,2,3のいずれかである. これらの値は以下に説明するように現在の亀の位置を基準として宝物がキャンバスのどの象限に隠されているかを表している.
q = probe_treasure() # q=0,1,2,3のいずれかprobe_treasureメソッドは'treasure_hunt'をrequireで取り込むことで利用できるようになっています.このメソッドの値(q)をヒントにして亀の動かし方を決めることを想定しています. この課題で,このprobe_treasureメソッドの利用は必須です.
このメソッドの値は,亀がどこにいても亀の位置を中心にして(相対的に)宝物がどの方向にあるかを表すことに注意してください. つまり亀の位置次第で,このメソッドの値は異なる場合があります. なお亀の向きは判定とは無関係です. 亀がどちらを向いていても,キャンバス上での亀の位置と宝物の位置の関係のみでqの値は決まります.
q=0 宝物は亀を基準として画面右上の領域にある(右方向と真上も含む) q=1 宝物は亀を基準として画面左上の領域にある(左方向も含む) q=2 宝物は亀を基準として画面左下の領域にある q=3 宝物は亀を基準として画面右下の領域にある(真下も含む) - dig()
亀の周辺の地面を掘る. このメソッドの値(掘った結果)は次のどちらかである.
Treasure::FOUND 宝物が見つかった Treasure::NONE 何も見つからなかった
digメソッドは'treasure_hunt'をrequireで取り込むことで利用できるようになっています.亀を中心として,およそ「画面上の亀のサイズ」以内の位置に宝物があるとき,このメソッドを実行すると宝物が見つかります. また宝物が見つかると, 画面に宝物が自動的に表示されます(課題で作成するプログラムでの表示処理は不要です).
次に利用例を示します(課題のプログラムにこの通りに利用することを意味しているわけではありません).# 宝物が見つかった? # (dig()の値がTreasure::FOUNDと等しい?) if dig() == Treasure::FOUND end
等号(==)の左辺がdigメソッドの値です.その値は(状況次第で)「Treasure::FOUND」か「Treasure::NONE」のどちらかとなります.上の例では,その左辺の値が(右辺の)「Treasure::FOUND」と等しいかどうかを調べていることになります. この課題ではdigメソッドの利用は必須です. - canvas_size()
キャンバスの幅と高さを得る.w,h=canvas_size() # キャンバスの幅と高さをそれぞれw,hに代入する
- pos()
亀の位置を得る.x,y = pos() # 亀の位置のx座標とy座標をそれぞれx,yに代入
- dir()
亀の向きを得る.値は0以上360未満となる.d = dir() # 亀の向きをdに代入
- on_canvas?
亀がキャンバス内にいるかどうかを判定する. キャンバス内ならtrue,はみ出していればfalseとなる.
# 亀がキャンバスの外にいるなら if (not on_canvas?) end
サンプルプログラム
以下にサンプルプログラムを示します.
これらをブラウザの画面で開いたときに文字化けしてしまう場合には, ダウンロードしてEmacs等で開いてみてください.
プログラムの強制終了
プログラムが止まらなくなったようにみえたら,端末(Terminal)上で次のキーを入力してください. プログラムを強制的に終了させます.
[Ctrl]+[c]
日置尋久(HIOKI Hirohisa)
Last modified: Sun Nov 02 15:45:54 JST 2025