Turtle

import {Point} from './Point.js';

/**
 * Turtle
 * ------
 * ```
 * new Turtle(pos, dir, blockFunc)
 * ```
 * always turns right when blocked.
 * 
 * ### Properties
 * - turtle.position: Point
 * - turtle.direction: Point
 * - turtle.isInDeadEnd: Bool
 * - turtle.isBlocked (getter)
 * 
 * ### Methods
 * - turtle.isBlockedAt(x,y)
 * - turtle.turnRight()
 * - turtle.forward()
 */
export class Turtle {

    /**
     * x-axis: โ†“, y-axis: โž
     * @param {Point} position - Point(x,y): turtle's starting position
     * @param {Point} direction - Point(x,y): turtle's moving direction
     * @param {function} isBlockedAt - isBlockedAt(x, y): Bool
     */
    constructor(position, direction, isBlockedAt){
        this.position = position;	// turtle starting position
		this.direction = direction;	// moving dir

        this.isBlockedAt = isBlockedAt;
        this.isInDeadEnd = false;
    }

    // turtle.turnRight()
    turnRight(){
        this.direction.turnRight();
        return this;                // for chaining
    }

    // turtle.isBlocked
    get isBlocked(){
        const {x, y} = this.position;
        const {x:u, y:v} = this.direction;
		return this.isBlockedAt(x+u, y+v);
    }

    // turtle.forward()
	forward(){

        const originalDir = this.direction.copy();

		while (this.isBlocked) {
            this.turnRight();
            if(this.direction.isEqual(originalDir)){
                this.isInDeadEnd = true;
                break;
            }
        };

        if (!this.isInDeadEnd) {
            this.position = this.position.add(this.direction);
        }
		
	}

}

Last updated