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

2026/7/9

testing

hafizz.hnn hafizz.hnn

2026/7/9

#
import greenfoot.*; public class MyWorld extends World { public MyWorld() { super(800, 600, 1); // Spawn 50 orang normal for (int i = 0; i < 50; i++) { addObject( new People(), Greenfoot.getRandomNumber(getWidth()), Greenfoot.getRandomNumber(getHeight()) ); } // Spawn 1 orang infected secara random People infected = new People(); infected.setInfected(true); addObject(infected,Greenfoot.getRandomNumber(getWidth()),Greenfoot.getRandomNumber(getHeight())); // Spawn ambulance addObject(new Ambulance(), 0, 0); } } ============================================= import greenfoot.*; public class Ambulance extends Actor { private int speed = 5; private int stepDown = 30; private boolean movingRight = true; public void act() { moveZigZag(); healPeople(); } private void moveZigZag() { if (movingRight) { setLocation(getX() + speed, getY()); if (getX() >= getWorld().getWidth() - 1) { movingRight = false; setLocation(getX(), getY() + stepDown); } } else { setLocation(getX() - speed, getY()); if (getX() <= 0) { movingRight = true; setLocation(getX(), getY() + stepDown); } } // Jika sudah mencapai bawah, kembali ke atas if (getY() >= getWorld().getHeight() - 1) { setLocation(getX(), 0); } } private void healPeople() { People p = (People)getOneIntersectingObject(People.class); if (p != null && p.isInfected()) { p.setInfected(false); } } } ===================================================== import greenfoot.*; import java.util.List; public class People extends Actor { private boolean infected = false; private boolean immune = false; private int infectionTimer = 0; public People() { updateImage(); } public void act() { randomMove(); if (infected) { spreadInfection(); infectionTimer++; if (infectionTimer >= 200) { setImmune(true); } } } // Gerak random private void randomMove() { move(4); if (Greenfoot.getRandomNumber(100) < 20) { turn(Greenfoot.getRandomNumber(61) - 30); } if (isAtEdge()) { turn(180); } } // Menularkan ke orang yang disentuh private void spreadInfection() { List<People> people = getIntersectingObjects(People.class); for (People p : people) { if (p != this && !p.isImmune() && !p.isInfected()) { p.setInfected(true); } } } // Mengubah status infected public void setInfected(boolean status) { if (immune) return; infected = status; if (infected) { infectionTimer = 0; } else { infectionTimer = 0; } updateImage(); } public boolean isInfected() { return infected; } // Mengubah menjadi immune public void setImmune(boolean status) { immune = status; if (immune) { infected = false; infectionTimer = 0; } updateImage(); } public boolean isImmune() { return immune; } // Mengganti gambar sesuai status private void updateImage() { if (immune) { setImage("immune.png"); } else if (infected) { setImage("infected.png"); } else { setImage("normal.png"); } } }
danpost danpost

2026/7/15

#
hafizz.hnn wrote...
<< Code Omitted >>
You can reduce the number of fields needed for the infectious state. By using a single int field (instead of two boolean fields and an int timer field), you can have a value of -1 be the immune state, the value of 0 be the not immune nor infected state and any positive value being the running timer values for the infected state. Something like the following:
import greenfoot.*;

public class People extends Actor
{
    private int infectiousState;
    
    public People() {
        this(false);
    }
    
    public People(boolean state) {
        setInfectedState(state);
    }
    
    public void act() {
        runInfectionTimer();
        moveRandom();
        spreadInfection();
    }
    
    private void runInfectionTimer() {
        if (isInfected() && ++infectiousState > 200) setImmune(true);
    }
    
    private void moveRandom() {
        move(4);
        if (Greenfoot.getRandomNumber(100) < 20) turn(Greenfoot.getRandomNumber(61)-30);
        if (isAtEdge()) turn(180);
    }
    
    private void spreadInfection() {
        if (!isInfected()) return;
        for (People p : getIntersectingObjects(People.class)) p.setInfected(true);
    }
    
    public boolean isNormal() {
        return infectiousState == 0;
    }
    
    public boolean isImmune() {
        return infectiousState == -1;
    }
    
    public boolean isInfected() {
        return infectiousState > 0;
    }
    
    public void setImmune(boolean newState) {
        if (newState == true) {
            infectiousState = -1;
            setImage("immune.png");
        }
        else setInfectedState(false);
    }
    
    public void setInfectedState(boolean newState) {
        if (isImmune()) return;
        if (newState == true) {
            if (isInfected()) return;
            infectiousState++;
            setImage("infected.png");
        }
        else {
            infectiousState = 0;
            setImage("normal.png");
        }
    }
}
Much easier to control a single field over controlling multiple fields! Lines 11 through 13 is a second constructor that allows for setting the infected state of the People object when created using:
People infected = new People(true);
letting you add the infected person into the world with:
addObject(new People(true), ...etc.
while still allowing uninfected persons to be added without using the boolean:
addObject(new People(), ...etc
or, if desired, with:
addObject(new People(false), ... etc
So, your world constructor could look like the following:
public MyWorld() {
    super(800, 600, 1);
    for (int i=0; i<51; i++) {
        People p = new People(i == 50);
        int x = Greenfoot.getRandomNumber(getWidth());
        int y = Greenfoot.getRandomNumber(getHeight());
        addObject(p, x, y);
    }
    addObject(new Ambulance(), 0, 0);
}
Hope this helps some.
You need to login to post a reply.