SimpleKarel (KarelOOP2)

Retired DISLab
Swpark (토론 | 기여) 사용자의 2020년 10월 20일 (화) 17:20 버전
(비교) ← 이전 판 | 현재 판 (비교) | 다음 판 → (비교)
이동: 둘러보기, 찾기
/*
 * Copyright 2020 Sangwon Park @ DISLab, HUFS
 */
package hufs.dislab.karel;
 
import java.awt.Color;
import java.awt.Point;
 
import stanford.karel.AbstractIKarel;
import stanford.karel.AbstractIKarelProgram;
 
/**
 * IKarel 인터페이스를 제공하는 기본 IKarel 클래스
 * @since KarelOOP2
 * @author Sangwon Park
 */
public class SimpleKarel extends AbstractIKarel implements IKarel {
 
	public SimpleKarel() {
	}
 
	/**
	 * 캐럴에 이름을 붙일 수 있다. 스레드 프로그래밍할 때 유용하다.
	 * @param name 캐럴의 이름
	 * @since KarelOOP2 (2020.10.8)
	 */
	public SimpleKarel(String name) {
		super(name);
	}
 
	/**
	 * 비퍼의 갯수를 지정하는 생성자이다.
	 * @param name 캐럴의 이름
	 * @param nBeepers 초기에 가지고 있는 비퍼의 갯수
	 * @since KarelOOP2
	 */
	public SimpleKarel(String name, int nBeepers) {
		this(name);
		setBeepersInBag(nBeepers);
	}
 
	/**
	 * 캐럴이 처음 나타날 좌표를 지정하는 생성자이다.
	 * @param name 캐럴의 이름
	 * @param x x 좌표
	 * @param y y 좌표
	 * @since KarelOOP2
	 */
	public SimpleKarel(String name, int x, int y) {
		this(name);
		setLocation(x, y);
	}
 
	/**
	 * 캐럴이 처음 나타날 좌표와 캐럴의 방향을 지정하는 생성자이다.
	 * @param name 캐럴의 이름
	 * @param x   x 좌표
	 * @param y   y 좌표
	 * @param dir 방향
	 * @since KarelOOP2
	 */
	public SimpleKarel(String name, int x, int y, int dir) {
		this(name, x, y);
		setDirection(dir);
	}
 
	/**
	 * 캐럴이 처음 나타날 좌표, 캐럴의 방향, 비퍼의 개수를 지정하는 생성자이다.
	 * @param name 캐럴의 이름
	 * @param x        x 좌표
	 * @param y        y 좌표
	 * @param dir      방향
	 * @param nBeepers 초기에 가지고 있는 비퍼의 갯수
	 * @since KarelOOP2
	 */
	public SimpleKarel(String name, int x, int y, int dir, int nBeepers) {
		this(name, x, y, dir);
		setBeepersInBag(nBeepers);
	}
 
	@Override
	public String toString() {
		Point pt = getLocation();
		int dir = this.getDirection();
		int no = this.getBeepersInBag();
		String str = "name=" + name + ",x=" + pt.x + ",y=" + pt.y + ",dir=" + dir + ",beepers=" + no
				+ ",move:" + noMove + ",turnLeft:" + noTurnLeft + ",turnRight:" + noTurnRight
				+ ",turnAround:" + noTurnAround + ",putBeeper:" + noPutBeeper + ",pickBeeper:"
				+ noPickBeeper;
		return str;
	}
 
	/**
	 * IKarel에 월드에 나타나면 불리는 메소드이다.
	 * @see AbstractIKarelProgram#add(IKarel karel)
	 */
	@Override
	public void onCreate() {
		super.onCreate();
	}
 
	/**
	 * 현재 위치에 색을 칠한다.
	 * @param color 색깔
	 * 
	 */
	@Override
	public void paintCorner(Color color) {
		super.paintCorner(color);
	}
 
	/**
	 * 현재 위치의 색깔을 반환한다.
	 * @since KarelOOP2
	 * @return 현재 위치의 색깔
	 */	
	@Override
	public Color getCornerColor() {
		return super.getCornerColor();
	}
 
	/**
	 * 현재 IKarel이 있는 좌표
	 * @since KarelOOP2
	 * @return 좌표
	 */
	@Override
	public Point getLocation() {
		return super.getLocation();
	}
 
	/**
	 * Karel을 한 칸 전진한다.
	 */
	@Override
	public void move() {
		noMove++;
		super.move();
	}
 
