<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Greenfoot Discuss</title>
    <link>https://www.greenfoot.org/topics</link>
    <description>The latest Greenfoot discussion posts</description>
    <language>en-us</language>
    <item>
      <title>Reply to testing</title>
      <description>can anyone help me out to answer this question

can we say actor which is moving upward or downward as moving left or right</description>
      <author>Shifashaikh</author>
      <pubDate>Fri, 07 Aug 2026 14:28:05 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66680?pid=151045#post_151045</link>
    </item>
    <item>
      <title>Reply to testing</title>
      <description>No 4
Gudang()
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;import java.util.ArrayList;
import java.util.List;

/**
 * Tugas Anda (b): generic class yang hanya boleh menyimpan SATU jenis
 * barang (dijamin compiler lewat &amp;amp;amp;lt;T extends Barang&amp;amp;amp;gt;).
 */
public class Gudang&amp;amp;lt;T extends Barang&amp;amp;gt; {

    private List&amp;amp;lt;T&amp;amp;gt; daftarBarang = new ArrayList&amp;amp;lt;&amp;amp;gt;();

    public void tambah(T item) {
        // TODO (b): tambahkan item ke daftarBarang.
        daftarBarang.add(item);
    }

    public T get(int index) {
        // TODO (b): kembalikan barang pada index tersebut.
        return daftarBarang.get(index);
    }

    /** Total harga seluruh barang di gudang ini. */
    public double totalNilai() {
        // TODO (b): jumlahkan getHarga() seluruh isi daftarBarang.
        double total = 0;

    for (T barang : daftarBarang) {
        total += barang.getHarga();
        }

        return total;
    }

    public int jumlahBarang() {
        return daftarBarang.size();
    }
}
&lt;/pre&gt;&lt;/div&gt;
UtilGudang()
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;import java.util.Collections;
import java.util.List;

/** Kumpulan generic method utility yang bekerja di atas Gudang jenis apa pun. */
public class UtilGudang {

    /**
     * Tugas Anda (c): generic method dengan upper bound. Kembalikan barang
     * dengan harga tertinggi dari daftar. Asumsikan daftar tidak kosong.
     */
    public static &amp;amp;lt;T extends Barang&amp;amp;gt; T cariTermahal(List&amp;amp;lt;T&amp;amp;gt; daftar) {
        T termahal = daftar.get(0);

        for (T barang : daftar) {
            if (barang.getHarga() &amp;amp;gt; termahal.getHarga()) {
            termahal = barang;
            }
        }

        return termahal;
    }

    /**
     * Tugas Anda (c): generic method dengan wildcard. Jumlahkan totalNilai()
     * dari SELURUH gudang pada daftarGudang, walaupun tiap gudang berisi
     * jenis barang yang berbeda-beda (Elektronik, Fashion, dst).
     */
    public static double totalNilaiSemuaGudang(List&amp;amp;lt;Gudang&amp;amp;lt;? extends Barang&amp;amp;gt;&amp;amp;gt; daftarGudang) {
        double total = 0;

        for (Gudang&amp;amp;lt;? extends Barang&amp;amp;gt; gudang : daftarGudang) {
            total += gudang.totalNilai();
        }

        return total;
    }

    /**
     * (Bonus, Tugas d) generic method dengan multiple bound: T harus berupa
     * Barang SEKALIGUS Comparable&amp;amp;amp;lt;T&amp;amp;amp;gt;. Urutkan daftar secara ascending
     * memakai Comparable-nya sendiri (mis. Collections.sort).
     */
    public static &amp;amp;lt;T extends Barang &amp;amp;amp; Comparable&amp;amp;lt;T&amp;amp;gt;&amp;amp;gt; void urutkanNaik(List&amp;amp;lt;T&amp;amp;gt; daftar) {
        Collections.sort(daftar);
    }
}
&lt;/pre&gt;&lt;/div&gt;
Elektronik()
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;/**
 * Tugas Anda (a): implementasikan Barang dan Comparable&amp;amp;amp;lt;Elektronik&amp;amp;amp;gt;
 * (compareTo berdasarkan harga, ascending).
 */
public class Elektronik implements Barang, Comparable&amp;amp;lt;Elektronik&amp;amp;gt; {

    private String nama;
    private double harga;
    private double berat;

    public Elektronik(String nama, double harga, double berat) {
        // TODO (a): inisialisasi field.
        this.nama = nama;
        this.harga = harga;
        this.berat = berat;
    }

    @Override
    public String getNama() {
        return nama;
    }

