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:

from lag import Lag

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:

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å:

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:

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

For å levere:

  1. Logg inn på Devilry.
  2. Lever alle .py-filene
  3. 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.