import java.util.ArrayList; // Brukes i klassen Kryss // Oppgave 1c class Skog { final int ANTKRYSS; final int ANTSTIER; Kryss[] kryssene; public Skog (int kryss, int stier) { ANTKRYSS = kryss; ANTSTIER = stier; kryssene = new Kryss[ANTKRYSS]; for (int krind = 0; krind < ANTKRYSS; krind++) kryssene[krind] = new Kryss(); for (int stiind = 0; stiind < ANTSTIER; stiind++) { Kryss startKryss = hentTilfeldigKryss(); Kryss sluttKryss = hentTilfeldigKryss(); int valg = Trekk.trekkInt(0,3); switch (valg) { case 0: new Kjerrevei(Trekk.trekkInt(220,2500), startKryss,sluttKryss); break; case 1: new NaturSti(Trekk.trekkInt(220,2500), startKryss,sluttKryss); break; case 2: new VeiMedUtsikt(Trekk.trekkInt(220,2500), startKryss,sluttKryss, Trekk.trekkInt(1,6)); break; case 3: new NaturStiMedUtsikt(Trekk.trekkInt(220,2500), startKryss,sluttKryss, Trekk.trekkInt(1,6)); break; default: System.out.println("Feil valg "); System.exit(1); } // I dette losningsforslaget legger stien seg selv inn // i kryssene i hver ende. } } private Kryss hentTilfeldigKryss() { return kryssene[Trekk.trekkInt(0,ANTKRYSS-1)]; } public Kryss hentTilfeldigStart() { // precondition: Det finnes minst ett kryss med minst en sti ut fra seg Kryss tilf; do { tilf = kryssene[Trekk.trekkInt(0,ANTKRYSS-1)]; } while (tilf.isolert()); return tilf; } } class Kryss { // Her er det lov aa bruke ArrayList fra Javas API. ArrayList stiene = new ArrayList (); public void leggTil(Sti lp) { stiene.add(lp); } public Sti hentTilfeldigSti() { if (stiene.isEmpty()) return null; return stiene.get(Trekk.trekkInt(0, stiene.size()-1)); } public boolean isolert(){ return stiene.isEmpty(); } } abstract class Sti { Kryss start; Kryss slutt; int lengde; Sti(int l, Kryss start, Kryss slutt) { lengde = l; this.start = start; this.slutt = slutt; start.leggTil(this); // I dette losningsforslaget legger en sti slutt.leggTil(this); // seg selv inn i kryssene i hver ende. } public int beregnGaaTid(int fart) { int tiden = Math.round((float)lengde/fart); if (tiden == 0) tiden++; // for aa vare sikker paa at tiden // ikke star stille. return tiden; } public Kryss finnAndreEnde(Kryss denneEnden) { if (denneEnden == start) return slutt; else return start; } } class Kjerrevei extends Sti { Kjerrevei(int l, Kryss start, Kryss slutt) { super(l, start, slutt); } } class NaturSti extends Sti { NaturSti(int l, Kryss start, Kryss slutt) { super(l, start, slutt); } } interface Utsikt { int utsiktsVerdi (); // Utsiktsverdien er 1 til 6 } class IkkeUtsiktdVerdiUnntak extends RuntimeException { } class VeiMedUtsikt extends Kjerrevei implements Utsikt { private int utsiktV; VeiMedUtsikt(int lengde, Kryss start, Kryss slutt, int utsV) { super(lengde, start, slutt); if (utsV < 1 || utsV > 6) throw new IkkeUtsiktdVerdiUnntak(); utsiktV = utsV; } @Override public int utsiktsVerdi() {return utsiktV;} } class NaturStiMedUtsikt extends NaturSti implements Utsikt { private int utsiktV; NaturStiMedUtsikt (int lengde, Kryss start, Kryss slutt, int utsV) { super(lengde, start, slutt); if (utsV < 1 || utsV > 6) throw new IkkeUtsiktdVerdiUnntak(); utsiktV = utsV; } @Override public int utsiktsVerdi() {return utsiktV;} } // Oppgave 1d class Trekk { static public int trekkInt(int min, int max) { return (min + (int)(Math.random()*(max-min+1))); } }