	/**
	 * steps 회수 만큼 이동한다.
	 * @param steps 이동할 걸음 수
	 * @return 실제 걸음 수. 벽이 있으면 더 이상 전진할 수 없으므로 
	 * 요청한 걸음 수와 실제 걸음 수는 다를 수 있다.
	 */
	/**
	 * steps 회수 만큼 이동한다.
	 * @param steps 이동할 걸음 수
	 * @return 실제 걸음 수. 벽이 있으면 더 이상 전진할 수 없으므로 
	 * 요청한 걸음 수와 실제 걸음 수는 다를 수 있다.
	 */
	@Override
	public int move(int steps) {
		int i = 0;
		for ( ; i < steps; i++) {
			if (!frontIsClear())
				break;
			move();
		}
		return i;
	}
 
	/**
	 * 반시계 방향으로 90도 회전한다.
	 */
	@Override
	public void turnLeft() {
		noTurnLeft++;
		super.turnLeft();
	}
 
	/**
	 * 반시계 방향으로 90도 회전한다.
	 */
	@Override
	public void turnRight() {
		noTurnRight++;
		super.turnRight();
	}
 
	/**
	 * 180도 회전한다.
	 */
	@Override
	public void turnAround() {
		noTurnAround++;
		super.turnAround();
	}
 
	/**
	 * 현재 위치에 Beeper이 있으면 주워서 가방에 담는다.
	 * 현재 위치에 Beeper가 없으면 에러 메시지를 출력하고 프로그램이 종료된다.
	 */
	@Override
	public void pickBeeper() {
		noPickBeeper++;
		super.pickBeeper();
	}
 
	/**
	 * 현재 위치에 Beeper를 하나 놓는다.
	 * Karel이 가지고 있는 Beeper가 하나도 없으면 에러 메시지를 출력하고 프로그램이 종료된다.
	 */
	@Override
	public void putBeeper() {
		noPutBeeper++;
		super.putBeeper();
	}
 
	/**
	 * 현재 위치에 비퍼가 있는지 확인한다.
	 * @return 현재 위치에 비퍼가 있으면 true, 없으면 false를 반환한다.
	 */
	@Override
	public boolean beepersPresent() {
		return super.beepersPresent();
	}
 
	/**
	 * Bag에 비퍼가 있는지 확인한다.
	 * @return 비퍼가 있으면 true, 없으면 false를 반환한다.
	 */
	@Override
	public boolean beepersInBag() {
		return super.beepersInBag();
	}
 
	/**
	 * 앞쪽에 벽이 없는지 확인한다.
	 * @return 앞쪽에 벽이 없으면 true, 있으면 false를 반환한다.
	 */
	@Override
	public boolean frontIsClear() {
		return super.frontIsClear();
	}
 
	/**
	 * 왼쪽에 벽이 없는지 확인한다.
	 * @return 왼쪽에 벽이 없으면 true, 있으면 false를 반환한다.
	 */
	@Override
	public boolean leftIsClear() {
		return super.leftIsClear();
	}
 
	/**
	 * 오른쪽에 벽이 없는지 확인한다.
	 * @return 오른쪽에 벽이 없으면 true, 있으면 false를 반환한다.
	 */
	@Override
	public boolean rightIsClear() {
		return super.rightIsClear();
	}
 
	/**
	 * Karel이 북쪽을 바라보고 있는지 확인다.
	 * @return Karel이 북쪽을 바라보고 있으면 true, 그렇지 않으면 false를 반환한다.
	 */
	@Override
	public boolean facingNorth() {
		return super.facingNorth();
	}
 
	/**
	 * Karel이 동쪽을 바라보고 있는지 확인다.
	 * @return Karel이 동쪽을 바라보고 있으면 true, 그렇지 않으면 false를 반환한다.
	 */
	@Override
	public boolean facingEast() {
		return super.facingEast();
	}
 
	/**
	 * Karel이 남쪽을 바라보고 있는지 확인다.
	 * @return Karel이 남쪽을 바라보고 있으면 true, 그렇지 않으면 false를 반환한다.
	 */
	@Override
	public boolean facingSouth() {
		return super.facingSouth();
	}
 
	/**
	 * Karel이 서쪽을 바라보고 있는지 확인다.
	 * @return Karel이 서쪽을 바라보고 있으면 true, 그렇지 않으면 false를 반환한다.
	 */
	@Override
	public boolean facingWest() {
		return super.facingWest();
	}
 
	private int noMove;
	private int noTurnLeft;
	private int noTurnRight;
	private int noTurnAround;
	private int noPickBeeper;
	private int noPutBeeper;
 
}
개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기