亀場でプログラミング:亀場を使い始めるまで
このページは、亀場とは何か、と、あなたのパソコンで亀場サーバーを動かすまでを説明する。
1. はじめに
ここでは、プログラミングの初歩(ソースファイルの編集方法、コンパイルや実行の方法、変数を使った計算と代入操作、条件分岐、反復処理など) はすでに習得し、もっと面白い例題や力だめしの機会を探している学生を想定して、 「亀場(Turtle Field)サーバー」というソフトウェア(このサイトの管理者の自作)を紹介したい。 この亀場を使うと、割合と簡単に、コンピュータグラフィックスや、移動ロボットのシミュレーション、対戦型ゲームなどを作ることができる。
亀場のスクリーンショットの例
ヒルベルト曲線(左)
BRUSHモードの描画(中央)
迷路モード(右)
デモムービー
亀場サーバーは、今のところ、Linux、Mac、Windowsでの動作を確認している。 また、実際に亀場を操るためのプログラムを作成する環境(テキストエディタ、言語の処理系)も、併せて必要となる。 単にネットを見たりワープロをするためだけの「Windowsパソコン」しか持っていない方は、このページの情報を手がかりに、 まずは環境整備を行っておく必要がある。
このページではまず、最初のステップ(準備)として、亀場を使って簡単な図形をコンピュータに描かせてみるところまでを試してみたい。 一般に、コンピュータグラフィックスの制作は(どんなソフトやシステムを使ったとしても)結構面倒な作業だが、 亀場を使うことで、「タートルグラフィックス」 が簡単に体験できるようになっている。
2. タートルグラフィックスとは
体育館のように広い床の上に一匹の亀(turtle)がいる。 あなたは(リモコンで)その亀に命令して、亀をあちらこちらと歩き回らせることができる。 基本的な命令は、「x歩前進せよ」、「x歩後退せよ」、「x度左に回転せよ」、「x度右に回転せよ」の4つ。 何も命令が無ければ、(なにせ怠け者なので)亀はその場に停止したままである。
タートルグラフィックスは、プログラミングの入門用として設計された Logo という言語に採用されて知られるようになった。 入門用とはいっても、勉強してみると結構奥が深い。
さらに、亀は(何故か)ペンを持っていて、「ペンを下げる」、「ペンを上げる」という命令にも応答する。 そして、ペンを下げた状態で移動すると、床には線が描かれる。
このように、亀の移動とペンの上げ下げを組み合わせて、スクリーン(床)に絵を描くやり方を タートルグラフィックス(turtle graphics)と呼ぶ。
ここで、共通の約束事として、移動距離(歩数)は、画面の画素(ピクセル)を、角度は度数法(°)を単位として表現することにし、 スクリーンの中央が原点、水平右向き方向が(絶対)角度0度、左回り(反時計回り)が正の角度、とする。 ただし、ここでの移動距離や角度は、実数として処理される。
例えば、床に辺の長さが100の正方形を描くには(C言語の場合)、
RST() ; /* 位置をリセット(原点に移動) */ PD() ; /* ペンを下げる */ FD(100.0) ; /* 前進 100 */ LT(90.0) ; /* 左回転 90 */ FD(100.0) ; /* 前進 100 */ LT(90.0) ; /* 左回転 90 */ FD(100.0) ; /* 前進 100 */ LT(90.0) ; /* 左回転 90 */ FD(100.0) ; /* 前進 100 */
といった具合のリモコン操作になる。 こうした単純な操作だけでも、組み合わせ方や工夫次第で、複雑で面白い図形を描くことができる。
3. 「亀場」の準備
準備:亀の居場所(亀場)を整える
熊本県の天草には
亀場町という地名があるらしい。一度は訪れてみたいものだ。
亀場サーバー
Linux(64bit)用実行ファイル
tfield-linux64.zip
Linux(32bit)用実行ファイル
tfield-linux32.zip
Windows用実行ファイル
tfield-win32.zip
Macintosh用実行ファイル
TurtleField-Mac.zip
では、実際にあなたのパソコンを使って、タートルグラフィックスを試してみよう。 まず最初に、「体育館の床」、あるいはキャンバスをコンピュータ上に作成しておく。 亀(turtle)が行ったり来たりして作業する場所、という意味を込めて、そこを亀場(Turtle Field) と呼ぶことにした。
Linux (Ubuntu等)
亀場をダウンロード(64bit版, 32bit版)して、ファイルを解凍(ファイルを右クリックして「展開」)する。 tfield-linux64(またはtfield-linux32)というプログラムファイルが現れる。 ファイルに実行パーミッションが設定されていない起動できないので設定を確認する。 サーバーを起動すると、画面左上に四角いウィンドウが現れる。
なお、プログラムの内部で libpng というライブラリを使用しているので、入っていないパソコンにはlibpngを追加インストールしておく必要がある(libpngがインストールされていない場合は、yumやapt-getなどのコマンドを使ってlibpngを追加インストールする)。
Mac
Mac用の亀場をこちらからダウンロードして展開すると、TurtleFieldというアプリケーションが現れるので、 それをダブルクリックして起動する。内部でlibpngというライブラリを使用しているので、 もし起動出来ない場合、XQuartzをインストールすれば、必要なライブラリが整う。
「素」のMacには開発環境(Cコンパイラー等)が入っていないので、App StoreからXcodeをダウンロード(無料)して、インストールする。 加えて、Xcodeを起動後に、メニューから Xcode → Preferences を選び、出て来るウィンドウ上段の「Downloads」をクリック、 Componentsのリストの中から「Command Line Tools」も追加インストールしておくこと。
Windows
パソコンによっては「描画が徐々に消える」場合があるようです。 そんな症状のときは実行ファイル(tfield.exeではなく)tfield-win.exeを試してください。
Windows版のファイルをダウンロードし、展開すると、 実行ファイルtfield.exeと、ライブラリ freeglut.dll が入っている。 freeglut.dllは実行ファイルと同じフォルダに入れておく。
同梱されているturtle-def.h, turtle-func.cは、Visual Studioなどでプログラムを作成する際に使う(このページの最後を参照)。
パソコンの管理者の権限を持っている場合は、このfreeglut.dllを、32ビットOSの場合は"C:\Windows\System32"の中に、 64ビットOSの場合は"C:\Windows\SysWOW64"の中にコピーしておけば、その後はfreeglut.dllが不要になる。
Windowsパソコンで亀場サーバーやそれを操作するプログラムを動かすと、ウィルス対策ソフトがそれを検知して、画面に警告メッセージを出す場合がある (亀場サーバーはTCPポート2222を使用する)。そのようなときは、通信を「許可」する。
亀場の様子
早速、亀場サーバーを起動してみよう。 スクリーン上に四角いウィンドウがひとつ現れるはず。 このウィンドウに、これから色々な図形を描いていくことになる。 亀場は、パソコンに1つしか作ることができない(サーバープログラムを同時に複数起動できない)。 タートルグラフィックスを勉強する間は、この亀場をスクリーンのどこかに表示しておこう。
正方形の亀場の中心が原点(0,0)で、亀場の広さは 512×512ピクセルになっている。 そうすると亀場の右上の端の座標は(256,256)ということになる。 ただし、この領域は「見えている範囲」という意味であって、亀は自由にこの領域から外に出ることができる。 はみ出した亀は、当然見えなくなるので、座標の範囲に気を配りながら操る必要がある。
亀場の上で、マウスを右クリックすると、簡単なメニューが表示されるようになっている。 メニューの最後の項目"Exit"を選ぶと、亀場を閉じることができる。
4.C言語で亀場に描画する
ステップ1:C言語でプログラムを作成する
これから作るプログラムで亀場を操作するには、C言語に少しだけ機能を追加する必要がある。 そのために必ず必要なファイルが turtle.h 。 こちらからダウンロードして、Cのソースプログラムと同じフォルダに移動(またはコピー)しておこう。
次に、エディタを使って、いつものように、Cのプログラムを作成する。例えば、四角形を描画する場合は、こんなプログラムになる。
#include <stdio.h> #include <math.h> #include "turtle.h" /* 必ず必要なおまじない */ main() { CON("localhost") ; /* 亀場との通信を開始する */ CLR() ; /* 画面とゾンビ亀をいったん消去する */ RST() ; /* 亀の位置を初期設定する(亀は原点に居る) */ PD() ; /* ペンを下げる */ FD(100.0) ; /* 前進 100 */ LT(90.0) ; /* 左回転 90 */ FD(100.0) ; /* 前進 100 */ LT(90.0) ; /* 左回転 90 */ FD(100.0) ; /* 前進 100 */ LT(90.0) ; /* 左回転 90 */ FD(100.0) ; /* 前進 100 */ }
ここで、プログラムに登場する、いくつかの「おまじない」について、簡単にその意味や働きをまとめておく。
#include "turtle.h"
- タートルグラフィックスを行う際に必要な機能を追加するために必ず必要な1行。 ファイルturtle.hはCのソース・プログラムと同じフォルダに置かれていなければならない。
CON("localhost");
- 亀場との通信を開始する。通信がはじまると、亀場にカメが1匹生成される。ここで、"localhost"は、自分が操作しているパソコンのアドレスを意味する。
CLR();
- 何回も描画を繰り返していると、以前に描いた内容が亀場に残っていることがある。それを消去して、スクリーンを綺麗にするための命令。 居残り亀(ゾンビ亀)は、描画の際に亀の移動の障害物になるので、あらかじめCLR()命令で取り除いておく。
RST();
- 亀を原点(0,0)に移動し、向きを0度(水平右向き)に設定する。亀場との通信がはじまったとき、最初の亀の場所と向きはランダムに設定されている。 それを整えるために必要。
ステップ2:プログラムをコンパイルして実行する
ここから先の手順は、一般的なC言語の演習と全く同じなので、特に説明の必要は無いだろう。例えば上記のサンプルプログラムを square.c というファイル名で保存してあるとすると、次に、端末エミュレータで、コンパイルと実行を行う:
cc square.c -lm a.out
エラーがなければ、亀場上には、赤い四角形と亀が現れるはずである。
亀の現在位置(つまり「ペン」の位置)には、亀の(ような)グラフィックが描かれるようになっている。 そして、亀の頭が、現在の「前方向」を表している。
亀場のウィンドウをマウスで右クリックして現れるメニューのうち、いちばん上の"Clear Filed"を選ぶと、 描画内容を(強制的に)消去することもできる。
また、二番目の"Erase Zombie"は、亀場に居残った亀を消すために使う。
亀同士は衝突する
ここのところは少し補足が必要かもしれない。Cプログラム(a.out)が終了すると、亀場に表示されている亀は、すでに接続先(通信先)を
失った状態になっている。それを、ここではゾンビ(zombie)と呼ぶことにする。
メニューの2番目は、「司令塔」を失って「死んで」しまった亀を画面から消したいときに用いる。
Cプログラム中のCLR();
は、メニューの1番目と2番目をそれぞれ選択する動作に対応する。
亀場の亀同士は(本物の亀と同様)互いに衝突を避けようとする。
具体的には、FD()命令で亀を前進させようとするとき、終点までの進路の途中に(ゾンビ)亀がいると、亀は一歩も前に進まない(進めない)。
そんな場合でも、方向を変えて、前方に亀が見えなくなると、先に進むことができるようになる。
つまり、描画中に亀同士の「衝突」が起こると、図形が途中でずれたり曲がったりするので、こうしたハプニングを狙う
のではない限り、描画に先立って必ずCLR()を実行しておくこと。
練習:グラフィックスで文字を描く
アルファベット A〜Zまで好きな文字をひとつ選び、「四角形」のプログラム例に倣って、カメに描かせてみなさい。
Windows用亀場サーバー:
tfield-win32.zip
MinGW用インクルードファイル:
turtlew.h
MinGW(Windows)上のC言語を使う場合
MinGWを使うと、Windows上でUNIX的な環境を実現できる。
MinGWで亀場を操るには、例題等に使われているturtle.h
(UnixやMac用)の代わりに、Windowsにも対応した
をダウンロードして、プログラムの最初のところで
#include "turtlew.h" main() { CON("localhost") ; ... }
のようにturtlew.h
をインクルードする。また、コンパイル時に
gcc program.c -lm -lws2_32
のようにして、ws2_32.dll をリンクする必要がある。
VisualStudio (Windows)上でC言語を使う場合
Windows版の亀場サーバーのZIPファイルの中に、turtle-def.h, turtle-func.cという二つのファイルが同梱されているので、どちらもプロジェクトに加える。
そして、「亀場でプログラミング」で示されているCの例題で #include "turtle.h" となっている箇所を全て
#include "turtle-def.h"
と読み替える。
これらのファイルを含んだ、Visual Studio 10で作成したプロジェクトを用意しておいたので、それをひな形にしてプログラムの作成を始めるのが 楽かもしれない(C版, C++版)。
亀場との通信にはWinsock2のライブラリーが必要
VisualStudioでは、プロジェクトを作成した際に、プロジェクトメニューの「**のプロパティー」選び、「構成プロパティー」→「リンカー」→「入力」の項目の先頭「追加の依存ファイル」にws2_32.lib
を必ず追加しておく。
5. Java, Ruby, Pythonでの使い方
まだ少ないですが・・・
Java
Javaを使って亀場にアクセスする方法は、別ページにまとめたので、こちらを参照。
Ruby
スクリプト系の言語としてあちこちでよく使われているRubyを用いても亀場を操作することができる。 準備としてturtle.rbを作業用のディレクトリにコピーしておく。 そして、エディタでプログラムを書く。 上記の四角形の例は、以下のようになる:
require './turtle.rb' ttl = Turtle.new("localhost") ttl.clr ttl.rst ttl.pd ttl.fd(100) ttl.lt(90) ttl.fd(100) ttl.lt(90) ttl.fd(100) ttl.lt(90) ttl.fd(100)
亀場を使う際は、プログラムの頭のところにrequire './turtle.rb'
の行を忘れずに記入する。
このプログラムを、例えばファイル square.rb に保存したとすると、実行するには(もちろん亀場サーバーが動いている状態で)、 コマンドラインから
ruby square.rb
を実行すればよい。
もう少し凝った例として、ペンローズ・タイルを描くサンプルも用意しておいた。お試しあれ。
Python用APIの説明
Python用サンプル集
turtle.py
turtle3.py (Python 3用)
Python
前述のRubyと同じスクリプト言語のPythonは、科学技術分野の各方面でも普及しつつある。 Pythonで亀場を操るには、まず、ファイル turtle.py をダウンロードし(Python 3の場合はturtle3.py)、 ソースコードと同じ場所に保存しておく。 次いで、Pythonコードの先頭でTurtleクラスをimportする。四角形の例題は以下のようになる:
from turtle import Turtle ttl = Turtle("localhost") ttl.clr() ttl.rst() ttl.pd() ttl.fd(100) ttl.lt(90) ttl.fd(100) ttl.lt(90) ttl.fd(100) ttl.lt(90) ttl.fd(100)
† Python 3の場合は、先頭箇所をfrom turtle3 import Turtle
と変更のこと。
詳しくはPythonのコーディング例やPython用APIの説明を参照のこと。