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 funktionKoodi 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 silmukanHyvä 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.