Dette er en fortsettelse av testoppgaven. Start med å gjøre oppgave 1 og 2 der hvis du ikke har gjort disse på forhånd.
Oppgave 3: Kjør spillet mange ganger
Vi er nå interesserte i å finne ut hvor ofte man vinner bilen om man spiller spillet mange ganger og gjør konsekvente valg:
- Hvor ofte vinner man bilen hvis man alltid bytter dør?
- Hvor ofte vinner man bilen hvis man alltid fortsetter med samme dør som man først valgte?
Oppgave 3a:
Vi ønsker nå å gjøre programmet uavhengig av brukerens input - vi lar spillet velge en tilfeldig dør på vegne av spilleren, slik at spillet kan kjøre mange ganger på kort tid uten at man trenger å skrive inn noe.
Hvis du sørger for å ha tilfeldig plassering av bilen og geitene, bør det ikke ha noe å si hva personen velger i starten, så vi kan droppe å ta input for å få det første valget. Endre i stedet det første valget til å være "hardkodet", bare sett valget til å alltid være f. eks dør 0.
Endre det andre valget til å alltid være at vi fortsetter med samme dør som vi initielt valgte (vi ønsker å se hva som skjer da).
Sørg for at det til slutt i prosedyren alltid printes hvorvidt man vant eller ikke. Unngå at det printes noe annet (vi ønsker ikke så mye output når spillet skal kjøres mange ganger).
Kjør prosedyren og sjekk at det ikke kreves noe user-input, og at spillet kjører med de "hardkodede" valgene og skriver ut det det skal. Bruk gjerne Python Tutor for å sjekke at det spillet gjør fungerer som du har tenkt og at det ikke er en "bug" i logikken.
Oppgave 3b
I uke 4 skal vi lære hvordan vi bruker en løkke til å repetere noe mange ganger. Hvis du har gjort dette før, kan du gjøre det nå, men det er absolutt ikke nødvendig. Vi kan heller motivere hvorfor løkker er en god idé med å gjøre det på den tungvinte måten og copy-paste prosedyrekallet spill() 100 ganger. Når du lærer om løkker neste uke, anbefaler vi på det sterkeste at du skriver om koden til å bli enklere og kortere, men foreløpig er dette godt nok.
Kjør programmet, og sjekk basert på outputen at spillet kjøres mange ganger.
Oppgave 3c
Vi ønsker nå å telle opp eksakt hvor ofte man vinner.
- Lag en variabel
antall_seiere = 0i starten av programmet. Denne ønsker vi å øke med 1 hver gang vi vinner. - I stedet for at prosedyren printer om man vant eller ikke, vil vi at prosedyren skal returnere om vi vant eller ikke. Du trenger ikke forstå hvordan returverdier fungerer før du lærer om det litt senere i kurset - det er greit om dette er litt "magisk" foreløpig (grunnen til at vi likevel gjør det på denne måten er at dere ikke skal utsettes for den stygge uvanen å bruke noe som kalles globale variabler i utide - det er bedre å gjøre det på en ordentlig måte fra første stund, selv om det innebærer at vi må jukse litt og bruke noe dere egentlig ikke har lært enda).
- Endre innholdet i prosedyren slik at det helt til slutt returneres enten 0 (vant ikke) eller 1 (vant):
# kode i prosedyren her ... if [sjekk for å vurdere om spilleren vant]: return 1 # vant else: return 0 # vant ikke
Prosedyren vil nå returnere en verdi til hovedprogrammet, som vi kan bruke til å endre verdien av en variabel der spill() kalles. Dermed kan vi øke telleren basert på denne verdien (den øker med 1 hvis spilleren vinner og øker med 0, dvs. forblir uendret, dersom spilleren taper):
antall_seiere = 0
antall_seiere += spill() # 'verdien' av spill() - dvs. returverdien - er 0 eller 1
antall_seiere += spill()
antall_seiere += spill()
# ...og så videre (100 ganger)
print("Antall seiere:", antall_seiere)
OBS: Teknisk sett er spill() nå ikke lenger en prosedyre, men noe vi kaller en funksjon, fordi den returnerer en verdi. Dette begrepet har sammenheng med matematiske funksjoner som også har returverdier:
y = f(x)
Oppgave 3d
Nå vil vi se hva som skjer hvis vi endrer spill() slik at i stedet for å beholde døren, velger spilleren alltid ny dør.
For å kunne bytte fram og tilbake mellom "behold dør" og "bytt dør" i prosedyren, lager vi en variabel som kan ha to verdier: 1 hvis vi skal bytte dør, eller 0 hvis vi ikke skal bytte dør.
def spill():
bytte = 1 # 1 betyr bytt dør, 0 betyr ikke bytt dør
# kode i prosedyren her ...
if bytte == 1:
# bytt til ny dør
# (hvis bytte == 0 gjør vi ingenting - behold gammel dør)
# resten av koden i prosedyren her ...
Kjør programmet flere ganger - noen ganger med bytte av dør, noen ganger uten. Ser det ut til å lønne seg å bytte dør, eller er det bedre å beholde den du valgte først?