Fredagsfordypning uke 8
Frist for innlevering: Mandag 6. november, 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 andre og siste del. Du m? ikke ha gjort f?rste del for ? gj?re denne delen.
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.)
Filer du trenger i disse oppgavene:
Oppgave 1: Simuler en fotballkamp
Filnavn: kamp.py
Hvis du har gjort forrige innlevering til Fredagsfordypning, kopierer du bare din hittil beste spill()
-metode inn i Kamp
-klassen og g?r direkte videre til oppgave 2.
Hvis du ikke har gjort forrige innlevering til Fredagsfordypning, kan spill()
-metoden implementeres slik:
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. Du kan teste at spill()
-metoden din virker ved ? bruke kamp_test.py
(ikke bry deg om tallene som viser hvor realistisk simuleringen er, det eneste viktige i denne oppgaven er at du f?r forskjellige resultater n?r du kj?rer kamp_test.py
flere ganger).
Oppgave 2: Les inn terminlisten
Filnavn: terminliste.py
(Dette er antakelig den mest tidkrevende oppgaven denne gangen.)
Kopier ?rets terminliste (med resultater) fra denne nettsiden og lagre det du kopierer i en tekstfil som du kaller rsssf2023.dat
(du kan godt gj?re dette i VS Code) og denne filen skal ligge i samme mappe som Python-filene dine.
Skriv f?rst ferdig konstrukt?ren til klassen Terminliste
slik at den leser filen linje for linje. Konstrukt?ren skal lage en ordbok som inneholder 30 elementer (ett for hver runde):
- Det er masse ting i filen du kan ignorere, som datoer, tabellen etter hver runde, og ting nederst i filen. Det du trenger ? lese inn er rundenummer (
Round 1
), kamper med resultat (Molde - Bod?/Glimt 1-3
) og uten resultat (V?lerenga - Troms?
). - N?kler skal v?re rundenummer, slik at n?r vi leser
Round 1
i tekstfilen, blir1
n?kkel i ordboken. - Verdier skal v?re lister med
Kamp
-objekter (ett objekt per kamp i runden). Lag
-objektene du trenger tilKamp
-objektene kan du hente fra ordbokenlagordbok
(som hentes fralagliste.py
) med lagnavn (dette leser du fra filen) som n?kkel.- Hvis kampen har et resultat av typen
Molde - Bod?/Glimt 1-3
betyr det 1 m?l til hjemmelaget og 3 m?l til bortelaget. For ? lage etKamp
-objekt uten resultat kan du bruke for eksempelKamp(hjemmelag, bortelag)
, mensKamp(hjemmelag, bortelag, 1, 3)
gir kampen resultatet1-3
. - Legg merke til at noen lagnavn har mellomrom som en del av navnet (
Sarpsborg 08
).Sandefjord
skal brukes, og ikkeSandefjord Fotball
som det st?r i tabellene (disse trenger vi uansett ikke ? lese inn).
OBS: terminliste.py
inneholder testkode som du kan bruke ved ? kj?re filen.
Oppgave 3: Spill alle kampene i en sesong
Filnavn: sesong.py
Sesong
-klassen er i stand til ? ta Terminliste
-objektet du laget i oppgave 2 og hente ut ordboken med rundene derfra. Men det er fortsatt en ting som mangler. Kampene som ikke er spilt, m? spilles (simuleres) p? den m?ten du definerte i oppgave 1. Dette m? du gj?re ved ? skrive ferdig metoden simuler()
i Sesong
som simulerer alle kampene som mangler resultat.
Her er grensesnittet til Kamp
-objektene, som vil v?re til hjelp her (merk at du trenger noen nye metoder som ikke var med i innleveringsoppgaven fra uke 7, og at vi for enkelhets skyld har utelatt konstrukt?ren i tabellen under):
Metode | Parameter:Type | Returverdi | Kommentar |
---|---|---|---|
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). |
ferdig | - | - | True hvis kampen har et resultat, False hvis den ikke har et resultat. |
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). |
__str__ | - | - | Magisk metode som gj?r at kampen kan printes slik som i filen fra oppgave 2: print(en_kamp) . |
OBS: sesong.py
inneholder testkode som du kan bruke ved ? kj?re filen.
Oppgave 4: Simuler 10 000 sesonger
Filnavn: fotballsimulator.py
I denne oppgaven f?r du ikke oppgitt et grensesnitt - her m? du isteden se p? koden i statistikk.py
for ? finne ut hva du kan bruke og hvordan.
Lag en program som gj?r f?lgende:
- Lag et
Statistikk
-objekt med lagene fralagliste.py
- Simulerer 10 000 forskjellige
Sesong
er - Etter at hver
Sesong
er ferdig simulert, lagre rangeringen iStatistikk
-objektet - Skriv til slutt ut plasseringene fra
Statistikk
en
Oppgave 5:
Filnavn: kamp.py
Hvis du har v?rt til stede p? Fredagsfordypning de siste to ukene, har du antakelig gjort dette allerede.
Hvis du p? en eller annen m?te vil ta hensyn til hvor gode lagene er, fungerer grensesnittet til Lag
-objektene slik:
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). |
Du kan bruke kamp_test.py
til ? se hvor realistisk din metode er (men ikke bruk altfor mye tid p? ? gj?re den perfekt).
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.