解答例 - j2.lesson02.Turtle

package j2.lesson02;

/**
 * 課題1504 - 解答例.
 * 二次元座標上を動き回る亀を表すクラス.
 @author arakawa
 @version $Id: Turtle_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class Turtle {
    
    // 内部表現
    /** x 座標. */
    int x;

    /** y 座標. */
    int y;
    
    /**
     * 現在の向きを表す。
     <ul>
     <li> 0 - North </li>
     <li> 1 - East </li>
     <li> 2 - South </li>
     <li> 3 - West </li>
     </ul>
     */
    int direction;
    
    /**
     * Turtle インスタンスを生成する。
     * 初期値は (x,y)=(0,0), direction=North.
     */
    public Turtle() {
        this.x = 0;
        this.y = 0;
        this.direction = 0;
    }
    
    /**
     * 現在向いている方向に1だけ移動する。
     * つまり、以下のように移動する。
     <ul>
     <li> North を向いている → y 方向へ +1 移動する </li>
     <li> South を向いている → y 方向へ -1 移動する </li>
     <li> East を向いている → x 方向へ +1 移動する </li>
     <li> West を向いている → x 方向へ -1 移動する </li>
     </ul>
     @return 動作後の自分自身
     */
    public Turtle move() {
        switch(this.direction) {
            case 0:
                this.y++;
                break;
            case 1:
                this.x++;
                break;
            case 2:
                this.y--;
                break;
            case 3:
                this.x--;
                break;
            default:
                // do nothing
                break;
        }
        return this;
    }
    
    /**
     * 90度右へ向く。
     @return 動作後の自分自身
     */
    public Turtle turnRight() {
        // direction を 1 足す
        this.direction = (this.direction + 14;
        return this;
    }
    
    /**
     * 90度左へ向く。
     @return 動作後の自分自身
     */
    public Turtle turnLeft() {
        // direction を 1 引く
        this.direction = (this.direction + 34;
        return this;
    }
    
    /**
     * 現在位置を返す。
     @return 現在位置
     */
    public Point getCurrentPosition() {
        return new Point(this.x, this.y);
    }
    
    /**
     * テストプログラム。自由に作成してよい。
     @param args 無視される
     */
    public static void main(String[] args) {
        Turtle t = new Turtle();
        // そのまま 1 進む
        t.move();
        // 右を向いて 2 進む
        t.turnRight().move().move();
        // 左を向いて 2 進む
        t.turnLeft().move().move();
        Point p = t.getCurrentPosition();
        System.out.println("(" + p.x + ", " + p.y + ")");
    }
}