Artikel top billede

(Foto: Computerworld)

Lav dit eget platformspil

Med Minecraft og en lille Raspberry Pi kan du selv skabe uendelig mange timers spil-fornøjelse.

Af Torben Okholm, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Minecraft har stille og roligt bredt sig siden lanceringen i 2009, og det er blevet en forrygende succes på tværs af mange forskellige platforme, herunder pc, Xbox 360 og PS3.

Hvis du aldrig før har leget med Minecraft, kan vi fortælle, at den grundlæggende præmis består i at grave forskellige materialer frem og bruge dem til at bygge genstande i spilverdenen. Minedrift er ganske nemt, men det er afgørende at overleve. Man kan udvinde træ, sten, kul og metaller. Af disse materialer kan man lave huse, broer, våben, værktøj og endda møbler til hjemmet.

Men Minecraft-verdenen er ikke så enkel, idet spillet bruger en dag og nat-cyklus som i det virkelige liv, blot speedet gevaldigt op. Om dagen er man i sikkerhed, omgivet af dejligt solskin og frodige grønne marker. Men om natten kommer monstrene frem for at jage en. Derfor skal man bygge et ly i løbet af dagen, så man er beskyttet mod de uhyrer, der kommer frem efter mørkets frembrud.

Der er dog et andet aspekt af Minecraft, og det skal vi se på her. Spillet har også en kreativ side. Her kan man lave, hvad man vil uden at blive forfulgt af monstre. Det er den version, der er til rådighed for Raspberry Pi. I denne version af spillet kan man bygge lige, hvad man vil. Det er som at have en stor kasse Lego-klodser. Det er naturligvis træls at bygge sten for sten, men frygt ikke. Hjælpen er nær i form af programmeringssproget Python.

Python?

Python er et virkelig sejt sprog, og det følger med Raspberry Pi. Med Python kan vi bygge huse, broer, byer og sågar rumraketter i Minecraft. Det er ikke svært at lære Python, og når man har greb om syntaksen (brugen af sproget), kan man skrive kode og bygge sit eget platformspil. Her bruger vi programmeringsbegreber såsom løkker, som gentager en handling mange gange, og vi kan endda lave en uendelig løkke, der bliver ved for evigt.

Folkene bag Minecraft har lavet et fantastisk sæt værktøjer, som gør, at vi kan bruge Python til at skabe herlige ting i vores spilverden.

I denne guide skal vi bygge en platform, der svarer til Mario-spillene, og vi bruger en timer for at gøre det til en udfordring at nå til vejs ende. Det hele bliver lavet ved hjælp af Python, og undervejs bruger og lærer du de grund-
læggende aspekter af kodning, og du lærer at lave et virkelig godt platformspil Minecraft er et tredimensionelt spil, og derfor har dets genstande en xyz-position, der identificerer deres placering.

Din verden er fuld af terninger og blokke, der alle har en relativ størrelse på 1 x 1 x 1 meter, og hver blok har en position i denne xyz-verden, hvor x og z er de vandrette positioner, og y er den lodrette.

Grundlæggende programmeringsbegreber

I Python har vi et væld af metoder til at løse ethvert tænkeligt problem, og det typiske er, at hver kode håndterer et problem på sin egen måde. Der er dog noget, der gælder for alle kodere, og det er programmeringslogikkens fundamentale byggesten. Lad os se på et par af dem og finde ud af, hvordan vi kan bruge dem i vores spil.

Sekvens

En sekvens er en samlebetegnelse for de trin, man gennemgår for at færdiggøre en opgave. Vores platformspil er én stor sekvens. Den har en begyndelse og en ende, og midt imellem har vi de trin, der er nødvendige, for at vi kan bygge genstande i vores spil.

Løkker

Som tidligere nævnt kan vi vælge at lade visse dele af vores kode gentage den samme proces igen og igen. Vi kan bruge en endeløs løkke. I Python hedder sådan en ‘while True’-løkke, og her er et eksempel, der printer ‘Hello’, indtil vi stropper det:
while True:
print “Hello”

Hvis man vil, kan man også bruge en ‘for’ til at gentage en løkke et nærmere angivet antal gange. Det kan være vældig praktisk, når man skal oprette et vist antal platforme eller blokke til et spil. Her er et eksempel på en ‘for’-løkke, der printer værdien af i, hver gang løkken bliver kørt.
for i in range(1,6):
print (i)

Variabler

Vi elsker variabler. De er kodens ubesungne helte. Vi bruger dem til at gemme ting, som var der tale om en stor, tom kasse. I vores spil kan vi gemme vores spillers position, antallet af platforme, som vi har brug for, og alt det, vi gerne vil bruge igen og igen.

