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?
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
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.
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.
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ä).
Ehkä kannattaa kokeilla tuota laittamaani koodia, joka toimii ymmärtääkseni juuri niin kuin halusitkin, ja sitten tutkia miten se toimii.
Kiitos
Aihe on jo aika vanha, joten et voi enää vastata siihen.