SimpleKarel (KarelOOP2)
Retired DISLab
/* * 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; }