課題
今回の課題のプログラムでは, 上図のw,h,lenの値がプログラムの実行を開始した後に指定されるとして,それらの値に従って,信号機を描くようにしてください. 図中の「r」と「m」の値は,「w」と「h」から計算して求めるようにします. 「w」と「h」から「r」と「m」を導く式は,プログラムに自分で記述する必要があります.
# r,mをw,hから求める
r = ...
m = ...
なお「w」「h」の値は自由に決めてよいわけではありません. それらの値が不適切な場合は「r」「m」が負の値になりえますが, 今回は「w」「h」の値は常に適切に指定されると仮定して構いません. つまり不適切な値が指定された場合の処理を考える必要はありません.
また上図ではボードやランプに黒い縁取りを付けてありますが, それらを描く必要はありません. 同様に,文字(w,h,len,r,m)や寸法を示す矢印なども描く必要はありません.
ランプ,ボード,支柱の色は,上の図と同じでなくても構いません.
プログラムテンプレート
次に示すテンプレート(雛型)をプログラム作成に利用してください. このテンプレートは名前を適宜変えた上で保存して利用してください. なおファイルをダウンロードするにはリンクを右クリックして「名前を付けてリンク先を保存...」を選びます.
このテンプレートには誌号機のw,h,lenの値を指定する処理は記載済みです. 具体的には,次の処理で,w,h,lenの値をキーボードから読み込みます.
# ボードの幅w 高さh 支柱の長さlenを得る
# (例) 160 60 240
w,h,len = ask('ボードの幅 高さ 支柱の長さ?').split.map(&:to_i)
プログラムを実行すると,「ボードの幅 高さ 支柱の長さ?」と質問するポップアップ画面が表示されます. そこで,次のようにw,h,lenに代入する値を順に空白文字で区切って指定してください.
160 60 240
この例の場合,w,h,lenには次のように値が代入されることになります.
w = 160 h = 60 len = 240
今回の課題では,ここで指定されたw,h,lenに従って,信号機を描く亀の動作の記述を追加してプログラムを完成させてください. 上にも書いた通りrとmはw,hから計算して求めます(プログラムにr,mを定める式を記述します). 亀の動作は「def draw」から「end」の間に記述します.
描画機能の追加 --- box
今回の課題では,boxという名前で長方形を描く機能を使えるようにしています. 具体的には,長方形の2辺の長さをa,bとして「box(a,b)」によって,指定した長方形を描くことができます(a,b > 0). テンプレートでは次のようにテストとして長方形を描くようにしています.
# 「box(a,b)」で長さa,bで定まる長方形が描けます(a,b > 0).
# 最初に長さbの辺を描きます.あとは左回りで長方形を描きます.
fill { box(w,h) } # 長方形の描画テスト(不要なら削除可)
今回記述するプログラム(def draw ... end)においては, この「box」を適宜利用してもらうことを想定しています.
「box」はタートルグラフィクス自体で提供されている機能ではなく, タートルグラフィクスが提供する描画機能を組み合わせて,今回の テンプレートで新たに定義している「メソッド」です. 定義をしないと「box」は使えません. メソッドについては,次の授業で取りあげる予定です.
ちなみにboxメソッドの定義は,テンプレートの「def draw ... end」の後に あります.定義については,今回は理解してもらう必要はありません.
Tips
以下,課題に取り組むにあたって,知っておくとよさそうなtips(hint)を示します.
- 四則演算に関する注意
- 乗算: 演算子は「*」です.数学のように記号を省略することはできません.
- 除算: 演算子は「/」です.ただし「整数/整数」は「商」になります.
- 演算の優先順位
数学と同じです.括弧で優先順位を明示できます. 計算式での括弧には常に( )を使います. { }や[ ]は使いません.
- markとback(タートルグラフィクスの機能)
markすると亀が現在位置と向きを記憶します. その後backすると亀がmarkした状態に戻ります.len = 100 mark() # 現在の位置と向きを記憶する forward(len) turn(120) forward(len) back() # 記憶している場所に(線を描いて)戻って,記憶していた方向を向く
なお「hover { back() }」とすれば線を描かずに戻ります. 複数markした場合は一番最近のmarkに戻ります. backするとそのmarkに関する記憶はなくなります.
- 補完機能を利用する
Terminal(端末)でファイルを指定するときに,必ずしもファイル名を1字ずつ全て入力する必要はありません.ファイルを特定するために必要な文字さえ入力すれば,あとの部分は補完できます. たとえば「a」からはじまるファイルが一つしかないとします. このとき[a]を入力して[Tab]を押せば,残りの部分は補完されます.$ ruby a[Tab]「a」から始まるファイルが複数あれば,[Tab]を入力した時点で候補一覧が表示されます(部分的に補完可能であればその部分だけ補完されます). そのようなときはファイルを特定するための文字を追加入力してあらためて[Tab]を押してください.
- コマンド履歴を利用する
Terminal(端末)でカーソルキーの[↑]を押すと前に入力したコマンドがでてきます. 一度入力したコマンドを何度も入力する必要はありません.
$ [↑]なお[↑]を押し過ぎたら[↓]で戻せます.
- プログラムを切り貼りする(Emacs)
プログラムで似たような処理をいくつも書く場合に,すべて手で入力する必要はありません. コピーしてから必要に応じて書き換えた方が楽です. 次にEmacsでコピーと貼り付けを行う方法を示します.
まずマウス(3ボタン)を使えば,次のようにコピーと貼り付けができます.- コピーしたい部分の最初から最後までをマウスの左ボタンを押しながらドラッグしてなぞる.
- 貼りつけたい場所で,マウスの中ボタンを押す.
次のようにメニューを使う方法もあります.- コピーしたい範囲をドラッグして選択しておく
- メニューの「Edit」から「Copy」でデータをコピーする
- メニューの「Edit」から「Paste」で貼り付ける
また次のようにキーボード操作を使う方法もあります.
連続して[Ctrl]+[k]を入力すれば,一連の行を切り取ることができます. 連続して切り取った行は[Ctrl]+[y]で一度に貼り付けできます.[Ctrl]+[k] カーソルの位置から行末までを切り取る [Ctrl]+[y] 切り取ったテキストを貼り付ける
キーの組み合わせが独特ですが,慣れることができれば, キーボードから手を離す必要がなくなります.
注意
以下のことに注意してください.
- プログラムを変更したら必ず保存してください.
- タートルグラフィクスのプログラムは実行開始時にしか読み込まれません. そこでプログラムを変更したときに,すでにプログラムを動かしていた(タートルグラフィクスの画面が出たままになっていた)のであれば,一旦終了してから再度実行してください.
- プログラムを実行してエラーがでたら「よくある質問」を参照してみてください. もちろん分からないことがある場合には演習中に質問してください.
- プログラムを提出する際には「課題提出に関する注意」を必ず守るようにしてください.
日置尋久(HIOKI Hirohisa)
Last modified: Fri Oct 17 21:54:23 JST 2025