斯坦福大学公开课 编程方法学 Karel the Robot 寻找中点问题解决

斯坦福大学公开课的《 编程方法学》是学习Java很好的课程,课程开始是学习Karel,本文是作业MidpointFindingKarel的解决方案,运行结果如下:


思路是先确定方块的总数,然后将方块依次减半直到方块为1,即为找到中点。代码如下:

import stanford.karel.*;

public class MidpointFindingKarel extends SuperKarel {
	public void run() {
		createBeeperLine();
		collectAllBeeper();
		putBeeperToCentre();
	}

	private void createBeeperLine() {
		while (frontIsClear()) {
			putBeeper();
			move();
		}
		putBeeper();
	}

	private void collectAllBeeper() {
		while (frontIsBlocked() && facingEast()) {
			turnAround();
			move();
			while (frontIsClear()) {
				pickBeeperToBack();
				while (noBeepersPresent() && frontIsClear()) {
					move();
				}
			}
			pickBeeperToBack();
		}
		while (frontIsBlocked() && facingWest()) {
			turnAround();
			while (frontIsClear()) {
				move();
			}
		}
	}

	private void pickBeeperToBack() {
		while (beepersPresent() && facingWest()) {
			pickBeeper();
			turnAround();
			while (frontIsClear()) {
				move();
			}
			putBeeper();
		}
	}

	private void putBeeperToCentre() {
		while (beepersPresent()) {
			decreaseHalfBeeper();
			turnAround();
			move();
			turnAround();
		}
		putBeeper();
	}

	private void decreaseHalfBeeper() {
		while (beepersPresent() && facingEast()) {
			pickBeeper();
			turnAround();
			move();
			turnAround();
			move();
			if (beepersPresent()) {
				pickBeeper();
				turnAround();
				move();
				putBeeper();
				turnAround();
				move();
			}
		}
	}
}


发布了34 篇原创文章 · 获赞 12 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/hfrommane/article/details/51337733