Kierros 3, tehtävä 2

Lukupeli (150 p)

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

Tee Eclipseen uusi projekti, jonka nimi on tehtava3_2. Luo sitten tähän projektiin moduli lukupeli ja kirjoita siihen ohjelma, joka arpoo kokonaisluvun väliltä 1 - 1000 ja sen jälkeen pyytää käyttäjää arvaamaan tämän luvun. Jos käyttäjän arvaus on liian pieni, ohjelma tulostaa "Vaarin, luku on suurempi!" ja jos käyttäjän arvaus on liian suuri, ohjelma tulostaa "Vaarin, luku on pienempi!". Tätä jatketaan niin kauan, että käyttäjä on arvannut oikean luvun. Tällöin ohjelma tulostaa "Arvasit oikein, luku on todellakin N", missä N:n paikalla on arvattava luku. Lisäksi ohjelma kertoo, kuinka monta arvauskertaa käyttäjä käytti.

Luvun arpominen halutulta väliltä voidaan tehdä satunnaislukujen avulla. Seuraavassa kappaleessa on selostettu tarkemmin satunnaislukuja ja niiden käyttöä Python-ohjelmissa. Pystyt kuitenkin tekemään tehtävässä vaaditun ohjelman, vaikka et tutustuisi kappaleessa selitettyihin asioihin, jos käytät alla olevaa mallia. Kirjoita ohjelmatiedoston alkuun seuraavat rivit:

import random

def main():
    # "Arvotaan" satunnainen luku valilta 1-1000. 
    rivi = raw_input("Anna siemenluku.\n")
    siemenluku = int(rivi)
    random.seed(siemenluku)
    arvattava_luku = random.randrange(1, 1001)
    
    # Aloita oma koodisi tasta. Luku, jonka arvon kayttajan pitaa
    # arvata, on nyt muuttujan arvattava_luku arvona.
Sinun ei siis tarvitse itse kirjoittaa luvun arpovaa koodia, vaan se on jo tehty yllä annetussa ohjelman osasta. Seuraavassa kappaleessa on selitetty vähän tarkemmin annetun koodin merkitystä. Oman ratkaisusi kirjoittamista varten tärkeintä on kuitenkin tietää, että yllä olevan koodin suorituksen jälkeen arvottu luku on muuttujassa arvattava_luku. Sinun pitää kirjoittaa koodi, joka pyytää käyttäjältä uutta arvausta niin kauan, että käyttäjän antama luku on sama kuin muuttujan arvattava_luku arvo.

Satunnaisluvuista

Lukujen arpomista matkitaan tietokoneohjelmissa satunnaislukujen avulla. Satunnaisluku halutulta väliltä voidaan generoida Pythonin valmiin modulin random avulla. Tämä sisältää funktion randrange(alaraja, ylaraja), jonka avulla saadaan satunnainen kokonaisluku väliltä alaraja - (ylaraja - 1).

Tietokoneella ei voi varsinaisesti arpoa mitään, vaan tietokone tekee laskutoimituksia, joiden lopputulos on aina määrätty, jos laskennassa käytetyt luvut ovat tiedossa. Arpomista voidaan kuitenkin tietokoneella matkia laskemalla satunnaislukuja. Tällöin tietokone laskee ns. siemenluvun ja mahdollisen edellisen generoidun satunnaisluvun perusteella sopiviksi todetuilla matemaattisilla kaavoilla luvun halutulta väliltä. Ohjelmoija voi joko määrätä käytettävän siemenluvun tai sitten se voidaan määrätä jollain muulla perusteella, esimerkiksi tietokoneen kellon tämänhetkisestä ajasta. Siemenluku määrää (yhdessä käytettyjen laskukaavojen kanssa) täysin sen, millaisen jonon satunnaislukuja tietokone laskee. Jos kahdelle samanlaiselle (samoja laskukaavoja käyttävälle) satunnaislukugeneraattorille annetaan sama siemenluku, ne tuottavat samanlaisen jonon satunnaislukuja.

Jotta satunnaislukuja käyttävän modulin saisi käyttöön, on ohjelman alkuun kirjoitettava rivi

import random
Tässä ohjelmassa satunnaislukujen arpomisessa käytettävä siemenluku kysytään käyttäjältä ja asetetaan ohjelmassa. Tämä tehdään siksi, että ohjelma voitaisiin tarkistaa Goblinilla. Siemenluvun avulla pidetään huolta siitä, että palauttamasi ohjelma ja Goblinin käyttämä malliratkaisu arpovat samat arvattavat luvut. Simenluku asetetaan käskyllä
random.seed(siemenluku)
Tässä on käytetty hyväksi random-modulissa valmiina olevaa seed-funktiota. Sen jälkeen itse luku arvotaan käskyllä
random.randrange(1, 1001)

Ohjelman palautus

Ole tarkka siitä, että ohjelmasi tulostus on täsmälleen (välimerkkejä myöten) alla olevan mallin mukainen. Muista erityisesti lisätä rivinvaihtomerkki raw_input-käskyissä käyttäjälle annettavan pyynnön loppuun. (Näin ohjelman tarkastus Goblinilla sujuu ilman ylimääräisiä ongelmia.)

Palauta Gobliniin tiedosto lukupeli.py.

Kaksi esimerkkiä ohjelman suorituksesta:

[ohjelman suoritus alkaa]
Anna siemenluku.
19
Ajattelen lukua valilta 1-1000. Arvaa, mika se on!
Anna seuraava arvaus.
500
Vaarin, luku on suurempi!
Anna seuraava arvaus.
800
Vaarin, luku on pienempi!
Anna seuraava arvaus.
600
Vaarin, luku on suurempi!
Anna seuraava arvaus.
699
Vaarin, luku on pienempi!
Anna seuraava arvaus.
678
Arvasit oikein, luku todellakin on 678
Kaytit 5 arvauskertaa.
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Anna siemenluku.
563
Ajattelen lukua valilta 1-1000. Arvaa, mika se on!
Anna seuraava arvaus.
1005
Vaarin, luku on pienempi!
Anna seuraava arvaus.
-7
Vaarin, luku on suurempi!
Anna seuraava arvaus.
500
Vaarin, luku on suurempi!
Anna seuraava arvaus.
600
Vaarin, luku on pienempi!
Anna seuraava arvaus.
550
Vaarin, luku on pienempi!
Anna seuraava arvaus.
523
Vaarin, luku on pienempi!
Anna seuraava arvaus.
522
Arvasit oikein, luku todellakin on 522
Kaytit 7 arvauskertaa.
[ohjelman suoritus päättyy]

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