n public class T 61 public static void
n角形の描き方を知っている タートルがいたら・・・ public class T 61 { public static void main(String[] args){ Turtle. Frame f = new Turtle. Frame( ); House m = new House( ); int s = 50; f. add(m); m. house(s); m. up( ); m. fd(s * 2); m. down( ); m. polygon(3, s / 2); m. up( ); m. fd(s); m. down( ); m. polygon(10, s / 5); } } House・・・Turtleの かわりのクラス名 Turtleオブジェクトと 同じように使える Turtleにはない メソッドもある 9 計算機プログラミングI (増原) 2003年度
6. 4 インスタンス変数 public class Stepper extends public Turtle{ class T 62{ 自分がいま public int n; public static void main(String[] args){ • 何角形を描いているのか Turtle. Frame f = new Turtle. Frame(); public int size; • 1辺の長さ Stepper m 1 = new Stepper(); f. add(m 1); private int j = 0; Stepper m 2 = =new f. add(m 2); • 何番目の辺を描いているのか public static final int ALREADY_FIN 0; Stepper(); m 1. n = 4; = 100; public static final int JUST_FIN = 1; m 1. sizeを覚える m 2. n = =3; 2; m 2. size = 100; public static final int NOT_FIN. . . public int step() • ローカル変数と同様に { • 値をとり出す if(j >= n) • 値をしまう return ALREADY_FIN; ことができる fd(size); rt(360/n); j=j+1; • オブジェクトごとに用意される if(++j == n) if(j==n). . . → 前回のメソッド実行時に return JUST_FIN; しまわれた値が と同じ return NOT_FIN; そのまま残っている } public void reset() { j = 0; } 15 計算機プログラミングI (増原) 2003年度 }
コンストラクタの実例 コンストラクタの 定義 public class Stepper extends Turtle{ public int n; public int size; private int j = 0; Stepper(int x, int y, int angle, int n, int size) { Stepper super(x, y, y, angle); this. n = n; this. size = size; } . . . public int step() { if(j >= n) return ALREADY_FIN; . . . Stepper[] hm = new Stepper[10]; for(int i = 0 ; i < 10; i++){ } hm[i] = new Stepper(i * hm[i]. set. Color(c[i % c. length]); f. add(hm[i]); 1. Stepperオブジェクトが作られる 2. コンストラクタが実行される 計算機プログラミングI (増原) 2003年度 親クラスの コンストラクタを実行. . . new Turtle(x, y, angle) のときと同様 50 + 25, 150, 0, n[i], size[i]); 17
親クラスから 継承したpolygonを 実行 点線で多角形を描く public class Tensen extends House{ public class House 再定義された int psize = 4; extends Turtle { fdが実行 (略: コンストラクタ) public void polygon(int n, int s){ public void fd(int s){ int a = 360/n; 長さsの点線を描く for(int j = 0; j < n; j++){ } fd(s); ここから rt(a); 自身のfdを スタート public static void main(…){ } 呼び出し (略: Turtle. Frameの生成) } オブジェクト Tensen m = new Tensen(); } を作る (略) メソッド m. polygon(5, 50); Tensen 呼び出し } } polygon fd 21 計算機プログラミングI (増原) 2003年度
点線で多角形を描く public class Tensen extends House{ 再定義された int psize = 4; fdが実行 (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } } public static void main(…){ (略: Turtle. Frameの生成) Tensen m = new Tensen(); (略) m. polygon(5, 50); } public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } } } Ten 結果: 点線で 5角形が描かれる 22 計算機プログラミングI (増原) 2003年度
点線を描くしくみ public class Tensen extends House{ int psize = 4; (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } ? } public static void main(…){ (略: Turtle. Frameの生成) Tensen m = new Tensen(); (略) m. polygon(5, 50); } public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } } } 25 計算機プログラミングI (増原) 2003年度
点線を描くしくみ public class Tensen extends House{ int psize = 4; (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } public void fd(int s){ } public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); int k, len; public static voidfor(k main(…){ = 0, len = 0 ; len + }psize <= s; k++, len+= psize){ (略: Turtle. Frameの生成) if(k % 2 == 0) down(); }else up(); Tensen m = new Tensen(); super. fd(psize); } (略) ペンを交互に上げ } m. polygon(5, 50); down(); 下ろししながら、 } } super. fd(s - len); psizeづつ前進する super. メソッド名(引数式, …) 親クラスのメソッドを呼び出す 26 計算機プログラミングI (増原) 2003年度
クラスの設計――Turtleクラスの解剖 public class Turtle{ public Color kame. Color = Color. green; Turtle. Panel f; // 表示面画 double angle; // 角度 double x, y; // 位置 double dx, dy; // sin(a), -cos(a) boolean pen. Down; // ペン状態 Color c = Color. black; // ペンの色 //コンストラクタ public Turtle(int x, int y, int ia) { this. x = ((double)x + 0. 5); this. y = ((double)y + 0. 5); setangle((double)ia *Math. PI/180. 0); pen. Down = true; } //インスタンスメソッド public void fd(int n) { double xx = x; double yy = y; x = xx + dx * n; y = xx + dy * n; if (pen. Down) { f. add. Line. Element((int)xx, (int)yy, (int)x, (int)y, c); } kame. Show(move. Wait); } … } 30 計算機プログラミングI (増原) 2003年度
- Slides: 30