BeeperCollectingProgram (KarelOOP2)
Retired DISLab
(버전 사이의 차이)
(새 문서: == Version 1 == <source lang="java"> package cp.java.week.ex3a; import hufs.dislab.karel.IKarel; import hufs.dislab.karel.IKarelProgram; import hufs.dislab.karel.SimpleKarel; /** *...) |
|||
105번째 줄: | 105번째 줄: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | |||
<source lang="java"> | <source lang="java"> | ||
186번째 줄: | 188번째 줄: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | |||
<source lang="java"> | <source lang="java"> |
2020년 10월 20일 (화) 17:45 현재 판
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(); } }