/** * ****************************************************************************************************** * log lodi * * @param l lod * @param den aktualni den */ private void logLod(Lod l, int den) { if (l.getCil().size() > 0) { int cas = 0; int vzdalenost = (int) (l.getCil().get(l.getCil().size() - 1).getVzdalenost() / 25); cas = vzdalenost + l.getCil().size() + den; int casB = cas + vzdalenost; Soubor.getLogger() .log( Level.INFO, "Lod č. " + l.getId() + " veze " + l.getNaklad() + " léků na " + l.getCil().size() + " planet. Loď je naplněna z " + (int) (l.getNaklad() / 50000.0) + "%." + " Lod č." + l.getId() + " doručí svůj celý náklad " + cas + " den. A vrátí se " + casB + " den."); } else { Soubor.getLogger().log(Level.FINE, "Lod č." + l.getId() + " se vrací do Stanice."); } }
/** ******************************************************************** vyšle naložené lodě */ private void vysliNalozeneLode() { for (int i = 0; i < lode.size(); i++) { if (lode.get(i).getStav() == 1) { lode.get(i).setStav(0); Soubor.getLogger() .log(Level.FINE, "Lod č." + lode.get(i).getId() + " byla vyslána na cestu."); } } }
/** * **************************************************************** stará se o chod druhého * vlákna, každý tik představuje jeden den. */ public void run() { Soubor.initLogger(); synchronized (this) { while (true) { try { if (den % 361 == 360) { gui.getObjednat().setDisable(true); this.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } setPopulace(); //////////////// ZACATEK MESICE vytvorObjednavky(); for (int i = 0; i < 30; i++) { ////////////// ZACATEK DNE Soubor.getLogger().log(Level.SEVERE, "Začíná den " + (den + 1) + ", měsíc " + (mesic)); obsluzVsechnyObjednavky(); posunVsechnyLode(); den++; prekresliPlatno(); Soubor.getLogger().log(Level.SEVERE, "Den " + den + " skončil"); zacniVykladatLode(); vysliNalozeneLode(); if (den % 30 == 0) { zabijLidi(); if (nadvyrobenoLeku() != 0) { throw new RuntimeException("Byly vyrobeny léky, které jsme nestihli dodat."); } } } setPouzitiLodi(); nastavPouzitiLodi(false); mesic++; } } }
/** * *************************************************************** vrátí loď, krerá je v zásobníku * na vrchlu * * @param s výchozí stanice * @return instance třídy {@code Lod} */ private Lod getLod(Stanice s) { if (s.getDok().size() == 0) { Lod l = new Lod(s, counter); counter++; l.setPouzita(true); lode.add(l); Soubor.getLogger() .log( Level.INFO, "Proběhla výroba nové lodi č." + counter + " v doku Stanice " + (s.getId() - 5000)); return l; } else { s.getDok().peek().setPouzita(true); return s.getDok().peek(); } }
/** * **************************************************************** vrátí seznam objednávek * * @return seznam objednávek */ private List<Objednavka> getObjednavky() { ArrayList<Objednavka> objednavky = new ArrayList<Objednavka>(); for (int i = 0; i < g.getPlanety().size() - 5; i++) { Planeta a = g.getPlanety().get(i); if (!a.isMrtva()) { int objednavka = a.getPop() - a.vyrobLeky(); Stanice sc = (Stanice) a.getCesta().get(a.getCesta().size() - 1); Objednavka ob = new Objednavka(a, sc, objednavka, a.getVzdalenost()); objednavky.add(ob); Soubor.getLogger() .log( Level.INFO, "Planeta " + a.getJmeno() + " poslala objednávku na " + objednavka + " léků."); a.setObjednavka(ob); } } statistikaObjednavek.add(objednavky); return objednavky; }
/** * ********************************************************************* vyloží náklad lodi na * planetě * * @param l vykládající loď */ private void vylozLod(Lod l) { if (l.getStav() == 3) { Planeta a = l.getCil().pop(); int naklad = l.getRozpis().pop(); Soubor.getLogger() .log( Level.FINE, "Lod č." + l.getId() + " vyložila na " + a.toString() + " náklad " + naklad + " léků."); a.getDoruceno().add(new Doruceni(naklad, l, den)); l.setNaklad(l.getNaklad() - naklad); a.getObjednavka().setKolik(a.getObjednavka().getKolik() - naklad); a.getObjednavka().setPotencial(a.getObjednavka().getPotencial() - naklad); l.setStav(0); } }