/*
* 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(){
move();
//add move here &change the putBeeperXie to leave the last place alone
putBeepersXie();
turnRight();
//change to facing south
while(frontIsClear()){
move();
}
//move to the coner of right side
turnAround();
//change to facing north
putBeepersXie2andCheck();
while(notFacingWest()){
turnLeft();
}
//Check where is it facing
move();
dellOtherBeepers();
}
private void putBeepersXie(){
while(frontIsClear()){
turnLeft();
move();
putBeeper();
turnRight();
move();
//change m-t-m-p-t to t-m-p-t-m to leave the last place alone.
}
}
//from (1,1),put beepers in a line
private void putBeepersXie2andCheck(){
while(facingNorth()){
move();
if(beepersPresent()){
turnAround();
while(frontIsClear()){
move();
}
putBeeper();
turnRight();
move();
putBeeper();
}
else{
turnLeft();
move();
//if there is beeper on the way,copy to the line 1,and over putBeepersXie2andCheck,else go on.!!!double size
if(beepersPresent()){
turnLeft();
while(frontIsClear()){
move();
}
putBeeper();
}
else{
putBeeper();
turnRight();
}
//up one else go on,if there is beeper on the putBeeper place,copy to line 1,and over putBeepersXie2andCheck,else go on.!!!single size
}
}
}
//check beeper on the way Y/N(double size);check the beeper on the putBeeper Y/N(single size)
private void dellOtherBeepers(){
dellBeepersLine();
while(frontIsBlocked()){
while(facingWest()){
turnRight();
if(frontIsClear()){
move();
}
turnRight();
dellBeepersLine();
if(leftIsBlocked()){
turnLeft();
}
//stop the while in the end
}
while(facingEast()){
turnLeft();
if(frontIsClear()){
move();
}
turnLeft();
dellBeepersLine();
if(rightIsBlocked()){
turnRight();
}
//stop the while in the end
}
}
}
//dell all beepers except the mid one or two
private void dellBeepersLine(){
while(frontIsClear()){
move();
while(beepersPresent()){
pickBeeper();
}
}
}
//dell beepers in line
}