Obligatorisk innlevering uke 7
Frist for innlevering: 12.10. kl 23:59
Sp?rsm?l eller kommentarer til oppgaveteksten sendes til ivargry@ifi.uio.no.
Introduksjon
Denne innlevering er en innf?ring i hvordan vi kan bruke objektorientert programmering til ? representere og holde orden p? objekter i en verden. I neste innlevering tar vi dette videre ved ? bruke lignende objekter i et spill.
Vi skal her lage klasser for ? representere sauer og ulver, og ha en klasse som representerer verdenen disse dyrene befinner seg i. For hver klasse er det tester som skal kj?res for ? validere at klassen fungerer som den skal.
I neste oblig skal vi arbeide med en 2-dimensjonal verden, men for ? gj?re ting litt enklere skal vi her jobbe i en endimensjonal verden som best?r av 10 mulige posisjoner (1-10). Hvert dyr kan alts? befinne seg i posisjonen 1 til 10.
Denne uken er det ingen konkurranseoppgave.
Oppgave 1
Filnavn: sau.py
Lag en klasse Sau i filen sau.py.
Klassen skal ha en konstrukt?r med parameterene navn og posisjon og opprette instansvariablene _navn og
_posisjon som holder p? informasjonen. I tillegg skal klassen ha en instansvariabel _lever som i utgangspunktet
er satt til True. Denne variabelen skal representere hvorvidt sauen lever eller ikke.
Klassen skal ogs? ha noen metoder:
- En metode
blir_spist. Denne metoden skal senere bli kalt n?r en ulv spiser en sau, og metoden skal s?rge for ? sette_levertilFalse. - En metode
leversom returnererTruehvis sauen lever ogFalsehvis ikke. - En metode
hent_navnsom returnerer navnet til sauen og en metodehent_posisjonsom returnerer posisjonen til sauen.
Oppgave 2
Filnavn: test_sau.py
- Importer klassen
Sau:from sau import Sau - Lag et objekt av klassen Sau og sjekk at sauen lever. Hvis variabelen
saupeker p? et Sau-objekt, kan du sjekke at sauen lever slik:assert sau.lever(). Hvis du synesasserter vanskelig ? bruke, kan du i stedet bruke if /else-setninger for ? sjekke om ting fungerer som det skal. - Kall metoden
blir_spistp? sau-objektet og sjekk at sauen n? ikke lenger lever.
Oppgave 3
Filnavn: ulv.py
Lag en klasse Ulv i filen ulv.py.
Klassen skal ha en konstrukt?r med parametere navn og posisjon og tilsvarende instansvariable som holder
p? informasjonen. I tillegg skal ulven ha en instansvariabel _vekt som representerer vekten til ulven. Vekten er
alltid 20 i utgangspunktet.
Klassen skal ha f?lgende metoder:
spis_sausom tar et parameter sau. Her skal sauen sinblir_spist-metode bli kalt, og vekten til ulven skal ?kes med 5.hent_vektsom returnerer vekten til ulven- En metode
hent_navnsom returnerer navnet til ulven og en metodehent_posisjonsom returnerer posisjonen til ulven.
Oppgave 4:
Filnavn: test_sau_og_ulv.py
I filen test_sau_og_ulv.py skal vi teste at Sau- og Ulv-klassene fungerer som de skal ved ?
la en sau bli spist av en ulv. Gj?r f?lgende:
- Importer klassene
SauogUlv - Lag et sau-objekt og et ulv-objekt
- Sjekk at sauen lever
- Sjekk at vekten til ulven er 20
- La sauen bli spist av ulven ved ? kalle riktig metode med riktig parameter
- Sjekk at sauen er d?d
- Sjekk at ulven sin vekt n? er 25
Oppgave 5:
Filnavn: verden.py
Vi ?nsker n? en klasse Verden som kan holde orden p? sauene og ulvene.
Konstrukt?ren til klassen Verden skal ikke ta noen parametere, men initialisere to variable, _sauer og _ulver, som
holder p? sauene og ulvene i verdenen. Velg en passelig datastruktur.
Klassen skal ogs? ha f?lgende metoder:
opprett_dyr: Tar parameterenetype,navnogposisjon. Type vil alltid v?re enten teksttsrengen sau eller ulv, og metoden skal s?rge for ? opprette et objekt av dyret, og legge det til verdenen ved ? legge det til iself._ulverellerself._sauer.beskriv: Printer en beskrivelse av verdenen ved ? printe ut alle sauene og ulvene med navn og hvor de befinner seg. Print gjerne informasjonen om hvert dyr p? en ny linje.antall_sauer: Returnerer antall levende sauer i verdenen.antall_ulver: Returnerer antall ulver i verdenen (merk at ulver ikke kan d?).
Oppgave 6:
Filnavn: test_verden.py
Test klassen Verden:
- Husk ? importere klassen f?rst
- Lag deretter et objekt av klassen
- Opprett to sauer og én ulv og sjekk at
antall_sauerogantall_ulverreturnerer riktig tall. - Kall metoden
beskrivog sjekk selv visuelt ved ? se p? det som printes (ikke ved ? skrive kode) at informasjonen som printes er riktig.
Oppgave 7:
Utvide klassen Ulv med to nye metoder:
- En metode
beveg_hoyresom beveger ulven mot h?yre, dvs. ?ker posisjonen med 1. Hvis posisjonen ender opp med ? v?re st?rre enn 10, skal ulven komme ut igjen p? starten av verdenen og f? posisjonen 1. - En metode
beveg_venstresom tilsvarende beveger ulven mot venstre. Hvis posisjonen blir mindre enn 1, skal ulven f? posisjon 10.
Utvid klassen Verden med en metode oppdater. Denne metoden skal:
- Bevege hver ulv enten mot h?yre eller venstre (la det v?re tilfeldig, f. eks 50% sannsynlighet for h?yre og 50% sannsynlighet for venstre).
- Sjekke om noen av ulvene n? befinner seg p? samme posisjon som en levende sau. Hvis det skjer, skal ulven spise sauen og det skal printes navnet p? ulven som spiser og sauen som blir spist (f. eks Ulven K?re spiser sauen Bjarne p? posisjon 5)
Lag ogs? en metode finn_feiteste_ulv som returnerer ulven (et objekt) som veier mest.
Oppgave 8
Utvid test_verden.py ved ? legge til en h?ndfull sauer og ulver (du velger selv antall) og kall oppdater en del
ganger (f. eks 10 ganger). Print til slutt navnet p? den ulven som er feitest.
Krav til innlevering
- Kun .py-filene skal leveres inn.
- Sp?rsm?lene til innleveringen (nedenfor) skal besvares i kommentarfeltet.
- Koden skal inneholde gode kommentarer som forklarer hva programmet gj?r.
- Programmet skal inneholde gode utskriftssetninger som gj?r det enkelt for bruker ? forst?.
Hvordan levere oppgaven
Kommenter p? f?lgende sp?rsm?l i kommentarfeltet i Devilry. Sp?rsm?lene skal besvares.
- Hvordan synes du innleveringen var? Hva var enkelt og hva var vanskelig?
- Hvor lang tid (ca) brukte du p? innleveringen?
- Var det noen oppgaver du ikke fikk til? Hvis ja: i. Hvilke(n) oppave(r) er det som ikke fungerer i innleveringen? ii. Hvorfor tror du at oppgaven ikke fungerer? iii. Hva ville du gjort for ? f? oppgaven til ? fungere hvis du hadde mer tid?
For ? levere:
- Logg inn p? Devilry.
- Lever alle .py-filene , og husk ? svare p? sp?rsm?lene i kommentarfeltet.
- 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.
- Den obligatoriske innleveringen er minimum av hva du b?r ha programmert i l?pet av en uke. Du finner flere oppgaver for denne uken p? semestersiden.