Turtle Graphics について 1999/11/26 Ver. 0.01 ( 新規作成 ) 1999/11/28 Ver. 0.02 ( 拡張 ) 1999/11/29 Ver. 0.02b ( 細かい修正 ) 1999/11/29 Ver. 0.03 ( 文字列, Push/Pop ) 1999/12/06 Ver. 0.04 ( 初期ファイル、 システム文字列 ) 2000/06/06 Ver. 005 ( Java 版 ) # TG Ver 0.00 2000/06/07 Ver. 006 ( 日本語処理、  Java 版固有の話 ) # TG Ver 0.01 2000/06/13 Ver. 007 ( 色、太さ、乱数など.. X, Y, Dir の取り出し, 奇遇判定 ) # TG Ver 0.02 2000/06/15 Ver. 008 ( TextField の追加 ) # TG Ver 0.03Alpha 2000/06/18 Ver. 009 ( BugFix, カーソルをつけた, 部分的な Save 機能 ) # TG Ver 0.03 (未公開) 2000/06/18 Ver. 010 ( Block 文の Bugfix, z Reg の追加 ) # TG Ver 0.03b 2000/06/20 Ver. 011 ( 継続行, ファイルの Load/Save ) # TG Ver 0.04 数学科 助手 栗野俊一 0. turtle graphics とは trutle graphics とは、画面上に一匹のカメがいて、それに 命令を下すことによって、図形を書くことができる仕組み です。別の名をロボット言語とも呼びます。 具体的には、カメに向かって n 北 ( 上 ) を向け c 真ん中 ( 320, 240 ) に行け t 時計回りに 45 度向きを変えろ m 足跡を残して現在向いている方向に一歩進め j 足跡を残さずに一歩進め という命令ができ、その組み合わせで、描画します。 例えば、 n c m m m m m t t m m m m m t t m m m m m t t m m m m m t t は、座標 ( 320, 240 ) を左下隅とする大きさ 5 の正方形が描画されます。 この他にも、 5 m の様に、命令の繰り返し回数を直前に書くことによって、命令を繰り返す ことが可能です。更に、'(' と ')' で繰り返す範囲を指定できるので、 n c 4( 5m 2t ) も、前出の正方形を描きます。 なお、繰り返し回数が 0 の時には何もしないことに注意してください。 1. 変数 1.1 二つの汎用変数 カメは、二つの数値を a と b を覚えており、 i a=0, b=0 # a, b 共に 0 にする + a++ # a を一増やす - a-- # a を一減らす < b++ # b を一増やす > b-- # b を一減らす という風に、値を変えることができます。 更に、 a m # a 歩だけ移動する の様に、繰り返しの数値の代わりに、この二つの変数の値を 参照して利用することができます。 1.2 状態変数 直接は操作できませんが、現在のカメの状態を変数として取り出す ことが可能です。この状態とは、次の三つです。 x 現在の PosX を取り出す y 現在の PosY を取り出す d 現在の Dir を取り出す 1.3 返り値変数 変数 z は、次のような性質を持った変数です。 a) 後に述べる「環境の保存」の対象にならない変数です。 b) z で、その値を取り出すことができます。 c) $ で、その値を reset することができます。 変数 z は、a) の性質があるために、'{', '}' をまたがって利用する ことができます。 2. 条件判断 また、判定も可能で、 ? 直前の繰り返し回数が 0 でなければ、新しい 繰り返し回数を 1 に、 そうでなければ 0 にする ! ? の逆に、直前が 0 なら 1 になる & 奇数なら繰り返し回数を 1 に、偶数なら 0 にする : 最後に判定した ?, ! の逆の値になる を利用して、 a ? ( b m ) もし、a が 0 でなければ b 回 m を実行 a ! ( m ) : ( j ) もし、a が 0 なら足跡を残して移動、そうでな ければ、足跡を残さずに移動 # もちろん、これは、 # a ? j : m # と同じ意味になる a & m : j もし、a が奇数なら、足跡を残して移動、 そうでなければ、足跡を残さず移動 などとできます。 3. サブルーチン 更に、命令の列には、大文字一文字の名前をつけることが可能で、 行頭から、 =「大文字」「命令列」「改行」 とすることによって、その命令列に名前がつきます。これによって、 名前を指定することによって、この命令列を呼び出すことが可能です。 例えば、 = I n c p i a $ # I は初期化 = A bj 3t 4( bm 2t ) t bj 4t # A 現点を中心とした一辺が 2 b の長さの菱形を書く I 5( 10< A ) # 五個の菱形を書く は、入れ子になった、5 個の菱形を書きます。 再帰呼び出しも可能なので、色々と試してみましょう。 4. 文字列の出力 ダブルクォーテーション (") で、文字列を括ることによって、その 文字列を出力することができます。 "Hello" Hello という文字列の出力 文字列の出力される位置は、現在のカメの位置を左上隅し、文字列 を左から右に出力します。 現在の版では、文字列の方向や大きさ、色等は変更できませんし、 文字列の出力によって、カメの位置も変化しません。 5. 環境の Push/Pop 命令 {, } を利用することによって、現在のカメの状態を保存した り、復帰させることができます。 { 現在のカメの状態を保存する } 現在のカメの状態を破棄し、最後に保存した状態 に復帰させる。 # 注意 z Reg は、保存/復帰されない 状態の保存は、スタックに行われるので、複数の状態を入れ子に して記憶することができます。 復帰される順は、保存された順と逆順になることに注意しましょう。 なお、複数の状態を交換するような方法は、現在のところ提供 されていません。 # TG Ver 0.03b 未満の版では、'{' と '}' が Block として働いて # いませんでした。 # つまり # 3 { 100m } # とすると、3 回 push して、100 歩進み、1 回 pop しました。 # したがって、もし、Block として利用したい場合は '(', ')' と # 併用する必要がありました。 # 3 ( { 100m } ) # # TG Ver 0.03b 以後の版では、'{' と '}' が Block として働く # ようになったので、 # 3 ( { ... } ) # と、 # 3 { ... } # は、同じ結果になります。 # 6. 初期化ファイル 現在の directory に init.tg という名前のファイルがあると、この内容 が、最初に読み込まれます。従って、典型的な設定内容を、予め、ここに 設定しておけば、自分のプログラムの中に、予め設定して置く必要ありま せん。 7. システム文字列 以下の命令は、予め定義されている文字列を出力します。 v Version です。 8. 乱数 乱数を扱うための命令が r 0 ~ 7 の値をランダムに返す で、これは、参照の度に、0 ~ 7 の値を返します。 9. ペン ペンの色と太さ ( それぞれ 0 ~ 7 ) も変えることが可能で、 ~ 色コードを一つ増やす ( 7 の次は 0 になる ) ^ ペンの太さを一つ太くする ( 7 の次は 0 になる ) p ペンの状態を初期状態にする 色コード 0 ( 黒 ) 太さ 1 という命令が用意されています。 10. 継続行 プログラムは基本的に一行単位で処理されますが、行末の有効な文字 ( 空白並びに、コメントを除く任意の文字 ) が \ ( 円マークあるいは、 バックスラッシュ ) の場合は、行が次の行に続くと解釈されます。 # ただし、これはファイルから読み込む場合で、java 版でのキーボード # からの入力の場合は、継続行は処理されないことに注意してください。 A. Java 固有の内容 このプログラムは、独立アプリケーションとしても、アプレットとして も動くように作られています。 ただし、この二つの形態では、利用方法が多少異なりますので、ここでは、 この違いに関して説明したいと思います。 A.1 独立アプリケーションとしての起動 独立アプリケーションとして利用する場合は、次のような形で利用します。 java TurtleApplet TurtleProgramFile TurtleProgramFile ... カメプログラム 引数としては、カメの行動を決めるプログラムの入ったファイルを指定しま す。 A.2 アプレットとしての起動 アプレットとして利用する場合は、HTML ファイルに埋め込んで、 applet タグを利用して参照します。 # Ver 0.04 以降では、jar ファイル ( Turtle.jar ) を使用するように # したので、基本的に archive の指定が必要になります。 # また、jar ファイルを作成するための bat ファイル ( mkjar.bat ) # も提供されています。 このとき parameter を利用して、カメプログラムの入ったファイル 等を指定します。 なお、このファイルは、アプレットファイルのある場所に対して、 相対位置になければならないことに注意してください ( Web Server 上に載せる場合も同様 )。 # Ver 0.04 以降では、jar ファイル ( Turtle.jar ) を使用するように # したので、基本的に archive の中に含まれていれば Okey です。 また、このときに、更にオプションとして、このカメプログラム ファイルで利用されている漢字コードを指定することもできます。 A.3 ボタン A.3.1 ReLoad ボタン ReLoad ボタンを押すことによって、プログラムをプログラムファイル からもう一度読み込み、再度実行します。 A.3.2 Clear ボタン Clear ボタンを押すことによって、実行プログラム部分を破棄します。 ただし、定義内容は保存されているので、新たに実行プログラムを 指定することによって、再実行は可能です。 A.3.3 Save ボタン Save ボタンを押すことによって、現在の表示されている絵を 書くプログラムを保存することができるようになりました。 なお、この機能は、独立アプリケーションとして利用する場合 にだけ、利用可能で、アプレットの場合は、利用できません。 A.3.4 Load ボタン Load ボタンを押すことによって、後からファイルを指定して カメプログラムを読み込むことが可能になりました。 なお、この機能は、独立アプリケーションとして利用する場合 にだけ、利用可能で、アプレットの場合は、利用できません。 A.3.5 RePaint ボタン RePaint ボタンを押すことによって、再描画します。ただし、 再描画して、形が変わるのは、r (ランダム) を利用してい る場合で、それ以外の場合は、変化はありません。 A.4 テキストフィールド テキストフィールドに文字列を入力し、改行キーを押すこと によって、その文字列を実行することができます。この内容は、 現在の内容に追加されます。 Clear ボタンを押すと、ここの内容は初期化され、最初から やり直しになりますが、定義した内容は残っています。 また、同じ文字に対する定義は、上書きされ、最後に行った 結果だけが有効になります。 B. その他 B.1 parameter 読み込み IE 4.0 だと.. -- init param がちゃんと動かない why ?? => 動くようになった、どうもバグだったらしいが.. ( Ver 0.04 ) -- StringBuffer に delete method がない.. -- applet の上位が Frame になっている !! => 区別ができん !! B.2 Well Known Problem B.2.1 Ver 0.03Alpha -- Applet として動作しない fixup at Ver 0.03 B.2.2 ... Ver 0.03 -- '{', '} が Block として働かない fixup at Ver 0.03b B.2.3 ... -- 指定したファイルがなくても無視されるだけ =================================================== Ver 0.01 -> 0.02 r 0-7 の乱数を発生する ( 4. を追加 ) ~ 色を変更する 0-7 ( 5. を追加 ) ^ 太さを変更する 0-7 Ver 0.02 -> 0.02b 細かい字句を修正 Ver 0.02b -> 0.03 文字列の出力 ( 6. を追加 ) Push/Pop の追加 ( 7. を追加 ) Ver 0.03 -> 0.04 初期ファイル ( 8. を追加 ) システム文字列 ( 9. を追加 ) Ver 0.04 -> 0.05 java 版 ( 4., 5. を削除 ) Ver 0.05 -> 0.06 java 版固有の内容 ( A. を追加 ) Ver 0.06 -> 0.07 色、太さ、乱数など.. ( 削除した内容を復活 ) X, Y, Dir の取りだし & 命令 ( 奇遇判定 ) の追加 Ver 0.07 -> 0.08 java 版固有の内容 ( A.4 を追加 ) Ver 0.08 -> 0.09 Bug Fix カーソルをつけた ( Thank you !! >> 武藤君 ) 部分的な save 機能 Ver 0.09 -> 0.10 ( Thank you !! >> 若林君 ) Block 文の Bugfix ( 5. に追加記述 ) z Reg の追加 ( 1. を書き換え ) Ver 0.10 -> 0.11 継続行の処理 ( 10. を追加 ) ファイルの Load/Save jar ファイル