Fredagsfordypning uke 7
Frist for innlevering: Mandag 9. oktober, kl 23:59
Dette er en oppgave i to deler som g?r ut p? ? simulere fotball og sp? hvem som vinner Eliteserien i ?r (en oppgave som egner seg veldig godt til klasser og objekter). Dette er f?rste del og den leveres f?r den siste obligatoriske oppgaven. Andre og siste del leveres etter den obligatioriske oppgaven.
Introduksjon
Programmet ditt skal etter hvert regne ut hvor stor sannsynlig det er at hvert lag havner p? hver plass p? tabellen. Programmet ditt trenger ikke v?re realistisk, men det m? involvere tilfeldige utfall av hver kamp, slik at det ikke blir de samme resultatene hver gang vi kj?rer programmet.
(PS: Du skal ikke beh?ve ? kunne noe om fotball for ? klare oppgavene. Hvis du opplever at vi bruker fotballbegreper som ikke gir mening, si fra p? Fredagsfordypning eller Discourse slik at vi kan forbedre oppgaveteksten.)
Oppgave 1: Lag
Filnavn: lag.py
Lag en klasse Lag
i filen lag.py
. Klassen Lag
skal inneholde informasjon om lag i Eliteserien. Det er 16 lag i serien, s? vi vil etter hvert trenge flere forskjellige Lag
-objekter med hver sine data.
Hvilke instansvariabler du bruker og hva metodene inneholder er opp til deg. Men alle Lag
-objektene m? oppf?re seg som beskrevet i grensesnittet under, slik at de kan brukes slik vi ?nsker senere:
Metode | Parameter:Type | Returverdi | Kommentar |
---|---|---|---|
__init__ | navn:str angrep:float forsvar:float | - | Konstrukt?r. Gir det nye objektet et navn og informasjon om hvor mange m?l de scorer (angrep ) og slipper inn (forsvar ) mot et gjennomsnittlig lag. |
navn | - | str | Henter navnet til laget. |
angrep | - | float | Henter hvor mange m?l de scorer mot et gjennomsnittlig lag (h?yere = bedre). |
forsvar | - | float | Henter hvor mange m?l de slipper inn mot et gjennomsnittlig lag (lavere = bedre). |
(PS: Legg merke til at self
ikke er tatt med blant parametrene, fordi alle metoder inkluderer denne parameteren per definisjon.)
Oppgave 2: Test av Lag-klassen
Filnavn: test.py
Lag et program som tester at alle metodene dine virker som de skal:
- Importer (gj?r synlig)
Lag
-klassen for testprogrammet ved ? bruke
from lag import Lag
- dette vil bare fungere dersom
lag.py
ogtest.py
ligger i samme mappe (s? s?rg for at de gj?r det).
- Lag objekter og test at lagenes navn, angrep og forsvar settes av konstrukt?ren og hentes av metodene (med de samme verdiene)
Hvis du trenger inspirasjon til lagenes navn og hvor mange m?l de typisk scorer og slipper inn, kan du ta en titt p? ?rets resultater her, men ikke bruk tid p? ? gj?re det veldig realistisk forel?pig.
Oppgave 3: Kamp
Filnavn: kamp.py
Neste steg er ? lage en klasse som skal simulere én fotballkamp mellom to Lag
-objekter. Som i oppgave 1 er grensesnittet gitt:
Metode | Parameter:Type | Returverdi | Kommentar |
---|---|---|---|
__init__ | hjemmelag:Lag bortelag:Lag | - | Konstrukt?r. Forteller det nye Kamp -objektet hvilke Lag som spiller kampen. |
hjemmelag | - | Lag | Returnerer Lag -objektet som representerer hjemmelaget. |
bortelag | - | Lag | Returnerer Lag -objektet som representerer bortelaget. |
spill | - | - | Simulerer en kamp, slik at den f?r et resultat (se nedenfor). |
m?l_hjemme | - | int (eller None ) | Returnerer antall m?l til hjemmelaget (None dersom kampen ikke er spilt enda) |
m?l_borte | - | int (eller None ) | Returnerer antall m?l til bortelaget (None dersom kampen ikke er spilt enda) |
S? til det store sp?rsm?let: Hvordan skal du lage spill
-metoden?
Du m? ha med et element av tilfeldighet, slik at samme kamp kan f? forskjellig resultat dersom vi simulerer flere sesonger etter hverandre. Hvordan du gj?r dette, er opp til deg, men her er noen funksjoner importert fra random
-pakken som kan v?re nyttige:
random.randint(minste, st?rste)
: returnerer et tilfeldig heltall et sted fra og medminste
til og medst?rste
- for eksempel vilrandint(1, 6)
kunne gi resultatene1
,2
,3
,4
,5
og6
- og det blir tilfeldig resultat hver gang metoden kallesrandom.choice(liste)
: returnerer et tilfeldig valgt element fra listenliste
hver gang metoden kallesrandom.random()
: returnerer et tilfeldig desimaltall mellom 0 og 1 hver gang metoden kalles
Denne pakken er en standard del av Python (ingen installasjon n?dvendig) og kan importeres med
import random
For ? f? et innblikk i hvor mange m?l det scores i en typisk fotballkamp, kan du se resultater fra ?rets sesong her.
Oppgave 4: Test av Kamp-klassen
Filnavn: test.py
Utvid test-programmet til ? teste Kamp
-klassen ogs?:
- Importer
Kamp
p? samme m?te somLag
- Lag
Kamp
-objekter medLag
ene du allerede laget i oppgave 2 (legg gjerne til flere om behov) - Sjekk at riktige lag returneres som hjemmelag og bortelag for hver kamp (hva er forskjellen p?
kamp2.hjemmelag().navn()
ogkamp2.hjemmelag()
?) - Sjekk at antall m?l til hjemme- og bortelaget begge blir
None
dersom kampen ikke er spilt (dvs. dersomspill
-metoden ikke er kalt enda) - Kall
spill
-metoden for flereKamp
-objekter (en gang per objekt) og sjekk at du f?r et tilfeldig antall m?l hver gang - la gjerne flere kamper inneholde akkurat de samme lagene s? du kan se at ulike kamper mellom samme lag f?r forskjellige utfall
Oppgave 5 (frivillig): Mer realistiske kamper
Filnavn: kamp.py
og test.py
I denne oppgaven vil du b?de endre p? klassen Kamp
og teste endringene du gj?r etterp?. At denne oppgaven er frivillig betyr at innleveringen egentlig er stor nok uten denne oppgaven, men om du har lyst og tid, s? vil du f? tilbakemelding p? denne ogs?.
Vel er det mange tilfeldigheter i fotball, men alt er ikke helt tilfeldig - vi skal n? utvide spill
-metoden til ? bli mer realistisk ved ? ta hensyn til f?lgende:
- Hvor gode lagene er til ? score m?l og hvor ?gode? de er til ? slippe inn m?l (denne informasjonen har
Lag
-objektene metoder som gir deg) - Hjemmelaget har en fordel av ? spille p? hjemmebane – hvis du tar med dette, m? du selv finne ut hvordan du skal modellere denne fordelen og hvor stor den skal v?re.
- Et realistisk antall m?l i gjennomsnitt: For 2022-sesongen var dette 3.25 m?l per kamp – hvis du f?r noe i n?rheten av dette hver gang, har du en ganske realistisk simulering (Hint: en m?te ? teste dette p? er p? en eller annen m?te ? lage en liste med totalt antall m?l (hjemmelagets m?l + bortelagets m?l) per kamp. For eksempel om vi har 3 kamper som ender 4-1, 0-0 og 3-4 vil listen inneholde
[5, 0, 7]
- for ? finne gjennomsnittet tar du summen av tallene i listen (sum(liste)
) og deler p? antall elementer (len(liste)
) som i dette tilfellet gir 12/3 = 4 m?l per kamp, i gjennomsnitt).
Hva skjer videre?
I ukene som kommer skal vi pr?ve ? finne ut hvem som kommer til ? vinne Eliteserien i ?r. For ? f? til det vil vi etter hvert lage mange Sesong
-objekter som simulerer en hel sesong med fotballkamper og regne ut hvor ofte hvert lag vinner n?r vi simulerer 10 000 sesonger.
Krav til innlevering
- Kun .py-filene skal leveres inn
- Programmet skal inneholde gode utskriftssetninger og kommentarer som gj?r det enkelt for bruker ? forst?.
For ? levere:
- Logg inn p? Devilry.
- Lever alle .py-filene
- Husk ? trykke lever/add delivery og sjekk deretter at innleveringen din er komplett. Du kan levere flere ganger, men alle filer m? v?re med i hver innlevering.