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_lever
tilFalse
. - En metode
lever
som returnererTrue
hvis sauen lever ogFalse
hvis ikke. - En metode
hent_navn
som returnerer navnet til sauen og en metodehent_posisjon
som 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
sau
peker p? et Sau-objekt, kan du sjekke at sauen lever slik:assert sau.lever()
. Hvis du synesassert
er vanskelig ? bruke, kan du i stedet bruke if /else-setninger for ? sjekke om ting fungerer som det skal. - Kall metoden
blir_spist
p? 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_sau
som tar et parameter sau. Her skal sauen sinblir_spist
-metode bli kalt, og vekten til ulven skal ?kes med 5.hent_vekt
som returnerer vekten til ulven- En metode
hent_navn
som returnerer navnet til ulven og en metodehent_posisjon
som 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
Sau
ogUlv
- 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
,navn
ogposisjon
. 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._ulver
ellerself._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_sauer
ogantall_ulver
returnerer riktig tall. - Kall metoden
beskriv
og 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_hoyre
som 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_venstre
som 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.