本書の前半では、Java 言語について学習します。TurtleFrame クラスと Turtle クラスからなるタートルグラフィックスのライブラリをサポートページ からダウンロードして、それを用いて学習するので、new でオブジェクトを生 成し、メソッド呼び出しするという、オブジェクト指向の基本から演習が始ま ります。サンプルとして、幾つかの例題、および、練習問題を、applet に書き 換えました。start ボタンで開始します。また、Speed メニューで、スピードを 変えられます。

全ての例題と練習問題は、サポートページからダウンロードできます。ソース ファイルは、本書に掲載されているアプリケーションのものであり、このアプ レット自体のものではないことをご注意ください。


最初の例題

本書は、この例題から始まります。TurtleFrame オブジェクトを1つ、Turtue オブジェクトを2つ作成します。そして、TurtleFrame に Turtle を乗せてか ら、Turtle に、前に進めとか、右に向きを変えろといったメソッド呼び出しを します。
ソースファイル:
public class T21 {         
   public static void main(String[] args){
      TurtleFrame f;             // 変数 f の型宣言
      f =  new TurtleFrame();    // TurtleFrameを生成しfに代入
      Turtle m = new Turtle();   // Turtle を生成し,m の初期値として代入
      Turtle m1 = new Turtle();  // もう一つ生成し,m1 の初期値として代入
      f.add(m);                  // f に m を追加
      f.add(m1);                 // f に m1 を追加
      m.fd(100);                 // m よ前に 100 進め
      m.rt(90);                  // m よ右に 90 度回れ
      m.fd(150);                 // m よ前に 150 進め
      m1.rt(90);                 // m1 よ右に 90 度回れ
      m1.fd(100);                // m1 よ前に 150 進め
   }
}   

繰り返しのネスト

正 n 多角形を回転させながら r 枚描画することにより、きれいな図形を描く ことができます。n と r をいろいろ変えてみてください。このライブラリで、 回転の角度は整数にしているので、n と r は360 の約数にしてください。
ソースファイル:
public class P46 {
   public static void main(String[] args){
      int n = 4, r = 7;
      TurtleFrame f = new TurtleFrame();
      Turtle m = new Turtle();
      f.add(m);
      for(int j = 0; j < r; j++){
         for(int i = 0; i < n; i++){
            m.fd(50);
            m.rt(360/n);
         }
         m.rt(360/r);
      }
   }
}


クラス定義

Java では、すでに存在するクラスを拡張する形でクラスの定義を行います。 Turtle クラスを拡張して、多角形を描くメソッド polygon と、家の絵を描く メソッド house を持つ HTurtle クラスを定義しましょう。
ソースファイル:
public class HTurtle extends Turtle {    //Turtle を拡張する 
   public void polygon(int n, int s){   //polygonメソッドの定義 
      int a = 360/n;                     //曲がる角度を求めておく 
      for(int j = 0; j < n; j++){        //n 回繰り返す 
         fd(s);                           //s 前に進んで
         rt(a);                           //a 曲がるのを
      }
   }
   public void house(int s){   //house メソッドの定義
      polygon(4,s);                      //polygon を利用
      fd(s); rt(30);
      polygon(3,s);
      lt(30); bk(s);                     //元の場所に戻しておく
   }
}
public class T71 {
   public static void main(String[] args){
      TurtleFrame f = new TurtleFrame();
      HTurtle m = new HTurtle();
      int s = 50;
      f.add(m);   
      m.house(s); 
      m.up(); m.lt(90); m.fd(50); m.rt(72); m.down();
      m.polygon(5, s / 2); 
      m.up(); m.moveTo(100,100,0); m.down();
      m.polygon(10, s / 5);
   }
}


オーバーライド

サブクラスでは、すでに存在するクラスを拡張するだけでなく、そのメソッド を再定義(オーバーライド)することができます。この例では、Turtle の持つ fd をオーバーライドして、fd が呼ばれると点線を描画する Tensen クラスを 定義しています。polygon の呼び出しの中の fd まで、点線で描かれているこ とに注意してください。このように、オブジェクト指向では、メソッド名とメ ソッドの実体の対応は、実行時に決まります(動的結合)。メソッド定義を、 新しくメソッドを定義する場合とオーバーライドに分けて説明しているのは、 本書の特徴の一つです。
ソースファイル:
public class Tensen extends HTurtle{
   int psize = 10;
   public void fd(int s){
      int k, len;
      for(k = 0, len = 0 ; len + psize <= s; k++, len+= psize){
         if(k % 2 == 0) down(); else  up();
         super.fd(psize);   
      }
      down();               
      super.fd(s - len);    
   }
   public static void main(String[] args){
      TurtleFrame f = new TurtleFrame();
      Tensen m = new Tensen();
      f.add(m);
      m.fd(100);  
      m.rt(90);
      m.up(); m.fd(100); m.down();
      m.lt(90);
      m.polygon(5, 50);
   }
}


マルチスレッド

Java 言語には、マルチスレッドの機能があり、複数の"処理の流れ" を同時に 走らせることができます。この教科書では、Turtle を用いて、マルチスレッド やスレッド間の同期をとるプログラミングの説明を行っています。
ソースファイル:
import java.awt.Color;
public class MPolygon extends HTurtle implements Runnable{
   int n, s;
   MPolygon(int x, int y, int a, int n, int s){
      super(x, y, a);
      this.n = n;   this.s = s;
   }
   public void run(){
      polygon(n,s);
   }
   public static void main(String[] args){
      TurtleFrame f = new TurtleFrame();
      MPolygon m = new MPolygon(200,200,0, 10,50);  f.add(m);
      MPolygon m1 = new MPolygon(100,200,0, 5,50);  f.add(m1); 
      m1.setColor(new Color(255,0,0)); 
      m1.speed(5);                     
      Thread t = new Thread(m);
      Thread t1 = new Thread(m1);
      t.start();  
      t1.start(); 
      System.out.println("Main メソッドは終了する。");  
   }
}


Turtle in Turtle

Java 言語の配列は、C 言語などと比べて、柔軟性が高いです。 これを用いると、(x1, y1), (x2, y2),...,(xn, yn) という点列は、 int[]{x1, y1, x2, y2,...,xn, yn} と配列で表記できます。 Turtle クラスでは、int の配列の配列としてタートルの形状を定義しています。こ の練習問題では、int の配列の配列として与えられた線画の形状を描画するプ ログラムを作成して、Turtle の形状を Turtle に描かせることを行います。そ れを用いて、亀の絵として描かれていたものが最後に動き出し、亀の絵を描い ていた Turtle が絵の中に埋没していくという、エッシャー風のプログラムを作って 遊んでみました。