Skip to content

Instantly share code, notes, and snippets.

@mattbarackman
Created September 12, 2012 03:03
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattbarackman/3703993 to your computer and use it in GitHub Desktop.
Save mattbarackman/3703993 to your computer and use it in GitHub Desktop.
Solution to CS106A Assignment 1.3 - CheckerboardKarel
/*
* File: CheckerboardKarel.java
* ----------------------------
* The CheckerboardKarel class should draw a checkerboard using
* beepers, as described in Assignment 1. Karel will start in
* the bottom left-corner facing East and will place a beeper on
* its current location. It will start by going east, and snaking
* up the board, placing a beeper on every other square. It should
* be able to handle any size grid.
*
* Matt Barackman
* 9.3.2012
*/
import stanford.karel.*;
public class CheckerboardKarel extends SuperKarel {
/*METHOD: run()
*
*pre-condition:
*see above
*
*post-condition:
*completed checkerboard with Karel in either
*of the top two corners (the right side for grids with an odd
*number of rows, the left side for grids with an odd number
*of lines).
*
*Note: While this method does eventually complete the
*checkerboard, this bit of code really initializes Karel's
*motion starting with the bottom line.
*/
public void run(){
putBeeper();
completeEastLine();
}
/*
*METHOD: completeEastLine()
*
*pre-condition:
*Karel is facing East at the left-most square of a new line.
*
*post-condition
*Karel is either facing West on the next line
*up or program is finished.
*
*
*Note: completeEastLine and completeWestLine make use of
*mutual recursion to have Karel alternate rows to complete
*the checkerboard.
*/
private void completeEastLine(){
alternateToWall();
turnLeft();
if (frontIsClear()){
startNextLine();
turnLeft();
completeWestLine();
}
}
/*METHOD: completeWeestLine()
*
*pre-condition:
*Karel is facing West on a new line.
*
*post-condition:
*Karel is either facing East on the next line up or program
*is finished.
*/
private void completeWestLine(){
alternateToWall();
turnRight();
if (frontIsClear()){
startNextLine();
turnRight();
completeEastLine();
}
}
/*METHOD: startNextLine()
*
*pre-condition:
*Karel is at the end of a line facing the next row up and he may or may
*not be presently on a beeper.
*
*post-condition:
*Karel has now moved to the next row up and is still facing
*up. Karel has also placed a beeper on his current square
*if he wasn't on one before and hasn't placed one if he was
*on one before.
*/
private void startNextLine(){
if (beepersPresent()){
move();
}
else {
move();
putBeeper();
}
}
/*METHOD: alternateToWall()
*pre-condition:
*Karel is either facing East or West at the beginning of a
*new line.
*
*post-condition:
*Karel has now traversed the line and has in doing so has
*placed beepers on every other square.
*/
private void alternateToWall(){
while (frontIsClear()){
if (beepersPresent()){
move();
}
else {
move();
putBeeper();
}
}
}
}
@holmesmoon
Copy link

Excellent!

@ugitch
Copy link

ugitch commented May 29, 2016

Wonderful recursive solution..

@seanFromCapeTown
Copy link

Great, nice comments!

@ibtisamafzal
Copy link

from karel.stanfordkarel import *
"""
Karel should fill the whole world with beepers.
"""
def main():
run()
return_back()

def run():
put_beeper()
completeEastLine()

def completeEastLine():
alternateToWall()
turn_left()
if front_is_clear():
startNextLine()
turn_left()
completeWestLine()

def completeWestLine():
alternateToWall()
turn_right()
if front_is_clear():
startNextLine()
turn_right()
completeEastLine()

def startNextLine():
if beepers_present():
move()

else:
	move()
	put_beeper()

def alternateToWall():
while front_is_clear():
if beepers_present():
move()

	else:
		move()
		put_beeper()

def return_back():
turn_left()
turn_left()
while front_is_clear():
move()
turn_right()
while front_is_clear():
move()

turn_right()
turn_right()

def turn_right():
turn_left()
turn_left()
turn_left()

There is no need to edit code beyond this point

if name == 'main':
main()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment