package j2.lesson05;
/**
* 課題1804 - 解答例.
* 足跡を残せる{@link Turtle}.
* @author arakawa
* @version $Id: TrackTurtle_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
*/
public class TrackTurtle extends Turtle {
private static final int X_SIZE = 15;
private static final int Y_SIZE = 15;
private static final int X_START = 7;
private static final int Y_START = 7;
/** 足跡の情報. */
private final boolean track[][];
/** 足跡を残すかどうかの設定. */
private boolean trackable;
/**
* 足跡を残せる亀インスタンスを作成する。
* 初期状態では、足跡は残さない。
* また、足跡を残せる領域は<code>15*15</code>の領域として、開始位置は<code>(7, 7)</code>とする。
*/
public TrackTurtle() {
super();
this.track = new boolean[Y_SIZE][X_SIZE];
this.trackable = false;
}
/**
* 現在向いている方向に移動する。
* その際、足跡を残す設定ならば、この操作によって移動する前の位置に足跡を残す。
* ただし、足跡を残せる領域から外れていた場合は単に移動する。
* @return 自分自身
*/
public Turtle move() {
if (isTrackable()) {
int x = X_START + getX();
int y = Y_START - getY();
if (0 <= x && x < X_SIZE && 0 <= y && y < Y_SIZE) {
this.track[y][x] = true;
}
}
return super.move();
}
/**
* 足跡を残すかどうかを設定する。
* @param b <code>true</code> ならば足跡を残す設定にする
*/
public void setTrackable(boolean b) {
this.trackable = b;
}
/**
* 足跡を残すかどうか調べる。
* @return 足跡を残す設定ならば <code>true</code>
*/
public boolean isTrackable() {
return this.trackable;
}
/**
* 現在の足跡情報を表示する。
* 足跡を残す設定で移動を行った場合、その位置に足跡が残る。
* 足跡が残っている場所には"@"を表示し、残っていない場所には" "(半角スペース)を表示する。
*
*/
public void show() {
for (int y = 0; y < this.track.length; y++) {
for (int x = 0; x < this.track[y].length; x++) {
if (this.track[y][x]) {
System.out.print("@");
}
else {
System.out.print(" ");
}
}
System.out.println();
}
}
/**
* テストプログラム
* @param args 無視される
*/
public static void main(String[] args) {
// TrackTurtle turtle = new TrackTurtle();
//
// // 北西へ
// turtle.move().move().move().move().move().move().move();
// turtle.turnLeft().move().move().move().move().move().move().move();
//
// turtle.setTrackable(true);
//
// turtle.turnLeft().turnLeft();
//
// // 上から下へ
// for (int y = 0; y < 15; y++) {
// // 左から右へ
// for (int x = 0; x < 15; x++) {
// // 現在位置の x + y が偶数なら書き込む
// turtle.setTrackable((x + y) % 2 == 0);
// turtle.move();
// }
// // 左へ帰る
// turtle.setTrackable(false);
// turtle.turnLeft().turnLeft();
// for (int x = 0; x < 15; x++) {
// turtle.move();
// }
// // 一歩下へ
// turtle.turnLeft().move();
//
// // 東を向く
// turtle.turnLeft();
// }
//
// turtle.show();
}
}
|