Hacka Minecraft på Raspberry Pi

Raspberry Pi 2 är en förvånansvärt kapabel enhet, med tanke på dess pris under Kr30. Den kommer med en version av Minecraft förinstallerad, tillsammans med ett API som låter dig skriva kod som ska köras i den virtuella världen. Du gör detta i Python, vilket är enkelt att lära sig. Kombinationen av Pi, Python och Minecraft ger en fantastisk möjlighet att börja utforska möjligheterna med programmering. Och spänningen i att se ett hus bygga sig självt på ett virtuellt landskap är inte bara för barn heller.

Skript i Minecraft

Minecraft är ett öppet sandlådespel som inte har en handlingslinje att följa. Det beskrivs ibland som ”virtuellt Lego”, eftersom spelaren kan bygga vilken typ av struktur som helst med hjälp av klossarna till sitt förfogande. Versionen som följer med Raspberry Pi har en begränsad funktionsuppsättning anpassad till dess pedagogiska roll – så du behöver inte oroa dig för att bli jagad av till exempel zombies. Att interagera med den här världen kräver ingen speciell installation, bara en ny version av Raspbian OS plus en programmeringsmiljö. Jag skulle välja Geany, som du kan installera genom att öppna LXTerminal och skriva:

sudo apt-get install geany

Låt oss börja med att skapa ett manus för att bygga ett hus framför spelaren – men istället för att bara slå ett på plats, kommer vi att animera det. Vi kommer också att bygga in olika konfigurerbara inställningar, vilket gör att spelaren kan experimentera med olika dimensioner och material. Detta kommer också att göra programmet modulärt, så det kan användas som grund för att skapa mer sofistikerade brunnar.

För att få koden att fungera, ladda den i Geany och starta sedan Minecraft och skapa en ny värld. Tryck på Tab-tangenten för att släppa markören från Minecraft-fönstret och klicka på kuggikonen i Geany (eller tryck på F5) för att starta skriptet. Du bör se ett hus montera sig på magiskt sätt. Om du inte gör det, försök vända dig om – det kan vara bakom dig! Du kan se manuset i aktion här. Så hur fungerar manuset? Tja, först öppnas en länk till Minecraft:

importera mcpi.minecraft som minecraft, tid mc=minecraft.Minecraft.create()

I Python är det viktigt att vara uppmärksam på indrag, eftersom det är så koden är uppdelad i block. I det här fallet ligger båda raderna i linje med vänstermarginalen: den första raden importerar Minecraft- och Time-biblioteken och den andra skapar ett Minecraft-objekt som vi kan använda hela tiden. De nästa 25 raderna anger några variabler för blocken vi ska använda så att vi kan referera till dem som, säg, wood_planks snarare än med deras block-ID (5, i det här fallet). Vi anger sedan vilka av dessa block som ska användas för väggarna, vilka för taket och så vidare. Vi kan enkelt ändra husets konstruktion helt genom att byta ut tegelväggar mot till exempel kullersten. Slutligen ställer vi in ​​bredd, längd och höjd på vår önskade bostad.

Vi kallar nu Minecraft-funktionen mc.player.getTilePos() för att lokalisera spelaren i landskapet, och värdena som kommer tillbaka används sedan för att skapa två variabler, vänster och nederst, för att beskriva var det första hörnet av bostaden kommer att vara .

Därefter matchar manusets struktur Minecraft-processen att ”manuellt” bygga ett hus. Vi börjar med att rensa ett utrymme så att om spelaren väljer att bygga huset inuti, säg, ett berg, kommer vardagsrummet inte att vara av massiv sten. Här är kodblocket – funktionen i Python – som gör detta:

def clear_house(nukleär):
if nuclear==Sant:
blast_zone=20
annan:
blast_zone=0
mc.setBlocks(left-blast_zone,player_
mark, botten+sprängzon,vänster+bredd+sprängning_
zon, player_ground+höjd+sprängning_
zone+10,bottom-length-blast_zone,air_block)

När vi anropar clear_house skickar vi in ​​parametern nuclear. Det har värdet True eller False. Du kan prova att anropa den med True för att rensa en större volym runt målområdet, eller kalla den med False för att begränsa utrymmet till husets inre dimensioner. I Minecraft används funktionen mc.setBlocks för att skapa en kub av block genom att skicka koordinaterna, i tre dimensioner, till motsatta hörn följt av blocktypen du vill använda. I det här fallet rensar vi ett utrymme, så vi använder luft.

