/* Mikko Apiola 2005 Lotto on numeroveikkaus, jossa arvotaan 7 numeroa ja 3 lisänumeroa kokonaisluvuista 1, 2, ..., 39. Veikkaaja yrittää arvata 7 numeroa. Loton voittoluokat ovat 7 oikein, 6 ja lisänumero oikein, 6 oikein, 5 oikein ja 4 oikein. Tee ohjelma joka ensin lukee oikean lottorivin, ja jolta sitten voi kysellä, voittiko jokin lottorivi. Myös voittaneen rivin voittoluokka pitää ilmoittaa. Kyselyitä voi olla useampia. Päätä itse, miten ohjelman toiminta päättyy. Saat olettaa, että kaikki syötteet annetaan kelvollisina kokonaislukuina. Syöttölukujen arvot on kuitenkin tarkastettava ja mahdollisista virheistä ilmoitettava. (Saattaa olla hyvä idea ohjelmoida erillinen apumetodi syöttölukujen tarkastamiseen. Ehkäpä voisi harkita jopa metodia, joka lukee kokonaisen lottorivin?) (16 pistettä) */ /* Arvostelu: Tehtävässä oli toteutettava seuraavat toiminnot: lottorivin lukeminen, syötteiden tarkistus, arvattavan rivin lukeminen, voittojen tarkistus ja voittoluokan ilmoitus. Tehtävässä tuli toteuttaa myös käyttöliittymä siten, että käyttäjä voi oikean lottorivin syöttämisen jälkeen arvuuttaa useita lottorivejä. Vaadittavat tehtävät ja pisteet: * Lottorivin lukeminen käyttäjältä ( 7 pistettä ) - Luettava käyttäjältä 7 numeroa sekä 3 lisänumeroa johonkin järkevään tietorakenteeseen (taulukko) 1 piste - jos tietokoneen luvut arvotaan, tästä ei sakoteta (syötteen lukeminen pitää kuitenkin toteuttaa käyttäjän arvausta luettaessa, ja "syöte" tarkistaa) - Syötteen tarkistus: - Numeroiden oltava väliltä 1-39 1 piste - Numerot eivät saa olla samoja 3 pistettä - jos yritetty tarkistaa, mutta ratkaisu epämääräinen/ei oikein toimi 1 piste - jos tarkistetaan ok, muttei lisänumeroille 2 pistettä - kaikin puolin toimiva 3p * Lotossa, jossa voi olla samoja numeroita, ei ole mitään järkeä -- ja tehtävänannossa pyydetään tarkastamaan "virheelliset syöttöluvut" (sama numero on virheellinen syöttöluku). - Virheilmoitus ja uuden numeron kysyminen, kunnes saadaan kelpo syöte 1 piste - Arvattavan rivin lukeminen - Kuten lottorivin lukeminen, muttei lisänumeroita 1 piste * Rivin tarkistus ja voittoluokan ilmoitus ( 5 pistettä ) - Tarkistetaan, montako käyttäjän arvaamista luvuista löytyy oikeasta lottorivistä + lisänumeroista. - esim. 2 sisäkkäistä for-silmukkaa jos 2 pistettä käytetty 7:n mittaisia int-taulukoita - kaikin puolin toimiva ratkaisu 2p - taulukkojen järjestäminen + binäärihaun tekeminen jokaiselle alkiolle toisesta taulusta on jo sen verran monimutkaista logiikkaa (vaikka periaatteessa toimisikin) että siitä sai vain 1 pisteen (olettaen että järjestäminen + binäärihaku kunnossa) (mahdollista myös asettaa alkiot järjestykseen samalla kun niitä kysytään) - pelkkä binäärihaku ilman taulukon järjestämistä = 0 pistettä - voittoluokan ilmoitus 2 pistettä - mahdollisuus kysyä useita rivejä 1 piste * Järkevä metodijako + yleinen siisteys ( 4 pistettä ) - main -metodi (ja muut metodit) muotoiltu 1 piste oikein - Toimintoja jaettu järkeviin metodeihin 1 piste (ei esim. sama koodi monta kertaa peräkkäin) - Parametreja osattu käyttää (ei esim. 1 piste käytetty metodeissa muuttujia, jotka eivät oikeasti näy sinne asti) - Kaarisulkeet, muuttujien määrittelyt yms 1 piste kunnossa - yleinen sekavuus -1 tai -2 pistettä - kutsutaan ei-static metodeja static kontekstista tai muuta sekoilua olioiden kanssa -1 tai -2 pistettä */ /* Esimerkkiratkaisun metodit: * pelaa * kysyRivijaIlmoitaVoitot * kysyOikeaRivi * pyydaLuku * nollaa */ import java.util.Scanner; public class Lotto { private static Scanner lukija = new Scanner(System.in); private int [] oikeaRivi; public static void main(String args[]) { Lotto l = new Lotto(); l.pelaa(); } public void pelaa() { System.out.println("Tervetuloa Lottoon!\n"); this.kysyOikeaRivi(); while (true) { this.kysyRiviJaIlmoitaVoitot(); System.out.print(" = Jatka peliä. Muut lopettaa."); String komento = lukija.next(); if (!komento.equalsIgnoreCase("j")) break; } System.out.println("\nNäkemiin!"); } private void kysyRiviJaIlmoitaVoitot() { System.out.println("\nAnna lottorivisi (7 lottonumeroa)"); boolean [] samojentarkistustaulu = new boolean[40]; nollaa(samojentarkistustaulu); int oikeat = 0; boolean lisano = false; for (int i = 1; i <= 7; i++) { int luku = pyydaLuku (1, 39, "Anna "+i+". lottonumerosi:"); while (samojentarkistustaulu[luku]) { System.out.println("Virhe! Et voi antaa kahta samaa lottonumeroa!"); luku = pyydaLuku ( 1, 39, "Anna "+i+". lottonumerosi:"); } if (oikeaRivi[luku] == 1) oikeat++; else if (oikeaRivi[luku] == 2) lisano = true; samojentarkistustaulu[luku] = true; } if (oikeat == 6 && lisano) System.out.println("6 ja lisänumero oikein!"); else if (oikeat >= 4) System.out.println(oikeat+" oikein!"); else System.out.println("Ei voittoa."); } private void kysyOikeaRivi() { oikeaRivi = new int[40]; nollaa(oikeaRivi); System.out.println("Anna oikea lottorivi (7 numeroa ja 3 lisänumeroa)"); for (int i = 1; i <= 10; i++) { String teksti; if (i <= 7) teksti = "Anna " + i + " lottonumero:"; else teksti = "Anna " + (i-7) +" lisänumero:"; int luku = pyydaLuku ( 1, 39, teksti); while (oikeaRivi [luku] != 0) { System.out.println("Virhe! Et voi antaa kahta samaa lottonumeroa!"); luku = pyydaLuku ( 1, 39, teksti); } if (i <= 7) oikeaRivi [luku] = 1; else oikeaRivi [luku] = 2; } } private static int pyydaLuku(int alku, int loppu, String teksti) { boolean bOk = false; int luku = 0; do { System.out.print(teksti); if (lukija.hasNextInt()) { luku = lukija.nextInt(); if (luku > loppu || luku < alku) System.out.println("Annahan kokonaisluku väliltä " + alku + ".." + loppu); else bOk = true; } else { lukija.next(); System.out.println("Annahan kokonaisluku väliltä " + alku + ".." + loppu); } } while (!bOk); return luku; } private static void nollaa(int [] taulu) { for (int i = 0; i < taulu.length; i++) taulu[i] = 0; } private static void nollaa(boolean [] taulu) { for (int i = 0; i < taulu.length; i++) taulu[i] = false; } }