[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2025) >  [課題03] 信号機 ]

[課題03] 信号機

課題

以下の要領に従って, タートルグラフィクスで信号機を描くプログラムを作成して, プログラムを提出してください.
信号機の図

今回の課題のプログラムでは, 上図のw,h,lenの値がプログラムの実行を開始した後に指定されるとして,それらの値に従って,信号機を描くようにしてください. 図中の「r」と「m」の値は,「w」と「h」から計算して求めるようにします. 「w」と「h」から「r」と「m」を導く式は,プログラムに自分で記述する必要があります.


  # r,mをw,hから求める
  r = ...
  m = ...

上に示したように,r,mを得るには,それぞれをw,hによって表す式を明示的に書き下す必要があります. 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)を示します.

注意

以下のことに注意してください.

[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2025) >  [課題03] 信号機 ]