Livräknare

Bygg ett spel steg för steg med micro:bit där du förlorar liv om din micro:bit skakas! För att göra det ska vi använda en loop, variabel och om-sats.

Steg 1 Visa liv

Först ska vi bygga något som kan visa oss hjärtan, vilket är hur många liv vi har kvar i detta spel. Låt oss säga att man börjar med fyra liv, och man trycker på A knappen för att se dom.

Hur får man något att hända när man trycker på knapp A?

Hur kan vi visa fyra gånger ett hjärta?

I Input kategorin finns det block “när knapp A trycks”. Allt vi lägger i den kommer hända när knapp A trycks. För att visa ett hjärta tar vi blocket “visa ikon” från Grundläggande. För att visa ett hjärta fyra gånger kan man dra ut flera eller duplicera blocket.

Men om vi nu testar att trycka på A knappen visas ett hjärta som aldrig försvinner? Varför det? Varje “visa ikon”-block tänder vissa lampor, som gör att det ser ut som ett hjärta. Men det finns ingen instruktion för att släcka dom igen! Så det ska vi lägga till. För att släcka all lampor på en gång kan man antingen ta “visa lysdioder”-blocket (från Grundläggande) med alla fält grå, eller “rensa skärmen”-blocket från “mer” i Grundläggande. En skillnad mellan dom är att “rensa skärmen” går super snabbt, och “visa lysdioder” tar en liten stund. Så för att få våra hjärtan att släcka en liten stund behöver ett “rensa skärmen”-block bli följd av ett “pausa (ms)”-block med till exempel 200 millisekunder paus. Lägg till ett block efter varje hjärta och testa hur mycket millisekunder paus du tycker är bäst.

Coolt! Nu blinkar fyra hjärta på skärmen när vi trycker på A knappen. Äh vad många block det blev! Kan vi inte göra det lite smidigare, med mindre block? Visst kan vi det!

När man vill göra en sak flera gånger i rad, kan man ofta använda en loop för att skriva koden bara en gång och sen upprepa det. I vår vall vill vi visa ett hjärta, rensa skärmen, och pausa en liten stund. Dom tre block kan vi lägga i “upprepa 4 gånger gör”-blocket vilket vi hittar i Loopar kategorin.

Nu har vi kod som gör precis samma, men den är mycket kortare och lättare att läsa. Och om vi nu skulle vilja visa fler eller färre hjärtan behöver vi bara ändra en siffra (testa göra det!).

Steg 2 Förlora liv

Nästa steg är att vi ska tappa ett hjärta(“liv”) varje gång vår micro:bit skakas. Hur gör vi det?

Om vi har färre liv ska vi visa färre hjärtan när vi trycker på A knappen. Och det såg vi, kan vi nu enkelt göra genom att ändra siffran i “upprepa gånger”-blocket. Men för att det ska ändra sig medans programmet körs kan det inte vara vi som ändrar det i koden, det måste micro:bit själv hålla koll på och ändra. Hur gör man sånt?

När det finns någonting man vill hålla reda på och ändra medans ett program är igång, då är det dags att använda variabler. En variabel är en plats i minnet som man ger ett namn, och som innehåller ett värde vilket kan ändras.

I vårt fall vill vi hålla koll på hur många liv vi har, så vi skapar en variabel (längst uppe i kategorin Variabler) och kallar den “liv”. När spelet börjar vill vi börja med fyra liv, så i “vid start”-blocket lägger vi “sätt namnlös till 0” (från samma Variabler kategorin) och ändrar “namnlös” till “liv” och 0 till 4. Nu kan vi också dra in “liv”-blocket och lägga den i “upprepa gånger”-blocket istället för den fyra vi har där. Programmet borde fortfarande ge samma resultat just nu om vi testar.

Efter detta kan vi bygga till att man tappar ett liv när micro:bit skakas. I kategorin Input hittar vi “när skaka”-blocket som kan innehålla kod. Och där vill vi minska antal liv med ett. Det gör vi med “ändra namnlös med 1”-blocket från Variabler kategorin, där vi väljer “liv” och ersätter 1 med -1.

