for Squeak 4.4 on Mac OS X (macOS 10.13 High Sierra or earlier) / Windows (Windows 7 or later)
for Squeak 5.2 on Mac OS X (macOS 10.14 Mojave or later) / Windows (Windows 7 or later)
ペン(Pen)を用いて、いろいろなタートルグラフィックス(turtle graphics)を作成してみましょう。タートルとは亀のことです。この亀が尻尾に鉛筆をつけて動きまわることにより、その動いた軌跡(足跡:正確には尻尾の鉛筆の跡)が図形になります。画面上の亀(ペン)に「100進んで」「90度向きを変えて 」「50@100に移動して」などといった命令を与えることで、面白い図形を描くことができます。
|
まず始めに、ペン(Pen)を1本、手に入れるプログラムを示しましょう。以下のプログラムになります。1行目がペン1本を束縛する(つなぎとめて覚えておく)一時変数の宣言です。2行目がPenのクラスに向かってnewのメッセージを送ってペンを1本作り、それをaPenとするということを表しています。3行目はaPenを応答するという意味です。
| aPen |
aPen := Pen new.
^ aPen
上記のプログラムに新たなメッセージ式を2つ(2行)付け加えましょう。defaultNib: 5はペン先の太さを5にしてください、place: 300 @ 300はペンの場所(位置)をx座標300、y座標300にしてください、という意味になります。
| aPen |
aPen := Pen new.
aPen defaultNib: 5.
aPen place: 300 @ 300.
^ aPen
さらに新たなメッセージ式を1つ(1行)付け加えましょう。aPenに対してgo:(進みなさい)というのです。go: 100はペン(亀)に対して100進みなさい、ということを指示しています。コロンの後に、進む長さを指定するわけです。
| aPen |
aPen := Pen new.
aPen defaultNib: 5.
aPen place: 300 @ 300.
aPen go: 100.
^ aPen
すると、次のようになります。黒い太めの線が現れます。最初、ペン(亀)は画面の左上から300 @ 300の位置におり、そして、上(北方向)を向いています。そこで、100進みなさい、と言われたので、ペン先が5で、100の長さの黒い線が上方向に向かって現れたのです。
|
|
さらにさらに新たなメッセージ式を2つ(2行)付け加えましょう。aPenに対してturn:(回転しなさい)と言うのです。turn: 90はペン(亀)に対して時計回りで90度回転しなさい、という意味になります。コロンの後に、回転角を指定するのです。そして、その後、また、100進みなさい、と言います。
| aPen |
aPen := Pen new.
aPen defaultNib: 5.
aPen place: 300 @ 300.
aPen go: 100.
aPen turn: 90.
aPen go: 100.
^ aPen
次のようになります。直角に曲がった新たな黒い太めの線が現れます。
|
|
ペンの色を変えてみましょう。新たなメッセージ式を1つ(1行)付け加えます。color: Color redというメッセージは、ペンの色を赤にしなさい、ということを表現しています。
| aPen |
aPen := Pen new.
aPen defaultNib: 5.
aPen place: 300 @ 300.
aPen go: 100.
aPen turn: 90.
aPen color: Color red.
aPen go: 100.
^ aPen
|
|
それでは、0.5秒(500ミリ秒)ごとに、黒・赤・緑・青の線を引き、四角形を描いてみましょう。
| aPen |
aPen := Pen new.
aPen defaultNib: 5.
aPen place: 300 @ 300.
(Delay forMilliseconds: 500) wait.
aPen color: Color black.
aPen go: 100.
aPen turn: 90.
(Delay forMilliseconds: 500) wait.
aPen color: Color red.
aPen go: 100.
aPen turn: 90.
(Delay forMilliseconds: 500) wait.
aPen color: Color green.
aPen go: 100.
aPen turn: 90.
(Delay forMilliseconds: 500) wait.
aPen color: Color blue.
aPen go: 100.
aPen turn: 90.
^ aPen
|
|
もっと簡潔なプログラムは、以下のようになります。
"黒・赤・緑・青で四角形を描く。"
| aPen |
aPen := Pen new.
aPen defaultNib: 5.
aPen place: 300 @ 300.
#(#black #red #green #blue )
do: [:aSymbol |
| aColor |
(Delay forMilliseconds: 500) wait.
aColor := Color perform: aSymbol.
aPen color: aColor.
aPen go: 100.
aPen turn: 90].
^ aPen
では、茶色の矢印を描いてみましょう。末尾の付録を参考にして、以下のプログラムを読み砕いてみてください。ペン(亀)の位置と方向をaLocationとaDirectionという変数に記憶(束縛)しているところがミソ(肝)になります。
"茶色の矢印を描く。"
| aPen aLocation aDirection |
aPen := Pen new.
aPen defaultNib: 5.
aPen place: 300 @ 300.
aPen color: Color brown.
aPen go: 100.
aLocation := aPen location.
aDirection := aPen direction.
(Delay forMilliseconds: 500) wait.
aPen turn: -140.
aPen go: 30.
aPen
location: aLocation
direction: aDirection
penDown: true.
(Delay forMilliseconds: 500) wait.
aPen turn: 140.
aPen go: 30.
^ aPen
|
|
さぁ!必須問題と自由問題にチャレンジしてみましょう。
五芒星(星形)を描くプログラムを作成して提出してください。
|
|
色とりどりな円を描くプログラムを作成して提出してください。
|
|
Penの基本的なもの(メッセージ)を紹介しておきます。
詳細は「System Browser」を開いて調べましょ。