I denne oppskriften skal du bygge opp det klassiske spillet “Slagskip” trinn for trinn. Dette er et spill for to personer, og hver spiller trenger en micro:bit, altså trengs det to micro:biter til sammen. Dersom du ikke har noen å spille med kan du spille mot deg selv i forhåndsvisningen til makecode, da trenger du ikke fysiske micro:bit i det hele tatt.
Dette spillet er et såkalt symmetrisk spill hvor alt er likt for begge spillerne, så det er tilstrekkelig å lage ett enkelt program og lagre dette programmet på to micro:biter.
For at flere micro:biter skal kunne kommunisere med hverandre via radio, må de tilhøre samme radiogruppe. Litt forenklet kan du si at micro:biter med samme radiogruppe kan kommunisere med hverandre, og micro:biter med ulik radiogruppe ikke kan kommunisere med hverandre. Dersom dere er flere i samme rom som bruker micro:bit bør dere velge hver deres radiogruppe.
Ved start skal du sette din micro:bit til en eller annen radiogruppe, f.eks. 1. Du kan velge hvilket som helst tall mellom 0 og 255.
En figur i et spill kalles ofte en sprite, og på norsk kan vi oversette det med brikke. Nå skal du lage en brikke som du kan flytte rundt på skjermen ved å bruke knappene A og B. Når knapp A trykkes skal brikken flytte seg bortover og når knapp B trykkes skal brikken flyttes nedover. Når brikken kommer til kanten av brettet må du selv bestemme hvordan du vil få den til å skifte retning.
I løsningsforslaget er det vist to forskjellige måter å flytte brikken på, og det finnes sikkert enda flere måter å gjøre det på. Du kan selv velge hvilken måte du foretrekker. Så lenge du kan styre sprite dit du vil har du gjort det riktig.
Nå skal du opprette brikker for dine skip. Spillerne blir enige om hvor mange skip man skal benytte. Av og til ønsker man få skip og av og til ønsker man mange skip. Du skal lage en variabel som du kaller antall_skip. Du kan selv bestemme verdien på denne variabelen, men det kan være lurt å begrense antallet skip til et sted mellom 1 og 3.
Du skal også lage en variabel til å lagre alle skipene i. Denne skal du kalle mine_skip, og inntil videre skal du ikke gjøre noe med denne. Sjekk at variabelen mine_skip finnes når du går inn i menyen for Variabler. Hvis den ikke finnes må du lage den.
I Slagskip er det vanligvis spilleren som selv plasserer skipene der man vil. Ettersom du spiller på en datamaskin (micro:bit) kan datamaskinen plassere skipene på tilfeldige plasser for deg. Utplassering av skip skal bare gjøres én gang, og dette er gunstigst å gjøre på starten. Du bør bruke en “gjenta”-løkke (se i menyen under Løkker) til å lage like mange skip som du bestemte i forrige trinn. Det vil være en fordel for deg om du får brikkene som skal representere skip til å se annerledes ut enn den flyttbare brikken som du lagde tidligere. F.eks. kan du angi en annen lysstyrke eller angi en blinking på skipenes brikker ved å bruke angi-kommandoen fra Spill.
Ettersom antallet skip kan variere kan vi ikke lagre skipene på samme måte som vi lagrer variabelen sprite. sprite skal det bare finnes én av, men antall skip kan variere, og vi kan ikke ha et variabelt antall variabler. Derfor skal vi bruke den ene variabelen mine_skip som en tabell, og i denne ene tabellen kan du lagre så mange skip du vil. Spillet blir mer spennende dersom skipene blir plassert på tilfeldige steder.
I menyen for Spill finner du kommandoer for å sette poeng og sette liv. Ved oppstart av spillet skal du ha 0 poeng og like mange liv som du har skip. Hver gang du senker et fiendeskip skal du få ett poeng, og når du mister ett av dine egne skip skal du miste ett liv. Poengsummen forteller hvor mange fiendeskip du har senket og livene er dine gjenværende skip.
Ved å bruke knappene A og B er du nå i stand til å flytte brikken kalt sprite fram og tilbake og opp og ned på skjermen. Når du trykker på knappene A og B samtidig (altså A+B) skal du sende X- og Y-koordinaten du bomber til fiendens micro:bit.
Dette trinnet er valgfritt. Mange pleier å krysse ut felt man har bombet for å gjøre det lettere å huske hvilke felt man allerede har bombet og hvilke som må bombes. Dersom du ønsker å farge felt du allerede har bombet kan du opprette en ny brikke på den X- og Y-koordinaten du har bombet og angi en lav lysstyrke på denne brikken. Da vil de bombede feltene gløde svakt.
For at dette skal bli rettferdig må du også sjekke om de koordinatene den andre spilleren bomber treffer dine skip. Ettersom spillet er symmetrisk vil motspilleren din sende deg sammensatte tekster med samme format som du sendte til ham. Du må altså utvide spillet ditt med en “Når radio mottar tekst”-blokk til å håndtere innkommende bomber fra motspilleren.
Du trenger to variabler til å lagre X- og Y-koordinaten som motspilleren din bomber. Kall disse x og y. Du trenger en “når radio mottar tekst”-blokk fra Radio-menyen for å motta tekster og du trenger kommandoer fra Tekst-menyen for å dekode tekstene du mottar.
Løsningsforslaget legger opp til at informasjonen om hvor en spiller bomber skal sendes på formatet
X-koordinat | “x” (bokstaven x) | Y-koordinat |
Teksten består altså av tre deler og hver del består av ett tegn. De tre delene er satt sammen til en tekst på totalt tre tegn, f.eks. “0x4” (tilsvarer X=0,Y=4) og “3×2” (tilsvarer X=3,Y=2). Hvert tegn står på en fast plass i teksten, f.eks står x-koordinaten alltid først i teksten, og y-koordinaten sist i teksten. Vi mennesker er vant med at det første tallet i en rekkefølge er 1, deretter følger 2 og 3 osv. I de fleste programmeringsspråk begynner man derimot på 0 før 1, 2 og 3 følger. Det betyr at formatet på teksten du skal dekode blir:
Posisjon | 0 | 1 | 2 |
Tegnet på den aktuelle posisjonen | X-koordinat | “x” (bokstaven x) | Y-koordinat |
Du kan bruke kommandoen “del av tekst ved posisjon” til å hente ut en bestemt del av teksten, og ettersom alle delene består av kun ett tegn skal lengden på hver del du henter ut være 1. Deretter må du konvertere (altså gjøre om) tegnet til et tall:
Om ønskelig kan du slå sammen de to delene ovenfor til følgende:
Hvis du har et skip på den X- og Y-koordinaten fienden bomber må du fjerne dette skipet fra tabellen mine_skip samt sende en melding til fienden (bruk “radio send tall”-kommandoen) så han vet at han traff. Du må også miste ett liv for hvert skip fienden senker. Når alle dine skip er senket er spillet over.
Du kan bruke en “for element verdi av mine_skip-løkke til å gå gjennom alle dine skip og se om noen av dem er truffet. Hvis et skip er truffet må det fjernes fra tabellen mine_skip.
Ettersom spillet er symmetrisk, vil fienden gjøre akkurat det samme som du gjør. Dersom du treffer ett av fiendens skip vil du også motta tallet 1 via radio. Når det skjer skal du gi deg selv ett ekstra poeng. Dersom du har like mange poeng som det antallet skip dere startet med har du senket alle fiendens skip og spillet er derfor over.
Den årvåkne programmerer vil ha merket seg noen svakheter i dette spillet: