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.pyogtest.pyligger 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 medminstetil og medstørste- for eksempel vilrandint(1, 6)kunne gi resultatene1,2,3,4,5og6- og det blir tilfeldig resultat hver gang metoden kallesrandom.choice(liste): returnerer et tilfeldig valgt element fra listenlistehver 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
Kamppå samme måte somLag - Lag
Kamp-objekter medLagene 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
Nonedersom 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.