Axel Werner's OPEN SOURCE Knowledge Base

Because Information Wants To Be Free!

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

it-artikel:my-solution-on-assignment-1-problem-4 [2009-10-10 06:02]
mail@awerner.homeip.net angelegt
it-artikel:my-solution-on-assignment-1-problem-4 [2009-10-10 06:12] (aktuell)
mail@awerner.homeip.net
Zeile 1: Zeile 1:
====== My Solution on Assignment 1 - Problem 4 ====== ====== My Solution on Assignment 1 - Problem 4 ======
 +This is my Solution of Assignment 1 - Problem 4 from the [[http://see.stanford.edu/see/courseinfo.aspx?coll=824a47e1-135f-4508-a5aa-866adcae1111|Computer Science Course CS106A of Prof. Mehran Sahami]] at the [[http://www.stanford.edu|STANDFORD University]].
 +
 +<code>
 +/*
 + * File: MidpointFindingKarel.java
 + * -------------------------------
 + * When you finish writing it, the MidpointFindingKarel class should
 + * leave a beeper on the corner closest to the center of 1st Street
 + * (or either of the two central corners if 1st Street has an even
 + * number of corners).  Karel can put down additional beepers as it
 + * looks for the midpoint, but must pick them up again before it
 + * stops.  The world may be of any size, but you are allowed to
 + * assume that it is at least as tall as it is wide.
 + */
 +
 +import stanford.karel.*;
 +
 +public class MidpointFindingKarel extends SuperKarel {
 +
 + public void run() {
 + /*
 + * Karel finds the middle (-+1) of the world and drops
 + * a beeper there.
 + */
 + checkWidth();
 + goMiddle();
 + putBeeper();
 + paintCorner(RED);
 +
 + while( beepersPresent() ) { // infinite loop (dance)
 + paintCorner(GREEN);
 + turnLeft();
 + paintCorner(RED);
 + turnLeft();
 + }
 + }
 +
 + private void checkWidth() {
 + /* this method lays a line of beepers to determine the width of his world
 + * then it stacks/stores the beepers at 1,1
 + *
 + * Pre-condition: Karel at 1,1 facing EAST
 + * no Beepers at all
 + *
 + * Post-condition: Karel at 1,1 facing EAST
 + * Width of World represented as a Stack of
 + * Beepers at 1,1
 + */
 +
 + drawLine();
 + collectBeepers();
 + }
 +
 +
 + private void drawLine() {
 + /* this method lays a line of beepers to determine the width of his world
 + *
 + * Pre-condition: Karel at 1:1 facing EAST
 + * no Beepers at all
 + * Post-condition: Karel infront of RIGHT WALL (x,1) facing EAST
 + * behind him a line of beepers
 + */
 + while( frontIsClear() ) {
 + putBeeper();
 + move();
 + }
 + putBeeper();
 + }
 +
 + private void collectBeepers() {
 + /* this method collects a line of beepers and stacks them
 + * at 1,1
 + *
 + * Pre-condition: Karel infront of RIGHT WALL (x,1) facing EAST
 + * behind him a line of beepers
 + *
 + * Post-condition: Karel at 1:1 facing EAST, sitting on a Stack of
 + * Beepers representing the WIDTH of his World
 + */
 + turnAround();
 + while( frontIsClear() ) {
 + while( beepersPresent() ) {
 + pickBeeper();
 + move();
 + putBeeper();
 + moveBack();
 + }
 + move();
 + }
 + turnAround();
 + }
 +
 + private void moveBack() {
 + /* moves karol ONE STEP back keeping direction heading
 + *
 + */
 + turnAround();
 + move();
 + turnAround();
 + }
 +
 +
 + private void goMiddle() {
 + /* this method moves karel (and the beepers left at his place) to the next
 + * position, taking 2 Beepers per Step.
 + *
 + * Pre-condition: Karel at 1,1 facing EAST
 + * X Beepers at 1,1
 + *
 + * Post-condition: Karel at x,1 (near middle) facing EAST
 + * no beepers left
 + */
 +
 + pickBeeper(); // off by one bug: need to walk x-1 steps
 +
 + while( beepersPresent() ) {
 + pickBeeper(); // take one beeper per Step
 + pushStack();
 + move();
 + if( beepersPresent() ) { // Still Beepers left?
 + pickBeeper(); // take one MORE beeper as charge/cost
 + }
 + }
 + }
 +
 +
 +
 + private void pushStack() {
 + /* this method moves the whole stack of beepers on karels actual
 + * position ONE STEP further keeping the direction.
 + *
 + * Pre-condition: Karel at x,1 facing EAST with
 + * X Beepers at his position.
 + *
 + * Post-condition: Karel at x+1,1 facing EAST with
 + * X-1 Beepers at his position.
 + */
 +
 + while( beepersPresent() ) {
 + pickBeeper(); // take one beeper as charge/cost
 + move();
 + putBeeper();
 + moveBack();
 + }
 + }
 +}
 +
 +</code>

Eigene Werkzeuge