Kierros 7, tehtävä 3

Noppapokeri (250 p)

Tässä tehtävässä harjoitellaan erityisesti seuraavia asioita:

Tee Eclipseen uusi projekti, jonka nimi on tehtava7_3, ja tähän projektiin moduuli noppapokeri. Kirjoita tähän moduuliin ohjelma, jonka avulla käyttäjä voi pelata tietokoneen kanssa noppapokeria.

Noppapokeria pelatessa kumpikin pelaaja heittää viittä noppaa. Voittaja on se, jonka nopissa on eniten samoja silmälukuja. Jos molemmilla pelaajilla on yhtä monta samaa silmälukua, ratkaisee voiton se, kummalla tämä sama silmäluku on suurempi. Jos sekin on sama molemmilla pelaajilla, tulos on tasapeli.

Esimerkkejä:

Huomatus: oikeasti noppapokerissa säännöt ovat monimutkaisemmat. Mahdollisia noppayhdistelmiä on muitakin (täyskäsi, kaksi paria, suora jne) ja myös muut kuin parhaat nopat vaikuttavat tulokseeen silloin, kun peli olisi muuten tasapeli. Lisäksi pelaajalla on mahdollisuus heittää valitsemansa nopat uudelleen. Tästä tehtävästä nämä ominaisuudet on kuitenkin jätetty pois, jotta tehtävästä ei tulisi liian työläs. Halutessasi voit kuitenkin laajentaa ohjelmaasi myöhemmin näillä ominaisuuksilla. (Palauta kuitenkin Gobliniin tässä tehtävänannossa kuvattu versio.)

Ohjelman rakennetta ei ole tässä määrätty sen tarkemmin, vaan saat itse miettiä, mitä funktioita tarvitset ohjelmassasi. Älä kuitenkaan kirjoita koko ohjelmaasi yhteen pääohjelmaan, vaan kirjoita funktioita sopivasti. Käytä ohjelmassasi apuna kahta tietorakennetta: 5-alkioista listaa, joka sisältää pelaajan heittämien noppien silmäluvut, sekä kaksialkioista listaa, jonka ensimmäinen alkio sisältää tiedon siitä, montako samaa silmälukua heittojen tuloksissa on, ja toinen alkio tämän silmäluvun (parhaimman niistä, jos niitä on useita). Jälkimmäisen listan avulla on helppo verrata kahdesta pelaajasta, kummalla on parempi tulos. (Asian voisi hoitaa kauniimmin käyttämällä olioita, mutta koska niitä ei ole opetettu, tehdään vertailu tässä listojen avulla.)

Noppien heittämisen simuloinnissa käytetään apuna satunnaislukuja, joista on kerrottu tarkemmin tehtävässä 3.2. Alla on annettu nopan heittämiseen tarvittava koodi valmiina. Viiden nopan heittämistä simuloidaan kutsumalla alla annettua heita_noppaa-funktiota viisi kertaa peräkkäin.

import random

# Funktio pyytaa kayttajalta siemenluvun nopan heittamista kuvaavaa
# satunnaislukugeneraattoria varten. Tama ei olisi muuten valttamatonta,
# mutta nain ohjelma saadaan haluttaessa toimimaan eri suorituskerroilla
# samalla tavalla tarkistuksia varten.

def alusta_noppa():
    rivi = raw_input("Anna siemenluku nopan alustamiseksi.\n")
    siemenluku = int(rivi)
    random.seed(siemenluku)
 
    
# Funktio matkii nopan heittamista generoimalla satunnaisluvun valilta 1-6.
# Funktio palauttaa arvonaan nopanheiton tuloksen.
    
def heita_noppaa():
    SIVULKM = 6    
    return random.randrange(1, SIVULKM + 1)

Ennen pelin alkua ohjelman pitää pyytää satunnaislukugeneraattorin alustuksessa käytettävä siemenluku ja alustaa satunnaislukugeneraattori funktion alusta_noppa avulla. Peli toimii seuraavasti: Aluksi heitetään käyttäjän nopat ja ilmoitetaan niiden silmäluvut. Sen jälkeen ohjelma heittää tietokoneen nopat ja ilmoittaa niiden silmäluvut. Tämän jälkeen ohjelma ilmoittaa kummankin heittojen tulokset eli se tulostaa jonkin teksteistä "Suuri luku", "Pari", "Kolme samaa", "Nelja samaa", ja "Viisi samaa" tuloksen mukaan, sitten tekstin ", silmaluku" ja sitten samojen noppien silmäluvun tai suurimman nopan silmäluvun, jos viidessä nopassa ei ollut yhtään samaa silmälukua. Tämän jälkeen ohjelma selvittää, kumpi pelaajista voitti pelin, ja tulostaa joko "Sina voitit!", "Tietokone voitti!" tai "Tasapeli!" pelin lopputuloksen mukaan. Katso esimerkkiajosta tarkemmin, millaisia ohjelman tulosten pitää olla.

Vinkki 1:Pythonissa on olemassa listoille valmis metodi count, joka palauttaa tiedon siitä, kuinka monta kertaa parametrina annettu alkio esiintyy listassa. Esimerkiksi koodi

lista = [4, 5, 1, 4, 4]
print lista.count(4)
tulostaa luvun 3. Tätä metodia voi käyttää hyväksi, kun tutkii, onko noppalistassa esimerkiksi kolme samaa arvoa.

Vinkki 2:Ohjelman testausvaiheessa voi olla vaikeaa löytää tarpeeksi sellaisia testiajoja, joissa pelaaja saa kolme, neljä tai viisi samaa silmälukua. Voit testata näiden tapausten toimimista oikein sillä, että korvaat väliaikaisesti noppien arpomisen antamalla noppien silmäluvut suoraan ohjelmassa. (Jos olet suunnitellut ohjelmasi rakenteen järkevästi, tähän riittää yhden käskyn muutos.)

Testaa taas ohjelmaasi ajamalla sitä itse useita kertoja ennen kuin palautat sen Gobliniin. Palauta Gobliniin tiedosto noppapokeri.py.

Esimerkkejä ohjelman suorituksesta:

[ohjelman suoritus alkaa]
Anna siemenluku nopan alustamiseksi.
13
Peli alkaa. Heitetaan sinun noppasi.
Heiton tulos: [2, 5, 5, 6, 2]
Heitetaan tietokoneen nopat.
Heiton tulos: [2, 1, 2, 5, 1]
Sinun tuloksesi on
Pari, silmaluku 5
Tietokoneen tulos on
Pari, silmaluku 2
Sina voitit!
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Anna siemenluku nopan alustamiseksi.
18
Peli alkaa. Heitetaan sinun noppasi.
Heiton tulos: [2, 4, 3, 2, 3]
Heitetaan tietokoneen nopat.
Heiton tulos: [3, 3, 3, 2, 2]
Sinun tuloksesi on
Pari, silmaluku 3
Tietokoneen tulos on
Kolme samaa, silmaluku 3
Tietokone voitti!
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Anna siemenluku nopan alustamiseksi.
129
Peli alkaa. Heitetaan sinun noppasi.
Heiton tulos: [4, 5, 2, 6, 6]
Heitetaan tietokoneen nopat.
Heiton tulos: [6, 4, 2, 5, 1]
Sinun tuloksesi on
Pari, silmaluku 6
Tietokoneen tulos on
Suuri luku, silmaluku 6
Sina voitit!
[ohjelman suoritus päättyy]

Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomatus: ei tulosteta