    @Override
    public double getHarga() {
        return harga;
    }

    @Override
    public double getBerat() {
        return berat;
    }

    @Override
    public int compareTo(Elektronik lainnya) {
        // TODO (a): bandingkan berdasarkan harga (ascending).
        return Double.compare(this.harga, lainnya.harga);
    }

    @Override
    public String toString() {
        return getNama() + &amp;amp;quot; (Rp&amp;amp;quot; + getHarga() + &amp;amp;quot;)&amp;amp;quot;;
    }
}
&lt;/pre&gt;&lt;/div&gt;</description>
      <author>arumsari</author>
      <pubDate>Wed, 05 Aug 2026 06:13:25 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66680?pid=151044#post_151044</link>
    </item>
    <item>
      <title>Reply to testing</title>
      <description>No 3 
PendaftaranProcessor()
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Memproses file pendaftaran peserta HackFest: membaca, memvalidasi, dan
 * menulis laporan. Ini adalah file utama yang Anda kerjakan.
 */
public class PendaftaranProcessor {

    private List&amp;amp;lt;Peserta&amp;amp;gt; pesertaDiterima = new ArrayList&amp;amp;lt;&amp;amp;gt;();

    public List&amp;amp;lt;Peserta&amp;amp;gt; getPesertaDiterima() {
        return pesertaDiterima;
    }

