Mattespill - fra kidsakoder.no#
Forfatter: Geir Arne Hjelle
Url: https://oppgaver.kidsakoder.no/python/mattespill/mattespill
Omskrevet til Jupyter Notebook av Sigurd Rage USN
Introduksjon#
I denne leksjonen vil vi se litt nærmere på hvordan Python jobber med tall, og vi vil lage et enkelt mattespill. Vi vil også se hvordan vi kan gjøre ting tilfeldige.
Forutsetter kjennskap til print-funksjonen, variabler, if-tester og for-sløyfer.
Steg 1: De fire regneartene#
Python er, som de fleste programmeringsspråk, veldig glad i å regne. La oss se hvordan vi kan få Python til å regne for oss.
Vi begynner med å utforske hvordan vi kan bruke Python til å regne ut enkle mattestykker. Kjør koden under!
4/2
2.0
Når programmet kjører vil det skrive ut 4 tall. Kjenner du igjen disse tallene? Skjønner du hva symbolene * og / betyr? Endre gjerne på programmet og kjør det flere ganger til du skjønner hvordan Python bruker pluss, minus, gange og dele.
Steg 2: Vi kaster terning#
For å lage et mattespill vil vi bruke tilfeldige tall. Tilfeldige tall blir omtrent som å slå terning for å finne et tall.
For å lage tilfeldige tall skal vi bruke en ny Python-funksjon som heter randint (her er rand en forkortelse for random som betyr tilfeldig, og int en forkortelse for integer som betyr heltall). Denne funksjonen er ikke med i grunnpakken til Python, men ligger i stedet i et bibliotek kalt random. Vi må derfor fortelle Python at vi vil bruke dette biblioteket. I biblioteket følger det med mange forskjellige funksjoner for å generer tilfeldige tall, vi skal bruke funksjonen randint.
import random
print(random.randint(1, 6))
1
Når du kjører programmet vil det skrive ut et tilfeldig tall mellom 1 og 6. Kjør programmet flere ganger. Forandrer tallet seg?
Prøv selv å forandre programmet slik at det skriver ut tilfeldige tall mellom 1 og 20! Eller mellom -1 og 1.
Programmet viser hvordan vi kan late som om vi slår èn terning i Python. Men hvordan kan vi late som om vi slår to terninger, og ser summen av dem?
Vi kan også utvide programmet slik at det slår terning mange ganger. Dette gjør vi enklest med for-løkker. Hvis du for eksempel utvider programmet ditt som følger vil det se ut som om du slår to terninger 25 ganger:
import random
for i in range(25):
print(random.randint(1, 6) + random.randint(1, 6))
3
9
5
5
5
6
4
10
7
9
2
7
12
7
10
4
7
2
9
6
5
5
8
6
7
Steg 3: En liten matteprøve#
Vi kan nå bruke tilfeldige tall til å lage et enkelt mattespill. Vi begynner med å trekke to tilfeldige tall, og la Python gange dem sammen:
import random
tall1 = random.randint(2, 12)
tall2 = random.randint(2, 12)
print(tall1)
print(tall2)
8
10
Vi vil nå at Python skal gi oss en matteoppgave, kan vi bli spurt om å gange sammen tall1 og tall2? Vi legger til følgende kode. Hva skjer når du prøver å kjøre programmet?
print('Hva er ' + str(tall1) + ' ganger ' + str(tall2) + '?')
Hva er 8 ganger 10?
I kodesnutten over får vi en feilmelding og programmet stopper. Dette MÅ fikses før vi kan gå videre i eksemplene under. Du husker kanskje at vi kan bruke + for å sette sammen tekst? Men vi bruker også + for å plusse sammen tall. I linjen over prøver vi å bruke + på både tekst og tall, og da skjønner ikke Python helt hva vi mener.
For å fortelle Python at her vil vi egentlig sette sammen tekst må vi bruke funksjonen str for å gjøre om tallene til tekst (str er en forkortelse for streng, som er det vi kaller tekster på fagspråket). Endre den siste linjen slik at den ser slik ut i stedet, og kjør på nytt:
print(‘Hva er ‘ + str(tall1) + ‘ ganger ‘ + str(tall2) + ‘?’)
Virker programmet ditt bedre nå? Prøv å kjøre programmet flere ganger. Blir du stilt forskjellige spørsmål?
Neste steg er at vi vil kunne svare på mattestykket. Til dette bruker vi igjen funksjonen input. Se følgende kode:
svar = input()
print(svar)
---------------------------------------------------------------------------
StdinNotImplementedError Traceback (most recent call last)
Cell In[6], line 1
----> 1 svar = input()
3 print(svar)
File ~\anaconda3\lib\site-packages\ipykernel\kernelbase.py:1201, in Kernel.raw_input(self, prompt)
1199 if not self._allow_stdin:
1200 msg = "raw_input was called, but this frontend does not support input requests."
-> 1201 raise StdinNotImplementedError(msg)
1202 return self._input_request(
1203 str(prompt),
1204 self._parent_ident["shell"],
1205 self.get_parent("shell"),
1206 password=False,
1207 )
StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.
Legg merke til at programmet nå venter på at du skal skrive inn et svar i tekstfeltet
Vi skal nå få programmet til å sjekke at vi har svart riktig. For å gjøre dette skal vi bruke noe som heter if-tester. Disse kan sjekke om noe er sant, og vi vil bruke dem for å sjekke om det er sant at svaret ditt er likt med det faktiske svaret. Vi legger til en if-test nederst i programmet ditt slik som dette:
import random
tall1 = random.randint(2, 12)
tall2 = random.randint(2, 12)
print('Hva er ' + str(tall1) + ' ganger ' + str(tall2) + '?')
svar = input()
svar = int(svar)
if svar == tall1 * tall2:
print('Ja, svaret er ' + str(svar))
else:
print('Nei, det riktige svaret er ' + str(tall1 * tall2))
Hva er 2 ganger 11?
Ja, svaret er 22
Pass på at som i for-løkker må du skyve koden i if-testen inn mot høyre.
Kjør programmet ditt med forskjellige svar. Virker det? Hva skjer om du svarer feil på en oppgave? Hva skjer om du svarer riktig?
Hmm … det er et problem med programmet vårt. Programmet sier at vi svarer feil selv om vi svarer riktig!
Bug#
Dette er et eksempel på noe vi kaller en bug i et program. Programmet kjører, men det gjør ikke slik som vi hadde ment og forventet. Selve ordet bug betyr insekt, og grunnen til at dette ordet brukes er at i gamle dager var det faktisk et problem at insekter fløy inn i datamaskiner og ødela programmer!
Problemet med programmet vårt er ikke helt lett å finne, men siden programmet alltid sier at svaret vårt er feil må det bety at svar aldri er helt lik tall1 * tall2. Igjen er problemet at Python mener at tekst og tall er forskjellige ting.
Når vi bruker input til å lese inn svar vil dette alltid være tekst, selv om vi bare skriver inn tall. På samme måte som vi kan bruke str for å gjøre om tall til tekst kan vi bruke int for å gjøre om tekst til tall (husk at int er en forkortelse for integer som betyr heltall).
Endre if-linjen i programmet ditt til:
if int(svar) == tall1 * tall2:
Virker programmet bedre nå?
Steg 4: Telle riktige svar#
Det er litt kjedelig å alltid starte programmet på nytt. La oss prøve å stille flere mattestykker etter hverandre.
Hvordan kan vi lage en løkke slik at programmet stiller oss for eksempel 5 mattestykker på rad før det avsluttes? Prøv litt selv i det forrige kodevinduet før du går videre.
Til slutt vil vi at programmet også skal telle hvor mange riktige svar vi klarer. For å gjøre dette skal vi bruke en variabel som vi for eksempel kan kalle ant_rett. Når vi begynner spillet passer vi på at denne er 0 siden vi ikke har svart noenting enda. Hver gang vi svarer riktig kan vi så øke verdien av variabelen med 1. Om vi også legger til en melding til slutt om hvor mange riktige svar spilleren klarte vil programmet se omtrent ut som følger:
import random
ant_stykker = 5
ant_rett = 0
for i in range(ant_stykker):
svar = random.randint(2, 12)
tall = random.randint(2, 12)
produkt = svar * tall
print('Hva er ' + str(produkt) + ' delt på ' + str(tall) + '?')
svar = input()
if float(svar) == produkt / tall:
print('Ja, svaret er ' + svar)
ant_rett = ant_rett + 1
else:
print('Nei, det riktige svaret er ' + str(produkt / tall))
print('Du fikk ' + str(ant_rett) + ' av ' + str(ant_stykker))
Hva er 66 delt på 11?
Ja, svaret er 6
Hva er 30 delt på 3?
Ja, svaret er 10
Hva er 96 delt på 12?
Ja, svaret er 8
Hva er 36 delt på 12?
Ja, svaret er 3
Hva er 28 delt på 4?
Ja, svaret er 7
Du fikk 5 av 5
I programmet over kan du endre på antall regnestykker og hvilken regneoperasjon du vil trene. Hva skjer hvis du prøver å gjøre spillet om til et delespill?