Obligatorisk innlevering uke 10 (oblig nr. 8)
Frist for innlevering: 7. november kl 23:59
Sp?rsm?l eller kommentarer til oppgaveteksten sendes til ivargry@ifi.uio.no.
OBS! Tilbakemelding
Husk at man ikke vil f? forklarende tilbakemelding p? obligen med mindre man ber om det (skriv “?nsker tilbakemelding” ?verst i kommentaren i Devilry). Dersom en oppgave blir trukket for poeng vil man uansett f? en begrunnelse for trekket.
Introduksjon
Denne innleveringen bygger litt videre p? forrige innlevering, og m?let n? er ? pr?ve ? lage inteligente sauer som spiser s? mye gress som mulig og som unng?r ? bli spist av ulver. Det vil v?re en valgfri konkurranse som g?r ut p? ? lage den smarteste sauen.
? f? en sau til ? bevege seg noenlunde intelligent rundt p? spillbrettet er krevende. Det er mange ting man m? ta hensyn til, slik som:
- Hvor er ulven, og m? jeg passe meg for den n? eller er jeg trygg?
- Hvor er det gress?
- Hvordan beveger jeg meg mest effektivt for ? spise mest mulig gress?
- Er det steiner jeg m? unng? p? veien?
- Kan jeg klare ? spise et stykke gress uten ? bli spist av ulven?
- Risikerer jeg ? bli fanget hvis jeg beveger meg i en viss retning n??
- osv ..
? ta hensyn til alle disse tingene er vanskelig, og ? lage en kunstig intelligens som f?rer til optimale valg uansett bane vil v?re tiln?rmet umulig. I problemer som dette er det derfor vanlig ? gj?re en del forenklinger og lage en forenklet modell av problemet med en del antakelser. Dermed kan man l?se enklere og mer isolerte problemer som sammen delvis l?ser det st?rre problemet. Vi kommer til ? gj?re disse forenklingene fra forrige oblig:
- Vi tenker oss at sauer, ulver, gress og stein ikke kan befinne seg hvor som helst, men at banen best?r av 18 x 14 ruter p? 50x50px hver, og at hvert element befinner seg i en slik rute. Vi kan alts? tenke p? banen som et rutenett best?ende av relativt f? ruter og ikke som pixler p? en skjerm (slik det var i forrige innlevering).
- Sauer og ulver kan kun bevege seg én rute opp, ned, til venstre og til h?yre p? dette rutenettet. Vi kunne tillatt skr? bevegelser, men det vil gj?re ting en del mer komplisert.
- Det er til enhver tid kun én sau og én ulv p? banen. De som ?nsker kan gjerne eksperimentere med flere sauer (det vil fungere fint, men ?pner opp for veldig mye mer avanserte metoder for ? unng? ulvene, s?nn som 澳门葡京手机版app下载 mellom sauene).
- Sauen skal slippe ? tenke p? fart, hvilken pixel den er p? osv. Alt sauen trenger er ? vite hvor ting befinner seg p? brettet, og deretter bestemme seg for ? g? opp, ned, til venstre eller til h?yre. Det vil v?re prekode (som man ikke trenger ? r?re) som s?rger for at ting ser visuelt fint ut p? brettet og at dyrene beveger seg "smooth". I denne innleveringen skal man heller ikke gj?re noe med ulven eller andre objekter.
Prekode
Start med ? laste ned disse filene. Du trenger ikke ? sette deg inn i koden (den ligner mye p? det man skrev i forrige innlevering), men det kan v?re greit ? vite f?lgende:
- Spillbrettet tar n? ansvar for ? sjekke kollisjoner og bevege objektene pixel for pixel (s?nn at bevegelsene ikke blir hakkete). Sauen og ulven sier kun hvilken retning de skal g?, og spillbrettet beveger deretter objektene pixel for pixel i den retningen til de har kommet til en ny rute p? brettet. Man kan alts? tenke seg at alle objekter egentlig til enhver tid befinner seg i én rute (men det vil se ut som de glir over brettet).
- Sauen beveger seg n?yaktig dobbelt s? raskt som ulven. N?r sauen har flyttet seg to ruter, har ulven flyttet seg én rute.
- I prekoden ligger en implementasjon av en Ulv som er ganske god p? ? spise sauer. Det er denne ulven som vil bli brukt gjennom hele obligen og i den valgfrie konkuransen. Ulven vil alltid g? korteste vei mot n?rmeste sau (i v?rt tilfelle den ene sauen som er p? brettet) og ta hensyn til alle hindre n?r korteste veie beregnes. Der det er flere mulige veier som er like korte, vil en tilfeldig vei velges (men alltid den samme). Vi skal ikke r?re Ulv-klassen i denne obligen.
- En annen endring fra forrige innlevering er at ulver n? heller ikke kan g? p? steiner. Det gj?r det litt vanskeligere for ulven.
Oppgave 1: Lese baner fra fil
Sjekk f?rst at prekoden kj?rer uten ? krasje og at du f?r opp et spillbrett p? skjermen. Alt du skal trenge ? gj?re er ? kj?re:
python3 hovedprogram.py
(evt. kj?re hovedprogram.py p? den m?ten du vanligvis kj?rer et Python-program)
?verst i hovedprogram.py ser du at vi kaller spillbrett.legg_til_objekter_fra_fil("testbane1.txt")
, men metoden legg_til_objekter_fra_fil
i klassen Spillbrett gj?r ikke det den skal. Implementer denne metoden (fjern f?rst koden som er i metoden fra f?r):
- Hver linje i en banefil er p? formatet type[mellomrom]posisjon_venstre[mellomrom]posisjon_topp.
- Typen er enten "gress", "ulv", "sau" eller "stein"
- Opprett hvert objekt ved ? kalle riktig metode p? Spillbrett-objektet. Metodene fra forrige innlevering finnes (opprett_gress, opprett_ulv, opprett_stein og opprett_sau).
- Lag ogs? et par metoder for ? hente ut steiner og gress slik at vi slipper ? aksessere de private instansvariablene (disse vil du m?tte bruke senere).
Kj?r hovedprogram.py og sjekk at du f?r opp dette p? skjermen:
Oppgave 2: Sauehjerne
Hvis man har kode som skal utf?re én konkret oppgave kan det v?re lurt ? separere ut denne koden ved ? legge den i en egen klasse. Det gj?r ting mer ryddig og det er enklere ? teste koden.
Koden som avgj?r hvordan sauen beveger seg er et eksempel p? slik kode. Tidligere har vi hatt denne koden i Sau-klassen, men Sau-klassen har ogs? andre oppgaver. Koden som skal bestemme hvordan sauen beveger seg trenger kun ? ha kjennskap til spillbrettet, og oppgaven til denne koden er ? fortelle sauen hvilken retning den skal bevege seg.
- Lag en ny klasse
Sauehjerne
i en filsauehjerne.py
. Konstrukt?ren til klassen skal tasau
ogspillbrett
som parametere og lagre disse i instansvariable.sau
vil v?re en variabel som peker p?Sau
-objektet som denne sauehjernen h?rer til.spillbrett
peker p?Spillbrett
-objektet som sauen h?rer til. - Klassen skal ha en metode
velg_retning
som skal bli kalt n?r sauen "sp?r" hjernen sin om hvilken retning den skal g?. Implementervelg_retning
n? slik at den bare alltid returnerer "venstre". - Endre klassen
Sau
slik at det i konstrukt?ren blir opprettet etSauehjerne
-objekt som lagres i en instansvariabelself._sauehjerne
. - I klassen Sau finner du en metode
tenk
som n? setterself._retning
til ? v?re "ned". Endre koden her slik at du i stedet kaller sauehjernen sin metodevelg_retning
med riktig parametere og settself._retning
til ? v?re det som returneres fra den metoden. Spillbrettet vil alltid bevege sauen i den retningen somself._retning
er satt til. - Lag en metode
sauehjerne
i klassen Sau som bare returnerer sauehjernen (slik at vi kan f? tilgang til hjernen til en sau via et Sau-objekt).
Kj?r hovedprogram.py og sjekk at sauen beveger seg mot venstre. Det betyr i s? fall at sauen n? bruker hjernen sin og g?r den retningen hjernen sier at den skal g?.
Oppgave 3: Forbedre sauehjernen
Vi har n? en klasse Sauehjerne
som har et konkret sett med informasjon (et spillbrett og en sau den h?rer til) og en konkret oppgave: ? bestemme en retning ? g?.
Vi kan dermed steg for steg jobbe med denne klassen uten ? bry oss om resten av koden. Vi kan ogs? teste at hjernen fungerer som forventet uten ? m?tte kj?re hele programmet. Merk at vi ogs? kan lage ulike klasser som f?lger samme oppsett som Sauehjerne
(flere Sauehjerner) for ? teste ut ulike implementasjoner. Det eneste vi krever er at alle disse klassene tar samme parametere i konstrukt?ren (dvs at de har samme signatur) og at de implementerer metoden velg_retning
(alts? at de har samme grensesnitt).
Sauehjernen kommer til ? m?tte ta en del avgj?relser basert p? hvor andre ting befinner seg p? spillbrettet. Vi kommer ofte til ? m?tte vurdere avstander og retninger p? spillbrettet. Implementer disse metodene:
avstand_til_objekt
Metoden skal ta et parameter objekt
og returnere antall ruter sauen m? g? for ? komme til objektet. Husk at sauehjernen har tilgang til sauen gjennom self._sau
. Husk ogs? at vi n? ikke bryr oss om posisjonen i pixler til hvert objekt. Vi har forenklet ting ved ? anta at hvert objekt finnes i en rute. Alle klasser implementere n? metodene rute_venstre()
og rute_topp()
som gir antall ruter objektet befinner seg fra hhv. venstre side og toppen av brettet.
Ettersom sauer og ulver bare kan bevege seg mot venstre/h?yre og opp/ned ?nsker vi at avstanden skal reflektere det. Dette kalles "Manhatten distance". Se for deg at du st?r p? Manhatten hvor alle gater g?r opp/ned eller til siden og man ikke kan g? skr?tt. Avstanden fra et gatehj?rne til et annet blir antall gater man m? g? opp/ned pluss antall gater man m? g? til venstre/h?yre.
I v?rt tilfelle vil for eksempel antall ruter man m? g? til venstre/h?yre mellom to objekter v?re abs(objekt1.rute_venstre() - objekt2.rute_venstre())
. Bruk dette til ? implementere avstanden mellom objektet som tas inn som parameter og sauen som hjernen har tilgang til.
retninger_mot_objekt
Lag ogs? en metode retninger_mot_objekt
som tar et objekt som parameter og som returnerer en liste over alle "retninger" sauen kan g? for ? komme n?rmere objektet. Hvis objektet er rett over sauen skal listen [opp]
returneres. Hvis f. eks objektet er skr?tt over og til venstre for sauen skal listen ["opp", "venstre"]
returneres (rekkef?lgen i listen har ingen betydning), osv. Ignorer steiner og kanten p? spillbrettet her, metoden skal kun tenke at det finnes en sau og et objekt.
retninger_fra_objekt
Lag tilsvarende en metode retninger_fra_objekt
som returnerer en liste med alle retninger sauen kan g? for ? ?ke avstanden fra objektet. Retningene her vil v?re de motsatte retningene av de som returneres i retninger_mot_objekt
. Du kan alts? enten implementere denne metoden fra scratch, eller kalle retninger_mot_objekt
og g? gjennom retningene derifra og snu dem.
Oppgave 4: Test sauehjernen vi har laget s? langt
Sauehjernen v?r har n? noen metoder for ? "tenke" (dvs beregne avstander og retninger) men ber fortsatt alltid sauen g? mot venstre. F?r vi fortsetter ?nsker vi ? teste at hjernen tenker riktig.
Lag en fil test.py
. Importer Sauehjerne, Sau og Spillbrett ?verst i filen.
Test avstandsberegning
Lag en prosedyre test_avstand
. I prosedyren gj?r du f?lgende:
- Opprett et Spillbrett-objekt
- Lag et Sau-objekt (dette kan opprettes ved ? kalle
Sau
-klassen direkte, og trenger ikke ? legges til i spillbrettet). Sauen skal ha posisjon 400 fra venstre og 500 fra toppen av brettet. Dette tilsvarer rute nr. 8 fra venstre og rute nr. 10 fra toppen. - Lag et nytt Gress-objekt p? posisjon 100, 100 (dette trenger heller ikke ? legges til i spillbrettet, for vi skal kun bruke det til ? teste sauehjernen)
- Hent ut hjernen til Sauen ved ? kalle sauehjerne-metoden som du skrev i oppgave 2.
- Kall metoden
avstand_til_objekt
med gress-objektet som parameter og sjekk at avstanden som returneres er 14 (sauen m? bevege seg fra rute 8 til rute 2 mot venstre og fra rute 10 til rute 2 oppover, alts? 14 ruter).
Gjenta det over med 3 andre gress-objekter som befinner seg andre steder p? brettet. Regn ut avstanden for h?nd f?rst, gjerne ved ? tegne p? et ark, og sjekk at avstanden som Sauehjernen beregner stemmer med det du mener er riktig.
Bruk gjerne assert til ? gj?re disse sjekkene, f. eks slik:
assert hjerne.avstand_til_objekt(gress) == 14, "Avstanden er feil"
Hvis du er ukomfortabel med ? bruke assert, kan du bruke en if-test til ? printe en feilmelding hvis resultatet er feil:
if hjerne.avstand_til_objekt(gress) != 14:
print("Avstanden er feil, den skulle v?rt 14 men er ", hjerne.avstand_til_objekt(gress))
Test retningsberegning
Lag en prosedyre test_retning
. I prosedyren gj?r du f?lgende:
- Opprett et Spillbrett-objekt, et Sau-objekt og et Gress-objekt p? samme m?te som i
test_avstand
. - Kall metoden
retninger_mot_objekt
og sjekk at det som returneres stemmer. Gj?r dette flere ganger med ulike posisjoner, og la ogs? noen av disse testene testeretninger_fra_objekt
.
PS: Ettersom rekkef?lgen ikke spiller noen rolle kan du gj?re om det som returneres til en mengde ("set") og sammenligne mot en annen mengde for ? sjekke likhet (hvis du sammenligner lister vil Python si at listene er ulike om rekkef?lgen er ulik):
retninger = sauehjerne.retninger_mot_objekt(gress)
assert set(retninger) == set(["opp", "venstre"])
Oppgave 5: G? mot gress
Vi er n? klare for ? bruke det vi har laget av hjerne til ? la sauen f? gj?re noen smarte valg. Det f?rste vi ?nsker er ? pr?ve ? f? sauen v?r til ? bevege seg mot gress.
Finne n?rmeste gress
Lag f?rst en metode naermeste_gress()
i klassen Sauehjerne
. Denne metoden skal g? gjennom alle "gress" som ikke er spist i spillbrettet og returnere det gresset som er n?rmest sauen (her skal metoden avstand_til_objekt
brukes). Hvis mer enn ett gress har samme avstand og er n?rmest, har det ingenting ? si hvilket av de som returneres.
Gress-klassen har en metode er_spist()
som kan brukes for ? sjekke om gresset er spist eller ikke fra f?r. Hvis det ikke finnes noe gress igjen som ikke er spist, skal metoden returnere None
.
G? mot n?rmeste gress
Gj?r f?lgende i metoden velg_retning
i klassen Sauehjerne:
- Finn n?rmeste gress.
- Hvis n?rmeste gress ikke er None:
- Finn retningene som sauen kan g? for ? komme n?rmere dette gresset ved ? kalle metoden
retninger_mot_objekt
. - S?rg for at sauen beveger seg mot en av disse retningene ved ? returnere vilk?rlig en av disse retningene (det er helt greit ? bare returnere den f?rste retningen hvis det er flere).
- Finn retningene som sauen kan g? for ? komme n?rmere dette gresset ved ? kalle metoden
Kj?r hovedprogram.py og sjekk at sauen ser ut til ? bevege seg mot gress. At sauen blir spist p? et punkt er helt greit, men hvis sauen beveger seg vekk fra gresset er noe galt. S?rg for at dette ser ut til ? fungere f?r du fortsetter.
Oppgave 6: Unng? ulver
Vi har n? en sauehjerne som klarer ? tenke seg frem til hvilken retning den skal g? for ? spise gress (n?rmeste gress), men vi ?nsker gjerne at sauen ogs? skal pr?ve ? bevege seg vekk fra ulven.
Det er n? bare én ulv p? brettet, og denne kan hentes ut ved ? kalle ulv()
p? spillbrettet.
a
Utvid metoden velg_retning
slik at hvis ulven har avstand til sauen mindre eller lik 6, s? henter du ut retningene sauen m? bevege seg for ? komme seg vekk fra ulven. Sl? disse sammen med listen over retninger sauen vil bevege seg for ? komme til n?rmeste gress, men gang listen med to f?rst (slik at retningene vekk fra ulven kommer to ganger, du vil skj?nne hvorfor snart). Koden din vil alts? se litt slik ut (pseudokode):
retninger = []
# finn n?rmeste gress
# hvis det er noe n?rmeste gress, finn retningene mot n?rmeste gress:
retninger_mot_gress = self.retninger_mot_objekt(gress) # gress er her en variabel som peker p? det n?rmeste gresset
retninger.extend(retninger_mot_gress)
if [... ulv er n?rmere enn 6 ruter ...]:
retninger_vekk_fra_ulv = self.retninger_fra_objekt(self._spillbrett.ulv())
# gang retningene med 2 (gir en liste der hvert element kommer to ganger)
retninger_vekk_fra_ulv = retninger_vekk_fra_ulv * 2
# legg til retningene i listen over alle retninger
retninger.extend(retninger_vekk_fra_ulv)
Listen retninger
vil da inneholde en haug av retninger, der retningene vekk fra ulven kommer to ganger. Vi vil se p? denne listen som et sett med "stemmer" og ?nsker ? finne den retningen som har flest stemmer og f?lge den retningen. Vi lar ulve-stemmene telle dobbelt fordi vi anser det som viktigere ? unng? ulven enn ? spise gress.
b
Skriv en funksjon finn_vanligste_element_i_liste
som tar en liste som parameter og returnerer det elementet som finnes flest ganger i listen. Denne funksjonen trenger ikke noe informasjonen fra klassen Sauehjerne
s? den kan bare lages som en enslig funksjon i filen sauehjerne.py
utenfor klassen. Det gj?r det enklere ? teste den. Bruk for-l?kker for ? l?se dette problemet.
Lag en prosedyre test_finn_vanligste_element_i_liste
i filen test.py
som tester denne funksjonen, f. eks slik:
from sauehjerne import finn_vanligste_element_i_liste
def test_finn_vanligste_element_i_liste():
assert finn_vanligste_element_i_liste(["ned", "ned", "opp"]) == "ned"
assert finn_vanligste_element_i_liste(["ned", "venstre", "opp", "venstre"]) == "venstre"
## Legg gjerne inn et par tester til
c
Fullf?r metoden velg_retning
ved ? finne det vanligste element i listen retninger
. Dette vil v?re retningen som sauehjernen har mest lyst til ? bevege seg. Returner denne retningen.
Kj?r hovedprogram.py og sjekk at Sauen beveger seg mot gress helt til den er i n?rheten av ulven. Da b?r den bevege seg bort fra Ulven.
Oppgave 7: Komme seg rundt ulven
Hvis du har f?tt til oppgave 5 riktig, vil du merke at sauen beveger seg fra ulven, men ender opp p? enden av spillbrettet og blir st?ende og stange der. Dette skjer fordi den vil bort fra ulven, men ikke har noe annet som f?r den til ? g? til siden n?r den har kommet til enden av brettet.
En enkel og naiv m?te ? unng? dette problemet p? er f? sauen til ? fors?ke ? f?lge kanten av spillbrettet hvis den er ved kanten av spillbrettet.
Utvid velg_retning
metoden slik:
- Hvis sauen befinner seg p? h?yre kant av brettet (sauen sin
rute_venstre()
metode returnerer 17, som er den siste kolonnen) OG det er flest stemmer for ? g? til h?yre, endre valgt retning til ? v?re "ned". - Hvis ikke forrige punkt stemmer og sauen befinner seg helt ?verst p? brettet (sauen sin
rute_topp()
returnerer 0)) OG det er flest stemmer for ? g? oppover, endre valgt retning til ? v?re "hoeyre". - Hvis ikke de forrige punktene stemmer og sauen befinner seg p? venstre side av brettet OG det er flest stemmer for ? g? til venstre, endre valgt retning til ? v?re "opp".
- Hvis ikke de forrige punktene stemmer og sauen befinner seg p? bunnen av brettet (
rute_topp()
er 13) OG det er flest stemmer for ? g? nedover, endre valgt retning til ? v?re "venstre".
OBS: Reglene over b?r implementeres i den rekkef?lgen de st?r for ? fungere optimalt. Poenget er ? f?rst sjekke h?yre side f?r man sjekker toppen slik at f?rste regel vil sl? inn om sauen er i ?verste h?yre hj?rne (da ?nsker vi at sauen skal g? nedover og ikke mot h?yre for ? unng? ? st? fast).
Kj?r hovedprogram.py igjen. Hvis reglene dine virker b?r sauen bevege seg nedover n?r den kommer til enden av brettet og deretter komme seg forbi ulven (og ikke bli fanget p? en stund p? testbane1.txt).
Oppgave 8: Unng? hindre
Sauen v?r blir n? trukket mot gress, beveger seg vekk fra ulven og den unng?r ? l?se seg fast p? kantene til brettet (ved at den f?lger kanten i retning med klokka). Men sauen v?r er fortsatt d?rlig p? ? unng? hindre.
Endre hovedprogram.py slik at testbane2.txt brukes i stedet for testbane1.txt og kj?r programmet. Du vil trolig se at sauen etter hvert vil ?nske ? g? til venstre (mot n?rmeste gress) men stange i en stein som st?r i veien:
a
Lag en metode stein_finnes_i_retning
som tar et parameter retning
og som returnerer True
hvis det finnes en stein p? neste rute i den gitte retningen fra sauen og False
hvis ikke. I tilfellet vist p? bildet over skal f. eks metoden returnere True
hvis retningen som gis er "venstre" og False for alle andre retninger.
PS: Husk at du kan kalle metodene rute_venstre()
og rute_topp()
p? et Stein-objekt.
b
Lag en metode hinder_finnes_i_retning
som returnerer True
hvis det enten er en stein p? neste rute i den retningen eller hvis man er utenfor banen p? neste rute i den retningen. Den f?rste sjekken har du allerede gjort i metoden stein_finnes_i_retning
, s? unng? ? kopiere kode fra den metoden og kall heller stein_finnes_i_retning
fra hinder_finnes_i_retning
.
c
Utvid velg_retning
-metoden slik at det helt til slutt (etter at sjekken mot kanter er gjort) sjekkes om det finnes en stein i retningen som det er bestemt at sauen skal g?. Hvis det gj?r det, velg en annen retning ved ? velge en hvilken som helst retning hvor det ikke finnes et hinder (sjekk dette ved ? kalle hinder_finnes_i_retning
for de ulike mulige retningene som er igjen).
Hvis koden din fungerer som den skal n?, b?r sauen fint klare ? overleve p? testbane2.txt og gj?re det ganske bra p? testbane3.txt. Det er ikke noe krav at sauen din skal gj?re det bra p? alle banene, men reglene over b?r v?re implementert.
Pr?v gjerne ut de andre testbanene og se hva som skjer.
Oppgave 9: Valgfri oppgave, lag din egen sauehjerne
Lag din egen sauehjerne:
- Sauehjernen m? ligge i en fil
konkurranse_deltakernavn.py
og klassenavnet m? v?reSauehjerneDeltakernavn
der deltakernavnn/Deltakernavn er et valgfritt deltakernavn. - All kode m? skrives i den filen. Du kan skrive metoder i klassen og ogs? ha andre funksjoner/prosedyrer som ligger i filen, men ikke lag flere filer.
- Klassen M? ha en konstrukt?r som tar sau og spillbrett som parametere og den m? ha en metode
velg_retning
som returnerer enten opp, ned, hoeyre eller venstre. - Du velger selv hvordan du vil implementere denne hjernen. Du kan ta utgangspunkt i reglene og fremgangsm?ten i denne obligen, eller starte helt p? scratch med dine egne ideer.
Regler for konkurransen:
- Hvert spill utf?res med én sau og én ulv p? en ukjent bane. Sauen f?r 1 i score for hvert gress den spiser og 10 ekstra i score hvis den lever n?r spillet er ferdig.
- Hvert spill skjer over 3000 "runder". En runde er én kj?ring av oppdater-funksjonen i Pygame Zero, og sauen flytter 5 px p? en slik oppdatering. Sauen bruker alts? 10 runder p? ? flytte seg en rute. Du kan kalle
runde
-metoden til Spillbrett for ? hente ut rundenummeret, og i enkelte scenarioer kan det v?re greit ? vite hvor mye tid man har igjen. - Formatet p? konkurransen kan variere litt avhengig av antall bidrag som blir levert, men vil v?re noe slikt:
- Alle sauer spiller f?rst p? en ganske enkel bane og de med lavest score ryker ut av konkurransen (f. eks de 3 d?rligste, litt avhengig av antall bidrag).
- De sauene som er igjen spiller videre p? enten én ny bane eller flere baner (der scoren legges sammen for alle banene), og igjen ryker de med lavest score ut.
- Denne prosessen fortsetter p? gradvis vanskeligere baner til alle sauene har r?ket ut og det st?r igjen én vinner.
- Det kan alts? l?nne seg ? passe p? ? ikke gj?re det veldig d?rlig p? noen banetyper hvis man skal komme langt (i stedet for ? bruke for mye tid p? ? perfeksjonere spillet p? enkelte baner).
- Banene som brukes er ukjente, men vil kunne ligne litt p? banene som ligger i testbane1-7.txt.
- Sauen har ikke lov til ? bruke mer enn 0.2 sekunder p? ? "tenke". Prekoden vil printe en advarsel hvis det brukes for lang tid. Husk at kj?retiden kan variere litt avhengig av maskinen koden kj?res p?, s? det kan v?re lurt ? s?rge for ? ha litt ? g? p?. Under konkurransen vil enkelte tilfeller av kj?retid over 0.2 sekunder tillates, men hvis det skjer for ofte (eller man er langt over 0.2 sekunder) kan man bli diskvalifisert.
- Det er ikke lov ? aksessere Ulv-objektet via spillbrettet for ? finne ut hva ulven tenker eller har tenkt til ? gj?re.
- Det er ikke lov ? teleportere sauen (dvs endre posisjonen).
- Andre ting som ?penbart er "juks" og gir en stor fordel er ikke tillatt (sp?r gjerne om du er usikker) :)
Noen tips:
- Du kan endre tallet 3000 der Spillbrett-objektet blir opprettet i hovedprogram.py for ? kj?re et spill lenger. Men husk at tallet 3000 vil brukes i selve konkurransen.
- Lag gjerne dine egne baner for ? teste. Viktig: ulv m? alltid v?re den siste linjen i banen (fordi n?r ulven opprettes scanner den alle elementene som allerede er i banen).
- Fokuser p? ? f? s? h?y score som mulig p? s? mange baner som mulig. Scoren blir printet n?r et spill er over eller sauen d?r.
- Det er VELDIG lurt ? pr?ve ? automatisere testingen av ulike strategier, og ikke manuelt pr?ve ? fintune og teste strategier p? ulike baner (det kan ta veldig lang tid). Du kan kj?re hovedbane_ikkevisuell.py for ? raskt teste en hjerne uten ? vente p? at spillet kj?rer. Ta gjerne utgangspunkt i koden der for ? teste mange ulike hjerner p? mange ulike baner.
Lykke til!
Krav til innleveringen
- Sp?rsm?lene til innleveringen (nedenfor) skal besvares i kommentarfeltet i Devilry.
- Koden skal inneholde gode kommentarer som forklarer hva programmet gj?r.
Hvordan levere oppgaven
Lever f?lgende filer:
- sauehjerne.py (og evt. andre filer hvis du har delt opp koden i flere filer)
- spillbrett.py
- test.py
- konkurranse_deltakernavn.py (hvis du har et bidrag i konkurransen)
- Hvis du har endret noe i andre deler av prekoden (skal ikke v?re n?dvendig), lever ogs? de filene og kommenter hva du har endret.
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 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.