Python øvelse - labyrintspill
Dette er et mer avansert spill, hvor spilleren skal bevege seg i et hus (en labyrint) for å finne to objekter (nistepakke, vannflaske) og må ta med seg begge disse til utgangen av huset for å vinne. Treffer spilleren på et monster underveis har spilleren tapt. Spillet er tekstbasert, og er interaktivt. Under ser du hvordan man kan gå gjennom labyrinten og vinne:
For å kode dette spillet må man ha tunga rett i munnen. Her er det mange parenteser, kolon og innrykk som må være helt nøyaktige for at spillet skal virke som planlagt. Først lager vi en funksjon som viser instruksjonene for spillet. Det som står i grønt i den første funksjonen er det som vises for spilleren på skjermen.
Den andre funksjonen er å vise gjeldende status - hvor man er, hvilke objekter man har med seg og om det eventuelt er noen andre objekter i det rommet man har kommet til. Gjenstander er definert som en liste under funksjonen. Den er tom når vi starter.
Det neste steget i programmeringen er å angi rommene i labyrinten vår. Her må man være veldig nøye med parenteser, kolon og komma. Hvis man ikke har syntaksen på plass vil man få melding om syntaksfeil når man prøver å kjøre programmet. Du kan lese koden slik; det ene rommet vi har er hallen. Går vi sør kommer vi til kjøkkenet, til nord kommer vi til badet og går vi mot øst kommer vi til utgangen. Spilleren bruker kommandoene gå s, gå n, gå o for å komme til nye rom. I kjøkkenet har vi lagt til et objekt, en gjenstand - en nistepakke. Du kan nøste sammen så mange rom du vil, men pass på at det du lager er konsistent - hvis du kommer til badet ved å gå nord fra hallen vil det samtidig bety at hvis du går sørover fra badet vil du havne i hallen. Rent programmeringsmessig har det forsåvidt ingen betydning, men for de som skal løse oppgaven vil det bli nesten umulig hvis dette ikke stemmer.
Vi må plassere spilleren i et rom, og her er dette angitt til å starte i stua. Vi legger på en løkke slik at spillet fortsetter å gå til man enten har vunnet eller tapt. Her gjør vi også et funksjonskall slik at status (hvor man er, hva man har, hva man ser) blir skrevet ut. De to testene som kommer handler om hva som må til for å tape eller vinne, og ved å sette dem her vil disse testene kjøres hver gang man kommer inn i et nytt rom. Den første testen sier at man må ha med nistepakke og vannflaske, og finne utgangen for å vinne. Det holder altså ikke å bare finne utgangen uten disse to objektene. Den andre testen angir at hvis man kommer til badet vil man møte et monster, og følgelig tape. Break angir at spillet stoppes hvis en av disse to betingelsene oppfylles, hvis de ikke oppfylles går spillet videre.
Det som kanskje er det vanskeligste å forstå i koden er det som angir neste trekk - og som står mellom testene som sjekker om man vinner/taper og testene som sjekker hva man gjør hvis man velger kommandoen gå eller ta.
Kodelinjene som starter med move handler om å ta imot input fra brukeren om hva man velger å gjøre. Spilleren skal jo enten svare gå [retning] eller ta[objekt], Her vil split() dele dette opp slik at vi får en liste for å sette at gå s vil gi listen [gå, sør] og som brukes i testen som kommer etter. Dette er fordi vi først sjekker om det er gå eller ta som skrives - deretter skal vi enten bruke retning (og sjekke mot rooms) eller bruke objekt (som også sjekkes mot rom). Vi trenger derfor å dele opp svaret fra brukeren eller så måtte vi hatt to inputsetninger - en som spør hva du vil gjøre; gå eller ta - og deretter spør om enten retning eller objekt.
Disse testene sjekker hva man velger å gjøre; man kan gå eller man kan ta. Hvis man velger gå vil det først sjekkes at man kan gå den veien som blir angitt. Dette sjekkes opp mot rommene vi definerte tidligere i koden. Utgangspunktet er som du husker i stua, og ser vi på koden lenger oppe på siden ser vi at fra stua kan man gå til kjøkkenet (øst=o) eller til badet (vest=v). Ved å skrive gå o vil den derfor flytte ett rom (move[1]) og sette kjøkkenet til det nye gjeldende rommet. Prøver man å skrive gå s - som ikke er et alternativ - vil det skrives ut melding om at man ikke kan gå den veien.
På samme måte er den andre testen. Statusen som vi tidligere har gjort et funksjonskall på vil gi beskjed dersom det finnes et objekt (gjenstand) i rommet. Da kan man velge ta og navnet på objektet. Først sjekkes det om det finnes et objekt, det har vi tidligere definert i rom (rooms). Hvis det er et objekt vil dette legges i listen gjenstander (gjenstander +=), og så vil det slettes fra rommet (del-setningen sier at objektet som finnes i gjeldende rom skal slettes) slik at man ikke kan hente objektet flere ganger. Det skrives også en beskjed om at gjenstanden er tatt.