    /**
     * Tugas Anda (a, b, c): baca namaFile baris demi baris. Format tiap
     * baris: Nama,Umur,Kategori,BiayaPendaftaran
     *
     * - (a) Tangani FileNotFoundException: cetak &amp;amp;quot;File peserta tidak
     *   ditemukan!&amp;amp;quot;, program tidak boleh crash.
     * - (b) Tangani NumberFormatException saat parsing Umur/BiayaPendaftaran:
     *   cetak &amp;amp;quot;Data tidak valid pada baris ke-N (Nama), baris dilewati.&amp;amp;quot;
     *   lalu lanjut ke baris berikutnya.
     * - (c) Validasi umur (17-25); jika di luar rentang, lempar dan tangkap
     *   UmurTidakValidException, cetak &amp;amp;quot;Pendaftaran [Nama] ditolak: umur
     *   tidak memenuhi syarat (17-25 tahun).&amp;amp;quot;, baris dilewati.
     * - Baris yang valid ditambahkan ke pesertaDiterima.
     */
    public void prosesFile(String namaFile) {
        try {
            Scanner scanner = new Scanner(new File(namaFile));
            int baris = 1;

            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();

                try {
                    String[] data = line.split(&amp;amp;quot;,&amp;amp;quot;);

                    String nama = data[0];
                    int umur = Integer.parseInt(data[1]);
                    String kategori = data[2];
                    double biaya = Double.parseDouble(data[3]);

                    if (umur &amp;amp;lt; 17 || umur &amp;amp;gt; 25) {
                        throw new UmurTidakValidException(
                                &amp;amp;quot;Pendaftaran &amp;amp;quot; + nama +
                                &amp;amp;quot; ditolak: umur tidak memenuhi syarat (17-25 tahun).&amp;amp;quot;);
                    }

                    pesertaDiterima.add(
                            new Peserta(nama, umur, kategori, biaya)
                    );

                } catch (NumberFormatException e) {
                    String nama = line.split(&amp;amp;quot;,&amp;amp;quot;)[0];
                    System.out.println(
                            &amp;amp;quot;Data tidak valid pada baris ke-&amp;amp;quot; +
                            baris + &amp;amp;quot; (&amp;amp;quot; + nama + &amp;amp;quot;), baris dilewati.&amp;amp;quot;);
                } catch (UmurTidakValidException e) {
                    System.out.println(e.getMessage());
                }

                baris++;
            }

            scanner.close();

        } catch (FileNotFoundException e) {
            System.out.println(&amp;amp;quot;File peserta tidak ditemukan!&amp;amp;quot;);
        }

    }

    /**
     * Tugas Anda (d): tulis file namaFileOutput berisi daftar nama peserta
     * pada pesertaDiterima beserta total biaya pendaftaran yang terkumpul.
     */
    public void tulisLaporan(String namaFileOutput) {
        try {
            PrintWriter writer = new PrintWriter(new FileWriter(namaFileOutput));

            for (Peserta p : pesertaDiterima) {
                writer.println(p.getNama());
            }

            writer.println(&amp;amp;quot;Total Biaya: &amp;amp;quot; + getTotalBiaya());

            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /** Total biaya pendaftaran dari seluruh peserta yang diterima. */
    public double getTotalBiaya() {
        double total = 0;

        for (Peserta p : pesertaDiterima) {
            total += p.getBiayaPendaftaran();
        }

        return total;
    }
}
&lt;/pre&gt;&lt;/div&gt;</description>
      <author>arumsari</author>
      <pubDate>Wed, 05 Aug 2026 06:10:04 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66680?pid=151043#post_151043</link>
    </item>
    <item>
      <title>Reply to testing</title>
      <description>&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;/** Tugas Anda (b): valid bila nomorKartu 16 digit angka DAN belum expired. */
public class KartuKredit implements MetodePembayaran {

    private String nomorKartu;
    private boolean sudahExpired;

    public KartuKredit(String nomorKartu, boolean sudahExpired) {
        // TODO: inisialisasi field.
        this.nomorKartu = nomorKartu;
        this.sudahExpired = sudahExpired;
    }

    @Override
    public String getNamaMetode() {
        return &amp;amp;quot;Kartu Kredit&amp;amp;quot;;
    }

    @Override
    public boolean validasi() {
        // TODO (b): valid bila nomorKartu terdiri dari tepat 16 digit angka
        // DAN sudahExpired bernilai false.
        return nomorKartu.matches(&amp;amp;quot;\\d{16}&amp;amp;quot;) &amp;amp;amp;&amp;amp;amp; !sudahExpired;
    }

    @Override
    public StatusPembayaran prosesBayar(double nominal) {
        // TODO (b): bila !validasi() atau nominal &amp;amp;lt;= 0 -&amp;amp;gt; GAGAL.
        // Bila valid dan nominal &amp;amp;gt; 0 -&amp;amp;gt; SUKSES.
        if (!validasi() || nominal&amp;amp;lt;= 0){
            return StatusPembayaran.GAGAL;
        } else {
            return StatusPembayaran.SUKSES;
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;
Kartu Kredit ()

&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;import java.util.ArrayList;
import java.util.List;

/** Tugas Anda (c): implementasikan Repository&amp;amp;amp;lt;Reservasi&amp;amp;amp;gt;. */
public class ReservasiRepository implements Repository&amp;amp;lt;Reservasi&amp;amp;gt; {

    private List&amp;amp;lt;Reservasi&amp;amp;gt; items = new ArrayList&amp;amp;lt;&amp;amp;gt;();

    @Override
    public void save(Reservasi item) {
        // TODO (c): simpan item ke dalam items.
        items.add(item);
    }

    @Override
    public Reservasi findById(String id) {
        // TODO (c): cari dan kembalikan Reservasi dengan id yang cocok,
        // atau null bila tidak ditemukan.
        for (Reservasi reservasi : items){
            if (reservasi.getId().equals(id)){
                return reservasi;
            }
        }
        return null;
    }

    @Override
    public List&amp;amp;lt;Reservasi&amp;amp;gt; getAll() {
        // TODO (c): kembalikan seluruh isi items.
        return new ArrayList&amp;amp;lt;&amp;amp;gt;(items);
    }
}
&lt;/pre&gt;&lt;/div&gt;
ReservasiRepo()

&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;/** Mengorkestrasi pembuatan reservasi: validasi, bayar, simpan. */
public class ReservasiService {

    private ReservasiRepository repository;
    private int counter = 0;

    public ReservasiService(ReservasiRepository repository) {
        this.repository = repository;
    }

    /**
     * Tugas Anda (d): validasi metode pembayaran, proses pembayaran, set
     * status reservasi sesuai hasil prosesBayar(), simpan reservasi ke
     * repository, lalu kembalikan objek Reservasi tersebut (status sudah
     * final: SUKSES atau GAGAL).
     */
    public Reservasi buatReservasi(String namaPemesan, double totalHarga, MetodePembayaran metode) {
        if (!metode.validasi()) {
            Reservasi reservasi = new Reservasi(buatId(), namaPemesan, totalHarga, metode);
            reservasi.setStatus(StatusPembayaran.GAGAL);
            repository.save(reservasi);
            return reservasi;
        }
            StatusPembayaran status = metode.prosesBayar(totalHarga);
            Reservasi reservasi = new Reservasi(buatId(), namaPemesan, totalHarga, metode);
            reservasi.setStatus(status);
            repository.save(reservasi);
            return reservasi;
    }

    /** Helper pembuat ID reservasi, silakan dipakai di buatReservasi(). */
    protected String buatId() {
        counter++;
        return &amp;amp;quot;RSV-&amp;amp;quot; + System.currentTimeMillis() + &amp;amp;quot;-&amp;amp;quot; + counter;
    }
}
&lt;/pre&gt;&lt;/div&gt;
ReservasiService()</description>
      <author>arumsari</author>
      <pubDate>Wed, 05 Aug 2026 06:08:01 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66680?pid=151042#post_151042</link>
    </item>
    <item>
      <title>Reply to testing</title>
      <description>&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;/**
 * Rekap skor submission peserta CodeClash menggunakan ragged array.
 * skorSubmission[i].length = jumlah submission peserta ke-i (bisa berbeda
 * antar peserta, termasuk 0 bila belum pernah submit).
 */
public class Leaderboard {

    private String[] namaPeserta;
    private int[][] skorSubmission;

    public Leaderboard(String[] namaPeserta, int[][] skorSubmission) {
        this.namaPeserta = namaPeserta;
        this.skorSubmission = skorSubmission;
    }

    /** Tugas Anda (b): jumlahkan seluruh skor submission peserta ke-i. */
    public int totalSkor(int pesertaIndex) {
        // Ingat: SELALU pakai skorSubmission[pesertaIndex].length untuk
        // iterasi, jangan asumsikan semua peserta punya jumlah submission
        // yang sama.
        int totalSkor = 0;
        for (int i = 0; i &amp;amp;lt; skorSubmission[pesertaIndex].length; i++){
            totalSkor += skorSubmission[pesertaIndex][i];  
        }
        return totalSkor;        
    }

    /**
     * Tugas Anda (b): rata-rata skor submission peserta ke-i.
     * Kembalikan 0 bila peserta belum pernah submit.
     */
    public double rataRataSkor(int pesertaIndex) {
        double rataRata = 0;
        if (skorSubmission[pesertaIndex].length == 0){
            return rataRata;
        } else {
            rataRata = (double) totalSkor(pesertaIndex) / skorSubmission[pesertaIndex].length;
            return rataRata;
        }
    }

    /**
     * Tugas Anda (c): index submission dengan skor tertinggi milik peserta
     * ke-i. Kembalikan -1 bila peserta belum pernah submit.
     */
    public int submissionTerbaik(int pesertaIndex) {
        if (skorSubmission[pesertaIndex].length == 0) {
            return -1;
        }
        int maxSkor = skorSubmission[pesertaIndex][0];
        int indexMax = 0;
        for (int i = 1; i &amp;amp;lt; skorSubmission[pesertaIndex].length; i++) {
            if (skorSubmission[pesertaIndex][i] &amp;amp;gt; maxSkor) {
                maxSkor = skorSubmission[pesertaIndex][i];
                indexMax = i;
            }
        }
        return indexMax;
    }

    /**
     * Tugas Anda (c): index peserta dengan totalSkor() tertinggi se-leaderboard.
     * Bila seri, kembalikan index terkecil.
     */
    public int pesertaSkorTertinggi() {
        int maxTotalSkor = totalSkor(0);
        int indexMax = 0;
        for (int i = 1; i &amp;amp;lt; jumlahPeserta(); i++) {
            int totalSkor = totalSkor(i);
            if (totalSkor &amp;amp;gt; maxTotalSkor) {
                maxTotalSkor = totalSkor;
                indexMax = i;
            }
        }
        return indexMax;
    }

    public String getNamaPeserta(int index) {
        return namaPeserta[index];
    }

    public int jumlahPeserta() {
        return namaPeserta.length;
    }
}
&lt;/pre&gt;&lt;/div&gt;
itu CodeClash</description>
      <author>arumsari</author>
      <pubDate>Wed, 05 Aug 2026 06:06:03 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66680?pid=151041#post_151041</link>
    </item>
    <item>
      <title>Reply to testing</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;hafizz.hnn wrote...&lt;/div&gt;&amp;amp;lt;&amp;amp;lt; Code Omitted &amp;amp;gt;&amp;amp;gt;&lt;/div&gt;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:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;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() &amp;amp;amp;&amp;amp;amp; ++infectiousState &amp;amp;gt; 200) setImmune(true);
    }
    
    private void moveRandom() {
        move(4);
        if (Greenfoot.getRandomNumber(100) &amp;amp;lt; 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 &amp;amp;gt; 0;
    }
    
    public void setImmune(boolean newState) {
        if (newState == true) {
            infectiousState = -1;
            setImage(&amp;amp;quot;immune.png&amp;amp;quot;);
        }
        else setInfectedState(false);
    }
    
    public void setInfectedState(boolean newState) {
        if (isImmune()) return;
        if (newState == true) {
            if (isInfected()) return;
            infectiousState++;
            setImage(&amp;amp;quot;infected.png&amp;amp;quot;);
        }
        else {
            infectiousState = 0;
            setImage(&amp;amp;quot;normal.png&amp;amp;quot;);
        }
    }
}&lt;/pre&gt;&lt;/div&gt;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:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;People infected = new People(true);&lt;/pre&gt;&lt;/div&gt;letting you add the infected person into the world with:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;addObject(new People(true), ...etc.&lt;/pre&gt;&lt;/div&gt;while still allowing uninfected persons to be added without using the boolean:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;addObject(new People(), ...etc&lt;/pre&gt;&lt;/div&gt;or, if desired, with:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;addObject(new People(false), ... etc&lt;/pre&gt;&lt;/div&gt;
So, your world constructor could look like the following:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;public MyWorld() {
    super(800, 600, 1);
    for (int i=0; i&amp;amp;lt;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);
}&lt;/pre&gt;&lt;/div&gt;Hope this helps some.</description>
      <author>danpost</author>
      <pubDate>Wed, 15 Jul 2026 19:56:32 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66680?pid=151040#post_151040</link>
    </item>
    <item>
      <title>Reply to testing</title>
      <description>import greenfoot.*;

public class MyWorld extends World
{
    public MyWorld()
    {
        super(800, 600, 1);

        // Spawn 50 orang normal
        for (int i = 0; i &amp;amp;lt; 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() &amp;amp;gt;= getWorld().getWidth() - 1)
            {
                movingRight = false;
                setLocation(getX(), getY() + stepDown);
            }
        }
        else
        {
            setLocation(getX() - speed, getY());

            if (getX() &amp;amp;lt;= 0)
            {
                movingRight = true;
                setLocation(getX(), getY() + stepDown);
            }
        }

        // Jika sudah mencapai bawah, kembali ke atas
        if (getY() &amp;amp;gt;= getWorld().getHeight() - 1)
        {
            setLocation(getX(), 0);
        }
    }

    private void healPeople()
    {
        People p = (People)getOneIntersectingObject(People.class);

        if (p != null &amp;amp;amp;&amp;amp;amp; 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 &amp;amp;gt;= 200)
            {
                setImmune(true);
            }
        }
    }

    // Gerak random
    private void randomMove()
    {
        move(4);

        if (Greenfoot.getRandomNumber(100) &amp;amp;lt; 20)
        {
            turn(Greenfoot.getRandomNumber(61) - 30);
        }

        if (isAtEdge())
        {
            turn(180);
        }
    }

    // Menularkan ke orang yang disentuh
    private void spreadInfection()
    {
        List&amp;amp;lt;People&amp;amp;gt; people = getIntersectingObjects(People.class);

        for (People p : people)
        {
            if (p != this &amp;amp;amp;&amp;amp;amp; !p.isImmune() &amp;amp;amp;&amp;amp;amp; !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(&amp;amp;quot;immune.png&amp;amp;quot;);
        }
        else if (infected)
        {
            setImage(&amp;amp;quot;infected.png&amp;amp;quot;);
        }
        else
        {
            setImage(&amp;amp;quot;normal.png&amp;amp;quot;);
        }
    }
}</description>
      <author>hafizz.hnn</author>
      <pubDate>Thu, 09 Jul 2026 11:58:05 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66680?pid=151039#post_151039</link>
    </item>
    <item>
      <title>Reply to Space Haven Project</title>
      <description>hallo mein Project ist nicht in der richtigen Größe was kann ich tun um es zu spielen</description>
      <author>schaeff_lu</author>
      <pubDate>Thu, 09 Jul 2026 11:58:02 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66679?pid=151038#post_151038</link>
    </item>
    <item>
      <title>Reply to need help</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;arumsari wrote...&lt;/div&gt;need help
&amp;amp;lt;&amp;amp;lt; Code Omitted &amp;amp;gt;&amp;amp;gt;&lt;/div&gt;The only thing I see wrong with your codes is in the second line of the &lt;span class="bb_italic"&gt;prepareBoard &lt;/span&gt;method, which should increment the column (&lt;span class="bb_italic"&gt;c&lt;/span&gt;) value, not the row (&lt;span class="bb_italic"&gt;r&lt;/span&gt;) value.

Don&amp;amp;#39;t really know what you need help with.  You need to explain (in English, please) what you are trying to do and how the execution is wrong.</description>
      <author>danpost</author>
      <pubDate>Sun, 28 Jun 2026 16:15:23 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66675?pid=151034#post_151034</link>
    </item>
    <item>
      <title>Reply to need help</title>
      <description>import greenfoot.*;  

public class Sudoku extends World
{
    // Pola Sudoku awal berdasarkan slide kuliah (0 berarti kosong)
    private int board = {
        {5, 3, 0, 0, 7, 0, 0, 0, 0},
        {6, 0, 0, 1, 9, 5, 0, 0, 0},
        {0, 9, 8, 0, 0, 0, 0, 6, 0},
        {8, 0, 0, 0, 6, 0, 0, 0, 3},
        {4, 0, 0, 8, 0, 3, 0, 0, 1},
        {7, 0, 0, 0, 2, 0, 0, 0, 6},
        {0, 6, 0, 0, 0, 0, 2, 8, 0},
        {0, 0, 0, 4, 1, 9, 0, 0, 5},
        {0, 0, 0, 0, 8, 0, 0, 7, 9}
    };

    public Sudoku()
    {    
        // Ukuran cell disesuaikan dengan pixel grid pada gambar .jpg dosen
        super(9, 9, 50); 
        
        // Pasang gambar template sebagai background
        setBackground(&amp;amp;quot;sudoku_board.jpg&amp;amp;quot;); 
        
        prepareBoard();
    }

    private void prepareBoard()
    {
        for (int r = 0; r &amp;amp;lt; 9; r++) {
            for (int c = 0; c &amp;amp;lt; 9; r++) { // Jika infinity loop, pastikan c++
            }
        }
        // Koreksi loop penempatan cell agar presisi 9x9
        for (int r = 0; r &amp;amp;lt; 9; r++) {
            for (int c = 0; c &amp;amp;lt; 9; c++) {
                int val = board;
                
                Cell cell = new Cell();
                addObject(cell, c, r);
                
                if (val != 0) {
                    cell.setNumber(val);
                }
            }
        }
    }

    // Validasi baris: dipanggil setiap kali ada cell yang berubah nilainya
    public boolean isValidRow(int row, int num) {
        int count = 0;
        java.util.List&amp;amp;lt;Cell&amp;amp;gt; cells = getObjects(Cell.class);
        for (Cell c : cells) {
            if (c.getY() == row &amp;amp;amp;&amp;amp;amp; c.getNumber() == num) {
                count++;
            }
        }
        return count &amp;amp;lt;= 1; 
    }
}</description>
      <author>arumsari</author>
      <pubDate>Sun, 28 Jun 2026 06:55:55 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66675?pid=151033#post_151033</link>
    </item>
    <item>
      <title>Reply to Need Help</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;ThatsNotCode wrote...&lt;/div&gt;I can&amp;amp;#39;t figure out how to make my background change colors every ten seconds, if someone could help me that would be amazing&lt;/div&gt;With a simple int timer field:
(note that at normal running speed, act is run about 60 times per second; hence value used)
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;private int bgTimer;

public void act() {
    if (bgTimer == 0) changeBgColor(); // timer check
    bgTimer = ++bgTimer%600; // timer tick
}&lt;/pre&gt;&lt;/div&gt;
If using a range of colors:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;Color[] bgColors = new Color[] { Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED };
int bgColorNum; // array pointer

private void changeBgColor() {
    // create color image
    GreenfootImage image = new GreenfootImage(getWidth(), getHeight());
    image.setColor(bgColors[bgColorNum]);
    bgColorNum = (bgColorNum+1)%bgColors.length;
    image.fill();
    image.setTransparency(80); // change or remove as needed
    
    // change background
    getBackground().setColor(Color.WHITE);
    getBackground().fill();
    getBackground().drawImage(image, 0, 0);
}&lt;/pre&gt;&lt;/div&gt;
Note that the background image should never be &lt;span class="bb_underline"&gt;set&lt;/span&gt; to an image with any transparency, but drawing one onto the already opaque image of the background is okay.

If not using the transparency line, you can remove everything about &lt;span class="bb_italic"&gt;image&lt;/span&gt; and just use lines 11 and 12 to change the background color and the line to adjust &lt;span class="bb_italic"&gt;bgColorNum&lt;/span&gt;:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;getBackground().setColor(bgColors[bgColorNum]);
bgColorNum = (bgColorNum+1)%bgColors.length;
getBackground().fill();&lt;/pre&gt;&lt;/div&gt;</description>
      <author>danpost</author>
      <pubDate>Tue, 23 Jun 2026 14:07:23 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66672?pid=151030#post_151030</link>
    </item>
    <item>
      <title>Reply to Need Help</title>
      <description>I can&amp;amp;#39;t figure out how to make my background change colors every ten seconds, if someone could help me that would be amazing</description>
      <author>ThatsNotCode</author>
      <pubDate>Tue, 23 Jun 2026 10:56:46 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66672?pid=151029#post_151029</link>
    </item>
    <item>
      <title>Reply to How do i make a Project to .jar</title>
      <description>tysm!!!! it helps me alot. But i dont want the bar on the bottom T.T . Whatever i take what i get</description>
      <author>Zildrion</author>
      <pubDate>Wed, 10 Jun 2026 22:34:51 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66669?pid=151028#post_151028</link>
    </item>
    <item>
      <title>Reply to How do i make a Project to .jar</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;Zildrion wrote...&lt;/div&gt;And are u sure that it doesnt cause problems becaus its old? And if not which version should i download. thx for ur help&lt;/div&gt;I do not personally know which version would be best.  I am still using v3.10, which could be considered ancient,   You may have to make some coding changes to accommodate an older version, but if you don&amp;amp;#39;t go too far back, it should not be too involved.  You can check version history to see when the feature was removed.</description>
      <author>danpost</author>
      <pubDate>Tue, 09 Jun 2026 15:12:44 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66669?pid=151027#post_151027</link>
    </item>
    <item>
      <title>Reply to How do i make a Project to .jar</title>
      <description>And are u sure that it doesnt cause problems becaus its old? And if not which version should i download. thx for ur help</description>
      <author>Zildrion</author>
      <pubDate>Tue, 09 Jun 2026 08:26:56 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66669?pid=151026#post_151026</link>
    </item>
    <item>
      <title>Reply to boolean not changing</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;danpost wrote...&lt;/div&gt;&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;bonyay wrote...&lt;/div&gt;I think if this last error is solved, it will function?&lt;/div&gt;My mistake.  Line 28 should be:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;Greenfoot.setWorld(Dock.dock);&lt;/pre&gt;&lt;/div&gt;
My last edit to &lt;span class="bb_italic"&gt;change &lt;/span&gt;methods still stands as it should not matter which world is currently active here.  The referencing bypasses that issue.  And, it should have nothing to do with actor not in world as &lt;span class="bb_italic"&gt;act &lt;/span&gt;method is not executed when not in world.&lt;/div&gt;Between the time I posted that and your reply, I searched far and wide for a solution and ended up basically revamping a lot of the code. Good news though, everything works! I just have to write out the rest of the upgrades and everything, but I think that if I just repeat my template, then it&amp;amp;#39;ll be fine. &lt;span class="bb_bold"&gt;Thank you so, so much for all your help!&lt;/span&gt; (If you want to see what I did, I updated the scenario, also realized I accidentally had it uploaded twice so I took one down lol)

&lt;span class="bb_italic"&gt;(we aren&amp;amp;#39;t being graded on our code&amp;amp;#39;s efficiency, so honestly, it&amp;amp;#39;s the least of my concerns--as long as it works, I&amp;amp;#39;m satisfied for now)&lt;/span&gt;</description>
      <author>bonyay</author>
      <pubDate>Fri, 05 Jun 2026 02:29:36 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66668?pid=151024#post_151024</link>
    </item>
    <item>
      <title>Reply to boolean not changing</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;bonyay wrote...&lt;/div&gt;I think if this last error is solved, it will function?&lt;/div&gt;My mistake.  Line 28 should be:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;Greenfoot.setWorld(Dock.dock);&lt;/pre&gt;&lt;/div&gt;
My last edit to &lt;span class="bb_italic"&gt;change &lt;/span&gt;methods still stands as it should not matter which world is currently active here.  The referencing bypasses that issue.  And, it should have nothing to do with actor not in world as &lt;span class="bb_italic"&gt;act &lt;/span&gt;method is not executed when not in world.</description>
      <author>danpost</author>
      <pubDate>Fri, 05 Jun 2026 02:17:29 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66668?pid=151023#post_151023</link>
    </item>
    <item>
      <title>Reply to boolean not changing</title>
      <description>Update:
In class, my instructor had said that part of my error was from not knowing if DockButton was in the world(or something like that). I didn&amp;amp;#39;t really get what he meant/why it would cause an error, but from what it sounded like to me, I had to check if the DockButton actor was in the world before coding anything with it.

 I added a check if it is, and now I am down to having only one error with two lines: 

&amp;amp;quot;java.lang.NullPointerException: Cannot read field &amp;amp;quot;dock&amp;amp;quot; because &amp;amp;quot;this.dock&amp;amp;quot; is null
	at DockButton.change(DockButton.java:28)
	at DockButton.act(DockButton.java:18)&amp;amp;quot;
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class DockButton here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class DockButton extends Buttons
{
    private Dock dock;
    /**
     * Act - do whatever the DockButton wants to do. This method is called whenever
     * the &amp;amp;#39;Act&amp;amp;#39; or &amp;amp;#39;Run&amp;amp;#39; button gets pressed in the environment.
     */
    public void act()
    {
        change();
    }
    public void change()
    {
        if(Greenfoot.mouseClicked(this) &amp;amp;amp;&amp;amp;amp; getWorld() instanceof Dock) 
        {
            Greenfoot.setWorld(dock);  
        }
        else if (Greenfoot.mouseClicked(this) &amp;amp;amp;&amp;amp;amp; getWorld() instanceof Shop &amp;amp;amp;&amp;amp;amp; (getWorld()!=null))
        {
            Greenfoot.setWorld(dock.dock);
        }
    }
    public DockButton(Dock _dock)
    {
        dock = _dock;
    }
}&lt;/pre&gt;&lt;/div&gt;I think if this last error is solved, it will function?</description>
      <author>bonyay</author>
      <pubDate>Fri, 05 Jun 2026 00:19:41 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66668?pid=151022#post_151022</link>
    </item>
    <item>
      <title>Reply to boolean not changing</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;danpost wrote...&lt;/div&gt;
It should not matter what world you are in:
&lt;/div&gt;
Yes, I had your code written originally but got an error (i cant remember exactly), i think it was something like &amp;amp;quot;this.dock is null&amp;amp;quot; so i added the instanceof code and it worked. I dont really understand how I could apply the same logic to the DockButton, though. I think I get the same error, but i cant check because im traveling home right now.

Edit: Alright, Im back home now and it did gives me the errors:
&amp;amp;quot;java.lang.NullPointerException: Cannot read field &amp;amp;quot;dock&amp;amp;quot; because &amp;amp;quot;this.dock&amp;amp;quot; is null

java.lang.NullPointerException: The given world cannot be null.

java.lang.ClassCastException: class Shop cannot be cast to class Dock (Shop and Dock are in unnamed module of loader java.net.URLClassLoader @67e92a&amp;amp;quot;

Which I believe are the same ones I got when using the code you gave me in the quoted reply? 

Honestly, I might have written something incorrectly from a previous reply of yours..? Updated scenario with the new code</description>
      <author>bonyay</author>
      <pubDate>Thu, 04 Jun 2026 20:23:35 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66668?pid=151021#post_151021</link>
    </item>
    <item>
      <title>Reply to boolean not changing</title>
      <description>&lt;div class="bb_quote"&gt;&lt;div class="bb_quote_header"&gt;bonyay wrote...&lt;/div&gt;&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;public void change()
{
    if(Greenfoot.mouseClicked(this) &amp;amp;amp;&amp;amp;amp; getWorld() instanceof Dock) 
    {
        Greenfoot.setWorld(dock);  
    }
    else if (Greenfoot.mouseClicked(this) &amp;amp;amp;&amp;amp;amp; getWorld() instanceof Shop)
    {
        Greenfoot.setWorld(dock.dock);
    }
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;It should not matter what world you are in:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;public void change() {
    if (Greenfoot.mouseClicked(this)) Greenfoot.setWorld(dock.dock);
}&lt;/pre&gt;&lt;/div&gt;This should be sufficient in the DockButton class.

And the following in the RoomButton class:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;public void change() {
    if (Greenfoot.mouseClicked(this)) Greenfoot.setWorld(dock.room);
}&lt;/pre&gt;&lt;/div&gt;
And similarly for ShopButton class:
&lt;div class="bb_code_wrap"&gt;&lt;pre class="brush: java"&gt;public void change() {
    if (Greenfoot.mouseCLicked(this)) Greenfoot.setWorld(dock.shop);
}&lt;/pre&gt;&lt;/div&gt;</description>
      <author>danpost</author>
      <pubDate>Thu, 04 Jun 2026 20:04:10 +0000</pubDate>
      <link>https://www.greenfoot.org/topics/66668?pid=151020#post_151020</link>
    </item>
  </channel>
</rss>
