Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Apua numeronarvauspeliin

Siili00 [09.07.2020 19:18:56]

#

import random #tuo moduulin random

print("Numeronarvauspeli")
print("Arvaa oikea numero voittaaksesi!")
print("Taso 1 sisältää numerot 1-10, taso 2 sisältää 1-20 ja taso 3 sisältää 1-30")
def arvo_luvut(): #luo funktion arvo_luvut
    pisteet = 0 #asettaa pisteiden arvoksi 0
    while True: #silmukka, joka toistetaan kunnes se rikotaan
        vaikeus = int(input("Anna vaikeusaste 1-3: ")) #kysyy vaikeusasteen
        if vaikeus == 1: #jos vaikeus on 1
            luku = random.randint(1, 10) #arpoo random luvun
        if vaikeus == 2:
            luku = random.randint(1, 20)
        if vaikeus == 3:
            luku = random.randint(1, 30)
        break #rikkoo silmukan, joten ohjelma jatkaa seuraavaan silmukkaan
    while True:
        arvaus = int(input("Arvaus: ")) #kysyy arvauksen
        if arvaus == luku: #jos arvaus on sama kuin luku
            print("Arvasit oikein!")
            print("Voitit!")
            pisteet = pisteet + 1 #lisää pisteiden arvoon 1
            print("Aloitetaanko uudestaan?")
            uudestaan = input("Kirjoita 'kyllä' aloittaaksesi uudestaan. Kirjoita mitä tahansa muuta lopettaaksesi: ") #kysyy haluaako käyttäjä aloittaa uudestaan
            if uudestaan == "kyllä":
                print("Aloitetaan uudestaan")
                arvo_luvut() #kutsuu funktion
            else:
                file = open("tiedosto.txt", "w") #avaa tiedoston kirjoittamista varten
                file.write(str(pisteet)) #kirjoittaa tiedostoon pisteet
                file.close() #sulkee tiedoston
                file = open("tiedosto.txt", "r") #avaa tiedoston lukemista varten
                data = file.read() #lukee tiedoston
                print("Pisteet: " + data) #tulostaa esim. Pisteet: 1
                file.close() #sulkee tiedoston
                break #rikkoo silmukan
        elif arvaus > luku:
            print("Luku on pienempi")
        else:
            print("Luku on suurempi")
arvo_luvut() #kutsuu funktion

Koodi on muuten toimiva, mutta lopettamisen kanssa on ongelma. Jos lopetan sen jälkeen kun olen pelannut kerran(en siis pelaa uudestaan), niin silloin kaikki toimii hyvin. Ongelma on siinä, että jos olen pelannut useammin kuin kerran(eli pelaan uudestaan kerran tai enemmän)ja sitten lopetan, niin ohjelma heittää minut toisen silmukan alkuun:
Kirjoita 'kyllä' aloittaaksesi uudestaan. Kirjoita mitä tahansa muuta lopettaaksesi: ei
Pisteet: 1
--> Arvaus: <--
Onko kellään mitään ideaa, miten tämän voisi korjata?
Haluasin, että koko ohjelma pysähtyy sen jälkeen kun lopetan. Onko tämä mahdollista?

Grez [09.07.2020 19:26:43]

#

Ongelma on pääpiirteissään se, että kutsut funktiota arvo_luvut uudelleen, kun käyttäjä haluaa pelata. Olisi loogisempaa tehdä uudelleenpelauksen tarkistus arvo_luvut ulkopuolella.

Sinänsä mielestäni funktion käyttö tuossa ohjelmassa on ihan turhaa ja jos funktiota haluaa käyttää, niin sen nimi olisi syytä olla vaikka "pelikierros" tms, kun se sisältää lukujen arpomisen lisäksi itse pelaamisenkin.

Järjestelin koodia vähän parempaan järjestykseen. En testannut, mutta saattaa toimiakin...

import random #tuo moduulin random

print("Numeronarvauspeli")
print("Arvaa oikea numero voittaaksesi!")
print("Taso 1 sisältää numerot 1-10, taso 2 sisältää 1-20 ja taso 3 sisältää 1-30")

pisteet = 0 #asettaa pisteiden arvoksi 0
while True: #Pelataan kunnes lopetataan
    vaikeus = int(input("Anna vaikeusaste 1-3: ")) #kysyy vaikeusasteen
    luku = random.randint(1, 10*vaikeus)
    while True:
        arvaus = int(input("Arvaus: ")) #kysyy arvauksen
        if arvaus == luku: #jos arvaus on sama kuin luku
            print("Arvasit oikein!")
            print("Voitit!")
            pisteet = pisteet + 1 #lisää pisteiden arvoon 1
            break #rikkoo silmukan
        elif arvaus > luku:
            print("Luku on pienempi")
        else:
            print("Luku on suurempi")

    print("Aloitetaanko uudestaan?")
    uudestaan = input("Kirjoita 'kyllä' aloittaaksesi uudestaan. Kirjoita mitä tahansa muuta lopettaaksesi: ") #kysyy haluaako käyttäjä aloittaa uudestaan
    if uudestaan == "kyllä":
        print("Aloitetaan uudestaan")
    else:
        file = open("tiedosto.txt", "w") #avaa tiedoston kirjoittamista varten
        file.write(str(pisteet)) #kirjoittaa tiedostoon pisteet
        file.close() #sulkee tiedoston
        file = open("tiedosto.txt", "r") #avaa tiedoston lukemista varten
        data = file.read() #lukee tiedoston
        print("Pisteet: " + data) #tulostaa esim. Pisteet: 1
        file.close() #sulkee tiedoston
        break #rikkoo silmukan

Siili00 [09.07.2020 19:40:24]

#

Hyvä idea, mutta haluaisin että ohjelma arpoo uudet luvut aina kun aloitetaan uudestaan. Koska siinä on kaksi silmukkaa, niin se aloittaa uudestaan vain viimeisimmän. Jos sen tekisi yhdellä silmukalla, niin sitten ohjelma arpoo uudet luvut aina jos käyttäjä vastaa väärin.

Grez [09.07.2020 19:45:18]

#

Siili00 kirjoitti:

Hyvä idea, mutta haluaisin että ohjelma arpoo uudet luvut aina kun aloitetaan uudestaan. Koska siinä on kaksi silmukkaa, niin se aloittaa uudestaan vain viimeisimmän. Jos sen tekisi yhdellä silmukalla, niin sitten ohjelma arpoo uudet luvut aina jos käyttäjä vastaa väärin.

En mielestäni sanonut, että se pitäisi tai kannattaisi tehdä yhdellä silmukalla.

Toki sen yhdelläkin silmukalla saisi tehtyä niin, että se arpoo numerot uudelleen (ja kysyy vaikeusasteen joka pelin välissä). Mutta mielestäni kaksi (sisäkkäistä) silmukkaa on loogisin malli, kuten edelliseen viestiini laittamassa esimerkissä on.

Siili00 [09.07.2020 20:00:32]

#

Jos ohjelmassa on kaksi sisäistä silmukkaa, niin jos aloittaa uudestaan, se aloittaa uudestaan vain sisemmän. Tällöin vaikeustason valitseminen jää pois kun aloittaa uudestaan. Sitten kun rikkoo silmukan, niin se menee vaikeustason valitsemiseen(jos siis kirjoittaa jotain muuta kuin kyllä).

Grez [09.07.2020 20:03:36]

#

Ehkä kannattaa kokeilla tuota laittamaani koodia, joka toimii ymmärtääkseni juuri niin kuin halusitkin, ja sitten tutkia miten se toimii.

Siili00 [09.07.2020 20:15:06]

#

Kiitos

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta