BeeperCollectingProgram (KarelOOP2)

Retired DISLab
Swpark (토론 | 기여) 사용자의 2020년 10월 20일 (화) 17:44 버전
(비교) ← 이전 판 | 현재 판 (비교) | 다음 판 → (비교)
이동: 둘러보기, 찾기

Version 1

package cp.java.week.ex3a;
 
import hufs.dislab.karel.IKarel;
import hufs.dislab.karel.IKarelProgram;
import hufs.dislab.karel.SimpleKarel;
 
/**
 * Top-Down 문제해결 방법 설명을 위한 예제<br/>
 * Karel 객체의 메소드와 외부 함수를 구분해서 설명<br/>
 * 외부 함수에 대한 개념, 인자 전달에 대한 설명 필요함
 */
@SuppressWarnings("serial")
public class BeeperCollectingProgram extends IKarelProgram {
	public void onStart() {
		IKarel karel = getIKarel();
 
		int noBeepers = collectAllBeepers(karel);
		dropAllBeepers(karel, noBeepers);
		returnHome(karel);
	}
 
	int collectAllBeepers(IKarel karel) {
		int sumOfBeepers = 0;
 
		while (karel.frontIsClear()) {
			sumOfBeepers += collectOneTower(karel);
			karel.move();
		}
		sumOfBeepers += collectOneTower(karel);
 
		return sumOfBeepers;
	}
 
	int collectOneTower(IKarel karel) {
		karel.turnLeft();
		int noOfBeepers = collectLineOfBeepers(karel);
		karel.turnAround();
		moveToWall(karel);
		karel.turnLeft();
 
		return noOfBeepers;
	}
 
	int collectLineOfBeepers(IKarel karel) {
		int noOfBeepers = 0;
 
		while (karel.beepersPresent()) {
			karel.pickBeeper();
			noOfBeepers++;
			if (karel.frontIsClear())
				karel.move();
		}
 
		return noOfBeepers;
	}
 
	void dropAllBeepers(IKarel karel, int no) {
		for(int i = 0; i < no; i++)
			karel.putBeeper();
	}
 
	void returnHome(IKarel karel) {
		karel.turnAround();
		moveToWall(karel);
		karel.turnAround();
	}
 
	void moveToWall(IKarel karel) {
		while (karel.frontIsClear())
			karel.move();
	}
 
	public static void main(String[] args) {
		IKarelProgram.main(args, new SimpleKarel());
	}
}

Version 2

package cp.java.week.ex3b;
 
import hufs.dislab.karel.IKarelProgram;
 
/**
 * 새로운 객체 생성 방법 설명(PowerKarel)<br/>
 * 내부적으로 가지고 있는 Beeper 개수를 헤아려야 하므로,
 * 이를 위한 변수 필요함
 */
@SuppressWarnings("serial")
public class BeeperCollectingProgram extends IKarelProgram {
	public void onStart() {
		PowerKarel karel = (PowerKarel) getIKarel();
 
		karel.collectAllBeepers();
		karel.dropAllBeepers();
		karel.returnHome();
	}
 
	public static void main(String[] args) {
		IKarelProgram.main(args, new PowerKarel());
	}
}
package cp.java.week.ex3b;
 
import hufs.dislab.karel.SimpleKarel;
 
/**
 * SuperKarel에 필요한 명령어를 추가하기 위하여 새로운 PowerKarel을 만듦.<br/>
 * collectAllBeepers, returnHome, dropAllBeepers 명령어 추가함.
 * @author Sangwon Park
 * @since 2020. 9. 11
 */
public class PowerKarel extends SimpleKarel {
 
	private int noBeepers = 0;
 
	public void collectAllBeepers() {
		while (frontIsClear()) {
			collectOneTower();
			move();
		}
	}
 
	void collectOneTower() {
		turnLeft();
		collectLineOfBeepers();
		turnAround();
		moveToWall();
		turnLeft();
	}
 
	void collectLineOfBeepers() {
		while (beepersPresent()) {
			pickBeeper();
			noBeepers++;
			if (frontIsClear())
				move();
		}
 
	}
 
	public void dropAllBeepers() {
		for( ; noBeepers > 0; noBeepers--)
			putBeeper();
	}
 
	public void returnHome() {
		turnAround();
		moveToWall();
		turnAround();
	}
 
	void moveToWall() {
		while (frontIsClear())
			move();
	}
}


Version 3

package cp.java.week.ex3c;
 
import hufs.dislab.karel.IKarelProgram;
 
@SuppressWarnings("serial")
public class BeeperCollecingProgram extends IKarelProgram {
	public void onStart() {
		CountKarel karel = (CountKarel)getIKarel();
 
		karel.collectAllBeepers();
		karel.dropAllBeepers();
		karel.returnHome();
	}
 
	public static void main(String[] args) {
		IKarelProgram.main(args, new CountKarel());
	}
}
package cp.java.week.ex3c;
 
import hufs.dislab.karel.SimpleKarel;
 
/**
 * Overriding을 배우기 위하여 만든 클래스<br/>
 * putBeeper, pickBeeper, beppersInBag을 오버라이딩 하였음.
 * @author 박상원 sangwon.park@hufs.ac.kr
 * @since 2020. 9. 11
 * @version 1
 */
public class CountKarel extends SimpleKarel {
 
	private int noBeepers = 0;
 
	public void putBeeper() {
		super.putBeeper();
		noBeepers--;
	}
 
	public void pickBeeper() {
		super.pickBeeper();
		noBeepers++;
	}
 
	public boolean beepersInBag() {
		return noBeepers > 0;
	}
 
	public void collectAllBeepers() {
		while (frontIsClear()) {
			collectOneTower();
			move();
		}
	}
 
	void collectOneTower() {
		turnLeft();
		collectLineOfBeepers();
		turnAround();
		moveToWall();
		turnLeft();
	}
 
	void collectLineOfBeepers() {
		while (beepersPresent()) {
			pickBeeper();
			if (frontIsClear())
				move();
		}
 
	}
 
	public void dropAllBeepers() {
		while(beepersInBag())
			putBeeper();
	}
 
	public void returnHome() {
		turnAround();
		moveToWall();
		turnAround();
	}
 
	void moveToWall() {
		while (frontIsClear())
			move();
	}
}
개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기