Dags att testa igen! I simulatorn kan vi låtsas att vi skakar micro:bit genom att trycka på den vita cirkeln bredvid ordet “shake”. Eller ännu bättre är att ladda ner programmet till din micro:bit, för då kan man skaka på riktigt.

Steg 3 Visa dödskalle

En sista detalj vi ska lägga till nu är att en dödskalle kommer visas när ingen liv finns kvar. Hur gör man det?

Om någonting ska hända bara vissa fall, beroende på omständigheter, ska man använda en om-sats (if-sats). Med dom kollar man om någonting är sant eller inte, och gör en sak ifall det var sant, och en annan sak (eller ingenting) om det var falskt.

Vad är det vi ska kolla på i detta fall, vad ska vi ställa för sant-falskt-fråga? Vi vill visa en dödskalle när det finns ingen liv kvar. Så när vår variabel “liv” innehåller 0. Då kan vi ställa frågan “är liv lika med noll?”. I kategorin Logik hittar vi “om då”-blocket för att bygga vår om-sats med, och där hittar vi också “lika med”-blocket för att bygga frågan. “Lika med” ska ligga istället för gråa “sant”-blocket som alltid ligger som en platshållare i “om då”. “Sant försvinner av sig självt när en annan fråga placeras över den. Lägg din variabel “liv” istället för en av nollor i “lika med”-blocket. På insidan av “om då” lägger vi blocket som visar ikon (som hjärta innan) och väljer dödskalle.

Nu har vi hittad på hur vi bygger vår om-sats. Men var ska den ligga? När ska vi kolla om det är sant och kanske visa en dödskalle?

Vi skulle kunna lägga den i “för alltid”-blocket. Då kollar programmet hela tiden om vi nån gång kommer ner till noll liv. Eller så kan vi lägga den i “när skaka”-blocket, efter att vi har ändrat på liv. Då visas dödskallen direkt när liv blir minskat till noll. Men det kommer se ut precis samma. Eller så kan vi lägga den i “när knapp A trycks”. Då visas den när vi trycker på knappen och har noll liv. Du får välja själv, och glöm inte att testa. Jag väljer lägga den när man trycker på knappen.

Vad händer nu?

En sak som är bra att lära sig inom programmering är att alltid förvänta sig konstiga värden och speciella fall. Det är därför det är viktig att testa sin kod. I koden ovanför, där vi har om-satsen i “när knapp A trycks”-blocket, funkar bra med att visa hjärtan och visa dödskalle när man har noll liv. Men vad händer i det speciella fall där man skakar micro:bitten 5 gånger eller fler och sen trycker A? Då visas ingen hjärta, men också ingen dödskalle. Det skulle vi kunna kalla en bugg, eftersom den borde visa en dödskalle när man inte har liv kvar. Kan du se vad som går fel?

Problemet uppstår på grund av att “liv” fortsätter minska för varje skakning, men vi visar bara en dödskalle om den är precis lika med noll. Hur ska vi fixa det?

Det finns flera sätt. Antingen kan vi anpassa villkoret i om-satsen, så att den visar en dödskalle när “liv är lika med eller mindre än noll” (≤). Eller så kan vi se till att “liv” aldrig blir negativt. Jag tycker det är lite mer logiskt, så jag tar den vägen.

Varje gång vi skakar minskar vi “liv” med 1. Men om vi inte vill att den blir negativt, ska vi bara minska om “liv” är större än noll. Det kan vi se till att kolla på med hjälp av en till om-sats.

Länk till koden.

Färdigt, eller?

Nu har vi byggt det spelet vi siktade på! Den gör vad den borde, och vi har även hittad och fixat en bugg. (Skriv i kommentar längst ner om du hittar fler buggar!)

Som ofta i programmering kan vi fortsätta med att hitta på roliga funktioner som man kan bygga in i spelet. Det är så vanligt att det har ett namn: “feature creep” (Wikipedia). Detta är när man bygger in massor med funktioner i ett program som egentligen inte var nödvändigt. Men när man håller på med att lära sig programmering och har kul är det bra att programmera och leka runt mycket. Så om du till exempel vill bygga in att man kan få tillbaka liv genom att lägga micro:bitten under stark ljus, eller något helt annat; gör det! Posta gärna en kommentar med din variant på spelet. Lycka till!

 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *