Why do the wombats run in circles continuously after eating the leaves?


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | import greenfoot.*; // (World, Actor, GreenfootImage, and Greenfoot) /** * Wombat. A Wombat moves forward until it hits the edge of the world, at * which point it turns left. If a wombat finds a leaf, it eats it. * * @author Michael Kölling * @version 2.0 */ public class Wombat extends Actor { private int leavesEaten; public Wombat() { leavesEaten = 0 ; } /** * Do whatever the wombat likes to to just now. */ public void act() { if (foundLeaf()) { eatLeaf(); } else if (canMove()) { move(); } else { turnLeft(); } } /** * Move one step forward. */ public void move() { move( 1 ); } /** * Turn left by 90 degrees. */ public void turnLeft() { turn(- 90 ); } /** * Check whether there is a leaf in the same cell as we are. * Return true, if there is, false otherwise. */ public boolean foundLeaf() { Actor leaf = getOneObjectAtOffset( 0 , 0 , Leaf. class ); return leaf != null ; } /** * Eat a leaf (if there is one in our cell). */ public void eatLeaf() { Actor leaf = getOneObjectAtOffset( 0 , 0 , Leaf. class ); if (leaf != null ) { // eat the leaf... getWorld().removeObject(leaf); leavesEaten = leavesEaten + 1 ; } } /** * Set the direction we're facing. The 'direction' parameter must * be in the range [0..3]. */ public void setDirection( int direction) { if ((direction >= 0 ) && (direction <= 3 )) { setRotation(direction * 90 ); } } /** * Test if we can move forward. Return true if we can, false otherwise. */ public boolean canMove() { int rotation = getRotation(); int x = getX(); int y = getY(); boolean facingEdge = false ; switch (rotation) { case 0 : facingEdge = (x == getWorld().getWidth() - 1 ); break ; case 90 : facingEdge = (y == getWorld().getHeight() - 1 ); break ; case 180 : facingEdge = (x == 0 ); break ; case 270 : facingEdge = (y == 0 ); break ; } return !facingEdge; } /** * Tell how many leaves we have eaten. */ public int getLeavesEaten() { return leavesEaten; } } |