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