This site requires JavaScript, please enable it in your browser!
Greenfoot back
Biscuits1
Biscuits1 wrote ...

2019/1/31

Wombats and Leaves Question

Biscuits1 Biscuits1

2019/1/31

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

2019/1/31

#
Biscuits1 wrote...
Why do the wombats run in circles continuously after eating the leaves?
You will need to show the Wombat class code that goes with this question.
Biscuits1 Biscuits1

2019/2/1

#
Here is my Wombat class code.
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;
    }
}
danpost danpost

2019/2/1

#
First, the act method will have the wombat do one of 3 things. In order, it will either (1) eat; (2) move or (3) turn (see lines 24 through 32). In order to move, the returned value of canMove must be true (lines 27 through 29, specifically). The canMove method returns true only if the wombat is not facing a wall. As previously mentioned, if the wombat does not move, it will turn (left, specifically). Therefore, once the wombat finds an edge, it will turn to move counter-clockwise along the edges of the world.
You need to login to post a reply.