Events

Man kan betragte en event som en slags aftrækker, der kickstarter en kodesekvens. I vores spil kunne vi for eksempel bruge den til at få en platform til at forsvinde – listigt!

Operatorer

Dem bruger man til at sammenligne stykker af kode og bruge en form for logik, der kaldes boolesk (opkaldt ef-ter matematikeren George Boole, der opfandt begrebet). Boolesk logik er sand eller falsk, også kendt som 1 eller 0. Vi kan sammenligne vores spillers xyz-position med det, der er gemt i en variabel, og hvis de to matcher (sand), kan vi køre noget speciel kode, der for eksempel kaster spilleren op i luften.

Her kan du se, hvordan du deler din verden med vennerne. Metoden bruger enten en statisk ip-adresse til dit hjemmenet eller en dynamisk DNS-tjeneste.

Hvis du imidlertid vil dele din verden med venner på det samme netværk, er det ikke nødvendigt. Du kan i stedet blot give vennerne din Raspberry Pis ip-adresse, som du kan finde ved at køre ifconfig i en terminal. Hvis du er forbundet via ethernet, skal du søge efter eth0. Hvis du er trådløst forbundet, skal du søge efter wlan0. Når du har fundet en af dem, bør ip-adressen være synlig, og det er den, dine venner skal bruge for at komme på din server.

Den komplette guide ligger på Martin O’Hanlons website (www.stuffaboutcode.com/2013/09/raspberry-pi-setup-minecraft-server.html), men her er en hurtig gennemgang af de vigtigste punkter. Overclock din Pi til Medium. Skift dens memory split til 16 MB. Genstart din Raspberry Pi. Download og installer Java, efterfulgt af Minecraft-serveren. Kør Minecraft-serveren med et bash-script ved navn start.sh.
I en terminal skriver du nano start.sh.

I nano skriver du:
/opt/jdk1.8.0/bin/java -Xms256M -Xmx496M -jar /home/pi/spigot.jar nogui

Martin gør også meget ud af, hvordan man forbedrer sin opsætning for at opnå de bedst mulige resultater. Hvis tanken om at køre en Minecraft-server med egen kode tiltaler dig, skal du gå til hans website, lave en kop kaffe og læse, hvad du skal gøre.

Konfigurer din Raspberry Pi med alle de nødvendige værktøjer

1 Download arkiv

Du anskaffer Minecraft ved at gå til https://github.com/lesp/Minecraft_Bookazine/blob/master/minecraft-pi-0.1.1.tar.gz og downloade arkivet til din Raspberry Pi. Sørg for, at du kan huske, hvor du har gemt det. Du skal nemlig bruge det i det næste trin.

Pak arkivets indhold ud på din Pi via terminalen. På skrivebordet dobbeltklikker du på LXTerminal-ikonet, hvorefter du går til det sted, hvor du downloadede arkivet. Brug kommandoen cd til at skifte mappe – for eksempel cd /home/pi/.

Brug terminalen til at udpakke arkivet:
tar -zxvf minecraft-pi-0.1.1.tar.gz
Tryk [Enter]. Nu myldrer en masse tekst rundt på skærmen. Derved fortæller kommandoen os, at den virker. Når det er slut, sender kommandoen dig tilbage til en prompt.

Lav din egen Minecraft-verden

1 Kør Minecraft

Under udpakningen af arkivet bliver der oprettet en ny mappe ved navn mcpi (du har sikkert gættet, at det står for Minecraft Pi). Vi skal ændre vores mappe til mcpi, og vi skal igen bruge kommandoen cd. Når det er gjort, skal du bruge kommandoen ls til at opregne mappens indhold. Søg efter minecraft-pi – det er Minecraft-applikationen. Nu er du klar til at gå i gang med din første verden.

Du starter Minecraft ved at skrive denne kommando i en terminal: ./minecraft-pi. Giv dig tid til at lege med Minecraft og vænne dig til, hvordan det virker. Opret derefter en ny verden. Når den er klar, bruger du tasterne [W], [A], [S] og [D] til at udforske den. Musen skifter synsvinkel, og den venstre museknap ødelægger blokke, hvorimod den højre placerer en blok.

Hvis du vil oprette genstande, mens du spiller Minecraft, skal du bygge dem mursten for mursten. Men hvis vi bruger Python, kan vi lave mange ting hurtigt. Vi skal bruge filen minecraft-api.py fra https://github.com/lesp/Minecraft_Bookazine/blob/master/minecraft-api.py og en applikation ved navn IDLE. Du kan finde et link til IDLE via ikonet på skrivebordet.

