You are asked to create a class called Jumper. This actor can move forward two cells in each move. It “jumps” over rocks and flowers. It does not leave anything behind it when it jumps.
-
Inception: clarify the details of the problem:
a. What will a jumper do if the location in front of it is empty, but the location two cells in front contains a flower or a rock?
jumper 只向前移动 1 格。
public void move() { ... Location loc = getLocation(); /* * get location in front */ Location next = loc.getAdjacentLocation(getDirection()); /* * get location 2 cells in front */ Location next2 = next.getAdjacentLocation(getDirection()); ... Actor neighbor2 = gr.get(next2); /* * if location next2 is empty * move to next2 */ if(neighbor2 == null) moveTo(next2); /* * if location next2 is occupied but jumper can move * which means next location must be empty * move to next location */ else moveTo(next); ... }
b. What will a jumper do if the location two cells in front of the jumper is out of the grid?
检查 jumper 前 1 格是否在 grid 中、是否为空,若是,jumper 只向前移动 1 格;否则,调用
removeSelfFromGrid
方法将 jumper 从 grid 中移除。public void move() { ... /* * if location 2 cells in front is valid * which means next location must be valid */ if (gr.isValid(next2)) { ... } else if (gr.isValid(next)) moveTo(next); else removeSelfFromGrid(); ... }
c. What will a jumper do if it is facing an edge of the grid?
jumper 顺时针旋转 45 度。
/** * Moves if it can move, turns otherwise. */ public void act() { if (canMove()) move(); else turn(); } public boolean canMove() { ... // if jumper is facing an edge of the grid if (!gr.isValid(next)) return false; ... }
d. What will a jumper do if another actor (not a flower or a rock) is in the cell that is two cells in front of the jumper?
-
若 jumper 前 1 格为空,与 a 相同,jumper 只向前移动 1 格;
public void move() { ... Actor neighbor2 = gr.get(next2); /* * if location next2 is empty * move to next2 */ if(neighbor2 == null) moveTo(next2); /* * if location next2 is occupied but jumper can move * which means next location must be empty * move to next location */ else moveTo(next); ... }
-
若 jumper 前 1 格被占领,与 c 相似,jumper 转向。
public boolean canMove() { ... Actor neighbor2 = gr.get(next2); /* * if the location two cells in front of the jumper is occupied * check if next location is empty */ if(neighbor2 != null) { return (neighbor == null); } ... }
e. What will a jumper do if it encounters another jumper in its path?
jumper 顺时针旋转 45 度。
public boolean canMove() { ... if(neighbor2 != null) { return (neighbor == null); } else { /* * if next location occupied by an Actor, turn * else jump */ if(neighbor != null && neighbor instanceof Jumper) { return false; } return true; } }
f. Are there any other tests the jumper needs to make?
无。
-