タートルグラフィックス「KTurtle」を利用して, コードを効率良く(複雑な処理を短く) 記述するための考え方を身に着けよう.
また,以下の実習が終わったら, vimtutor のレッスン6に取り組もう. (レッスン5は現段階では理解が難しいのでスキップする. また,レッスン7は上級者専用.)
前回学んだ通り,多角形を描くには, 一定距離の前進(forward)と 一定角度の旋回(turnleft または turnright)とを 繰り返せばよかった. たとえば,12角形の場合のコードは:
reset repeat 12 { forward 10 turnleft 30 }
これを元にして,螺旋(らせん)を描くように改造してみよう. 前進の距離を少しずつ変化させるようにすればよい: (効率的なソースコードの例)
reset $len = 1 # 距離の変数 $len に定数 1 を代入 repeat 100 { forward $len # 距離 $len だけ前進 turnleft 30 $len = $len + 1 # 距離を 1 だけ増やす # $len の値は repeat するたびに,1 から 2 へ,2 から 3 へ,... と変化 }
このように,変数と数式とをうまく利用すれば, 複雑な図形を短いコードで表わせるようになる.
もし,変数を使わずに螺旋を描こうとすると, repeat も使えず,とても長たらしいコードを書かなければならない: (非効率的な例.真似してはいけません.)
reset forward 1 turnleft 30 forward 2 turnleft 30 forward 3 turnleft 30 . . . forward 100 turnleft 30
なお,変数は自由に作れるが,次の命名規則を守ること:
適格な変数名の例:$angle,$v123,$p2x,...
不適格な変数名の例:angle,$123v,$-px,...
独自のコマンドを作り,プログラムを短く分けて,分かりやすく組み立てよう. 多角形を描くコマンド polygon の定義例・使用例:
learn polygon $n, $len { # polygonコマンドの定義 repeat $n { forward $len turnleft 360/$n } } reset repeat 4 { polygon 4, 100 # 大きさ10 の四角形 turnright 90 forward 100 }
このプログラムを実行すると,
乱数を利用すると,不規則な図形を描ける. もっとも単純な例:(ランダムウォーク)
reset repeat 100 { $len = random 10,30 # 10以上,30以下の乱数 $ang = random -90, 90 # -90以上,+90以下の乱数 turnleft $ang forward $len }
何度も実行してみよう. 実行する度に,異なる結果になるハズだ. 画面外にハミ出てしまう場合もあるが...
ランダムウォークを元に,ハミ出ても戻って来るようにしてみた:
reset canvassize 200, 400 # 画面サイズを横200×縦400に center # タートルを中央へ repeat 100 { $x = getx # タートルの現在のx座標 $y = gety # タートルの現在のy座標 if ($x < 0) { gox 200 } # x方向にハミ出たら逆から戻る if (200 < $x) { gox 0 } if ($y < 0) { goy 400 } # y方向に 〃 if (400 < $y) { goy 0 } $len = random 10,30 $ang = random -90, 90 turnleft $ang forward $len }
新しいコマンドがたくさん出てきたが, ここで一番重要なものは if だ. 一般形は次の通り:
if ( 条件式 ) { 条件が成立した場合の処理 } else { 成立しなかった場合の処理 }
なお,else 以降は省略してもよい.
また,条件式では, 不等号「<」,「>」の他, 等号「==」,否定等号「!=」も利用できる.
KTurtle では,ダイアログウィンドウを通じて, ユーザとタートル(プログラム)との間の通信も簡単に実現できる. 試しに,タートルをリモコンロボットにしてみた:
reset canvassize 300, 400 go 150, 300 # 座標(150, 300) に移動 while (true) { # 永久に繰り返す $f = ask "どーする? (s/r/l/end)" # ダイアログから指示を入力 # Straight/Right/Left/... if ($f == "l") { turnleft 90 } else if ($f == "r") { turnright 90 } else if ($f == "end") { break # 繰り返しを途中終了 } forward 30 } message "おしまい" # ダイアログにメッセージを出力
なお,この例では,変数に数値ではなく,文字列を代入したりしている. だけど,数値の場合とほとんど同じなので,説明不要だよね?
KTurtle のプログラムが止まらなくなってしまった場合, 強制終了するには,端末で次のコマンド:
$ killall kturtle
それと,練習問題の他,vimtutor も忘れずに...
今回学習した技(変数,数式,if,learn,等)を駆使して, ある程度複雑な図形を自由に作成せよ。