Maatilasimulaattori - mluukkai/OTM2012 GitHub Wiki

public interface Eleleva {
    void eleleTunti();
}

public interface Lypsava {
    double lypsa();
}

public class Lehma implements Lypsava, Eleleva {
    private static final String[] NIMIA = new String[] {
        "Anu", "Arpa", "Essi", "Heluna", "Hely",
        "Hento", "Hilke", "Hilsu", "Hymy", "Ihq", "Ilme", "Ilo",
        "Jaana", "Jami", "Jatta", "Laku", "Liekki",
        "Mainikki", "Mella", "Mimmi", "Naatti",
        "Nina", "Nyytti", "Papu", "Pullukka", "Pulu",
        "Rima", "Soma", "Sylkki", "Valpu", "Virpi"
    };
 
    private Random random = new Random();
    private String nimi;
    private double tilavuus;
    private double maara;
 
    public Lehma() {
        this(NIMIA[new Random().nextInt(NIMIA.length)]);
    }
 
    public Lehma(String nimi) {
        this.nimi = nimi;
        this.tilavuus = 15 + random.nextInt(26);
        this.maara = 0;
    }
 
    public String getNimi() {
        return nimi;
    }
 
    public double getTilavuus() {
        return tilavuus;
    }
 
    public double getMaara() {
        return maara;
    }
 
    @Override
    public double lypsa() {
        double lypsettyMaara = maara;
        maara = 0;
        return lypsettyMaara;
    }
 
    @Override
    public void eleleTunti() {
        double kehitettyMaara = 0.7 + random.nextDouble() * 1.3;
        if (maara + kehitettyMaara > tilavuus) {
            maara = tilavuus;
        } else {
            maara += kehitettyMaara;
        }
    }
 
    @Override
    public String toString() {
        return nimi + " " + Math.ceil(maara) + "/" + Math.ceil(tilavuus);
    }
}

public class Lypsyrobotti {
    private Maitosailio maitosailio = null;
 
    public Maitosailio getMaitosailio() {
        return maitosailio;
    }
 
    public void setMaitosailio(Maitosailio maitosailio) {
        this.maitosailio = maitosailio;
    }
 
    public void lypsa(Lypsava lypsava) {
        if (maitosailio == null) {
            throw new IllegalStateException("Maitosäiliötä ei ole asennettu");
        }
 
        maitosailio.lisaaSailioon(lypsava.lypsa());
    }
}

public class Maatila implements Eleleva {
    private String omistaja;
    private Navetta navetta;
    private Set<Lehma> lehmat = new HashSet<Lehma>();
 
    public Maatila(String omistaja, Navetta navetta) {
        this.omistaja = omistaja;
        this.navetta = navetta;
    }
 
    public String getOmistaja() {
        return omistaja;
    }
 
    public void lisaaLehma(Lehma lehma) {
        lehmat.add(lehma);
    }
 
    @Override
    public void eleleTunti() {
        for (Lehma lehma : lehmat) {
            lehma.eleleTunti();
        }
    }
 
    public void hoidaLehmat() {
        navetta.hoida(lehmat);
    }
 
    public void asennaNavettaanLypsyrobotti(Lypsyrobotti lypsyrobotti) {
        navetta.asennaLypsyrobotti(lypsyrobotti);
    }
 
    @Override
    public String toString() {
        String mj =  "Maatilan omistaja: " + omistaja + "\\n"; 
        mj += "Navetan maitosäiliö: " + navetta.getMaitosailio() + "\\n";
 
        if (lehmat.isEmpty()) {
            mj += "Ei lehmiä.";
        } else {
            mj += "Lehmät:\\n";
 
            for (Lehma lehma : lehmat) {
                mj += "        " + lehma + "\\n";
            }
        }
 
        return mj;
    }
}

public class Maitosailio {
    private double tilavuus;
    private double saldo = 0;
 
    public Maitosailio() {
        this(2000);
    }
 
    public Maitosailio(double tilavuus) {
        this.tilavuus = tilavuus;
    }
 
    public double getTilavuus() {
        return tilavuus;
    }
 
    public double getSaldo() {
        return saldo;
    }
 
    public double paljonkoTilaaJaljella() {
        return tilavuus - saldo;
    }
 
    public void lisaaSailioon(double maara) {
        double uusiSaldo = saldo + maara;
        if (uusiSaldo > tilavuus) {
            uusiSaldo = tilavuus;
        }
        saldo = uusiSaldo;
    }
 
    public double otaSailiosta(double maara) {
        double otettuMaara = maara;
        if (otettuMaara > saldo) {
            otettuMaara = saldo;
        }
        saldo -= otettuMaara;
        return otettuMaara;
    }
 
    @Override
    public String toString() {
        return Math.ceil(saldo) + "/" + Math.ceil(tilavuus);
    }
}

public class Navetta {
    private Maitosailio maitosailio;
    private Lypsyrobotti lypsyrobotti;
 
    public Navetta(Maitosailio maitosailio) {
        this.maitosailio = maitosailio;
    }
 
    public Maitosailio getMaitosailio() {
        return maitosailio;
    }
 
    public void asennaLypsyrobotti(Lypsyrobotti lypsyrobotti) {
        lypsyrobotti.setMaitosailio(maitosailio);
        this.lypsyrobotti = lypsyrobotti;
    }
 
    public void hoida(Lehma lehma) {
        if (lypsyrobotti == null) {
            throw new IllegalStateException("Lypsyrobottia ei ole asennettu");
        }
 
        lypsyrobotti.lypsa(lehma);
    }
 
    public void hoida(Collection<Lehma> lehmat) {
        for (Lehma lehma : lehmat) {
            hoida(lehma);
        }
    }
 
    @Override
    public String toString() {
        return maitosailio.toString();
    }
}
⚠️ **GitHub.com Fallback** ⚠️