解答例 - j2.lesson05.TrackTurtle

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 (<= x && x < X_SIZE && <= y && y < Y_SIZE) {
                this.track[y][xtrue;
            }
        }
        return super.move();
    }
 
    /**
     * 足跡を残すかどうかを設定する。
     @param <code>true</code> ならば足跡を残す設定にする
     */
    public void setTrackable(boolean b) {
        this.trackable = b;
    }
    
    /**
     * 足跡を残すかどうか調べる。
     @return 足跡を残す設定ならば <code>true</code>
     */
    public boolean isTrackable() {
        return this.trackable;
    }
    
    /**
     * 現在の足跡情報を表示する。
     * 足跡を残す設定で移動を行った場合、その位置に足跡が残る。
     * 足跡が残っている場所には&quot;@&quot;を表示し、残っていない場所には&quot; &quot;(半角スペース)を表示する。
     *
     */
    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();
    }
}