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:

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.

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?