天天看点

MidpointFindingKarel奇偶数地图完美解决方法

/*
 * 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
}