När vi har rensat utrymmet är det dags att gå vidare till bygget. Var och en av dessa byggnadsstadier sker i sin egen funktion. I slutet av skriptet ser du en funktion som heter main(), som styr programflödet genom att anropa varje fas av konstruktionen i tur och ordning. Genom att namnge våra funktioner förnuftigt och anropa dem från main() är det lätt att förstå vad programmet gör:

def main():
clear_house(False)
start_pos=[left,bottom,player_
ground]
build_floor(start_pos)
kurs=bygga_väggar(start_pos)
add_door(door_position)
time.sleep(fördröjning*10)
build_roof(start_pos, kurs)

Nästa funktion som kallas i main() bygger golvet – denna använder mc. setBlocks igen för att skapa en grund (för konstnärlig effekt) och sedan lägga till en kub av golvplattor med ett djup på ett block för att skapa ett solidt golv i vårt hus.

Bygger väggarna

Funktionen build_walls är hjärtat i programmet. Det mest effektiva sättet att skapa skalet till ett hus skulle vara att slå ner en rejäl kub av tegelstenar och sedan använda clear_house för att skära ut interiören. Vi vill dock att huset ska se ut att bygga sig självt, så vi måste placera blocken individuellt, efter varandra. Här är en förenklad version av väggbyggnadskoden:

def build_course(start_pos, riktning,
kurs):
block=1
current_horiz=start_pos[0]
current_vert=start_pos[1]

om riktning==”upp” eller
riktning==”nedåt”:
antal_block=längd
annan:
antal_block=bredd

medan blockerar
mc.setBlock(current_horiz,player_
mark+kurs, nuvarande_vert, väggblock)
om riktning==”upp”:
aktuell_vert-=1
elif direction==”nedåt”:
aktuell_vert+=1
elif direction==”höger”:
current_horiz+=1
annan:

current_horiz-=1
blocks=blocks+1 # gå vidare till nästa block
time.sleep(delay)

Vi börjar med att lagra startpositionen – detta kommer att vara positionen för det sista blocket som lagts från föregående block. Vi anger sedan hur många block som ska läggas, beroende på om vi ska längs med byggnaden eller dess bredd.

Byggfasen ryms inom while-blocket – detta fortsätter pågå tills vi har lagt alla block. mc.setBlock placerar ett enskilt block vid koordinaterna som visas och ökar sedan en av dessa koordinater beroende på i vilken riktning vi lägger. Effekten är att block läggs längs en vägg innan man vänder ett hörn och fortsätter i en rektangel tills banan är klar.

Den slutliga versionen av koden är lite mer involverad och lägger till fönster på varje vägg. Fönstren är dynamiskt dimensionerade så att de är halva väggens längd och centrerade. Den registrerar också positionen för dörren; det läggs till när väggarna är byggda. Banorna styrs från funktionen build_walls, som upprepar build_course-funktionen för varje bana av block tills den når den slutliga höjden.

Du kan till och med försöka bygga ditt hus i havet eller i luften – gör detta genom att dubbeltrycka på mellanslagstangenten för att flyga, tryck sedan igen för att höja dig innan du kör skriptet. Ändra variablerna wall_block och roof_block för att se vad som händer om du skapar väggarna eller taket av guld eller, faktiskt, lava. Du kan lägga till dina egna block genom att konsultera hela listan här, och lägga till den associerade variabeln till skriptet. Mer utmanande ändringar kan inkludera att lägga till flera våningar till strukturen om höjdvariabeln är inställd på ett tillräckligt stort värde. Träna ut hur du lägger till torn, till exempel, så har du förutsättningarna för ett Minecraft-slott.

Dessa justeringar kan låta triviala, men jag har programmerat professionellt i mer än 20 år och jag blir fortfarande glad när ett kodavsnitt fungerar som det är tänkt. Om du aldrig har programmerat förut hoppas jag att du ger det en chans – och om du har en Minecraft-fan i hushållet föreslår jag att du släpper lös dem på koden och ser vart det tar dem. Du hittar länkar till Minecraft Pi-resurser på kevpartner.co.uk/programming.

Lämna en kommentar

Din e-postadress kommer inte publiceras.