Når det er gjort, skal du oprette en mappe ved navn minecraft-api i din homemappe og kopiere hele indholdet af /home/pi/mcpi/api/python/mcpi (inklusive eventuelle mapper) til minecraft-api. Det er nemmest at bruge LXTerminal og skrive:
cp -r ~/mcpi/api/python/mcpi ~/minecraft-api/minecraft
Kommandoen cp betyder kopier filerne, og switchen -r sørger for at medtage undermapper. Kopier også den downloadede guidefil til denne mappe, så den er klar til næste trin.

Åbn filen minecraft-api.py i IDLE-editoren, og se på koden. Lad os først ændre den kode, der siger mc.postToChat (“Hello World”) til at sige “Velkommen til spillet”. Gem dit værk, og opret en ny Minecraft-kørsel med en verden. I IDLE klikker du ‘run’, der er i ‘Run’-menuen. Nu bør du kunne se din tekst på skærmen.

Vores spiller har en position, der bliver styret via xyz-koordinater. Vi kan tjekke, hvor vores spiller er, ved at bruge mc.player.getPos() og gemme outputtet til en variabel ved navn playerPos til senere brug. En anden mulighed er at bruge mc.player.SetTilePos(x,y,z) til at sætte din spiller ind. Vi ændrede y til 50, så kom spilleren ind i vores verden.

Man kan ikke have et platformspil uden platforme

1 Byg platformene

Nu skal vi bygger vores platform. For at gøre det nemmere bruger vi en ‘for’-løkke, der kører rundt et bestemt antal gange.
for more in range(0,21):
I dette tilfælde kører den rundt 20 gange og gentager denne kode:
mc.setBlock(playerPos.x + more, playerPos.y + more, playerPos.z + more, block.WOOD_PLANKS)
Denne kode bruger spillerens position som udgangspunkt og opbygger derefter træblokke: en blok frem, over og til siden for hver løkke. Resultatet bliver en vindeltrappe.

Efter at træblokkene er blevet bygget, vil vi bruge en anden form for blok. Her har vi valgt diamant, men der er mange andre at vælge imellem. Åbn en terminal, og gå til /home/pi/minecraft-api/minecraft, hvor du finder block.py. Åbn den i en teksteditor, og du vil se alle de blokke, du kan bruge. Hvorfor ikke ændre block.DIAMOND_BLOCK til dødbringende LAVA?

Vi vil have et udfordrende spil. Lad os lave et ur, der tæller ned. Vi oprettede en variabel ved navn clock og gav den værdien 30. Det er et heltal. Dernæst oprettede vi en ‘while’-løkke med denne betingelse:
while clock > 0:
Dette sammenligner clocks værdi, og hvis den overstiger 0, kører den et stykke kode.

Det stykke kode, der kører det, består kun af tre linjer, men det bliver gentaget, indtil clock svarer til 0:
mc.posttoChat(clock)
time.sleep(1)
clock = clock – 1
Først poster den variablens indhold på skærmen og venter et sekund. Hvis vi ikke havde gjort det, ville nedtællingen gå meget hurtigt. Til sidst ændrer vi værdien for vores variable clock ved at bede den tage variablens aktuelle værdi og derefter trække 1 fra den.

Der findes masser af fine Minecraft-ressourcer, der kan føre dit spil videre. Her er et par stykker, som vi stærkt kan anbefale.

www.stuffaboutcode.com
Martin O’Hanlon går varmt ind for at lære, mens man leger, og han har skabt en række guider og blogtekster, der viser, hvordan man kan gøre
nogle seje ting.

Martin har for eksempel genskabt Man-hattans skyline, og han har brugt Ordnance Survey-data til at skabe Minecraft-verdner, der bygger på eksisterende steder.
http://arghbox.wordpress.com

Craig Richardson har lavet et fantastisk sæt af ressourcer, der underviser i Python-kodning via CodeAcademys lektioner. Men hans udgangspunkt er at styrke disse lektioner med det samme koncept, der bliver skabt i Minecraft. Hans bog kan gratis downloades som PDF-fil, og den findes i to versioner: en til elever og en til lærere.

[themepacific_accordion]
[themepacific_accordion_section title="Fakta"]

Projektets mål

[/themepacific_accordion_section]
[themepacific_accordion_section title="Fakta"]

Krav

[/themepacific_accordion_section]
[themepacific_accordion_section title="Fakta"]

TopTip

[/themepacific_accordion_section]
[/themepacific_accordion]