CollisionProgram (KarelOOP2)

Retired DISLab
Swpark (토론 | 기여) 사용자의 2020년 10월 20일 (화) 23:19 버전
(비교) ← 이전 판 | 현재 판 (비교) | 다음 판 → (비교)
이동: 둘러보기, 찾기
/*
 * Copyright 2020 Sangwon Park @ DISLab, HUFS
 * 
 * 이 예제는 Karel에서 발생하는 ErrorException을 받아서 사용자가 정의한
 * KarelCollisionException을 재발생하게 하는 것이다.
 * 두 개의 캐럴이 부딪히면 오류가 난다. 이미 차지하고 있던 공간을 차지하려고
 * 하면 안된다. 시작할 때 그런 상황을 만든다.
 * 기본적으로 있는 캐럴은 (1, 1)의 좌표에 동쪽으로 있는데,
 * 새로 생성한 캐럴은 (1, 2)의 좌표에 서쪽으로 있다.
 * 이때 두 번째 캐럴을 전진(move)시키면 기본 캐럴과 부딪히게 되고
 * 이때 ErrorException이 발생한다.
 */
package cp.java.week11.exception;
 
import java.awt.Point;
 
import acm.util.ErrorException;
import hufs.dislab.karel.IKarel;
import hufs.dislab.karel.IKarelProgram;
import hufs.dislab.karel.SimpleKarel;
 
@SuppressWarnings("serial")
class KarelCollisionException extends Exception {
	int x, y;
 
	public KarelCollisionException(int x, int y) {
		this.x = x;
		this.y = y;
	}
 
	public String toString() {
		return "Collision at " + x + ", " + y;
	}
}
 
@SuppressWarnings("serial")
public class CollisionProgram extends IKarelProgram {
	IKarel karel;
 
	@Override
	protected void onInit() {
		karel = new SimpleKarel();
		addIKarel(karel, 2, 1, WEST, 0);
	}
 
	@Override
	protected void onStart() {
		try {
			doSomething();
		} catch (KarelCollisionException e) {
			e.printStackTrace();
			karel.paintCorner(RED);
			karel.turnLeft();
		}
 
	}
 
	public void doSomething() throws KarelCollisionException {
		try {
			karel.move();
		} catch (ErrorException e) {
			if (karel.frontIsClear()) {
				Point pt = karel.getLocation();
				throw new KarelCollisionException(pt.x, pt.y);
			} else {
				throw e;
			}
		}
	}
 
	public static void main(String[] args) {
		IKarelProgram.main(args, new SimpleKarel());
	}
}
개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기