Annons

Har du alltid velat lära dig att koda men visste inte var du ska börja? Lär dig hur man styr Minecraft på Raspberry Pi med Python och lite enkel elektronik. Här är slutresultatet:

Du kommer att behöva en Pi 2 eller nyare för detta projekt, och även om du kan slutföra de flesta av dessa uppgifter via kommandoraden över Secure Shell (SSH), kommer denna tutorial att fokusera på kodning direkt på Pi.

Är du ny på Minecraft? Oroa dig inte - här är vårt Minecraft nybörjarguide The (Latecomer) Nybörjarguide till MinecraftOm du är sen på festen, oroa dig inte - den här omfattande nybörjarguiden har du täckt. Läs mer .

Introduktion till Minecraft Pi

Minecraft-Pi-Menu

Minecraft för Raspberry Pi har utvecklats för att lära och tänka (och det är gratis). Den levereras med ett applikationsprogrammeringsgränssnitt (API) som ger ett sätt för kod att enkelt prata med Minecraft. Det är lysande att lära sig att koda i Python, liksom komma igång med elektronik Nybörjarelektronik: 10 färdigheter du behöver vetaMånga av oss har aldrig ens rört en lödkolv - men att göra saker kan vara oerhört givande. Här är tio av de mest grundläggande DIY-elektronikfärdigheterna som hjälper dig komma igång.

instagram viewer
Läs mer .

Vad är Python?

Pytonorm är ett programmeringsspråk. Det är tolkad, vilket betyder att när du kör en Python-fil eller -program måste datorn göra en liten bit arbete åt filen först. Nackdelarna är att det kan betraktas som långsamt jämfört med sammanställda språk.

Fördelarna med tolkade språk är kodningens hastighet och deras vänlighet. Du behöver inte berätta för datorn Vad data du vill lagra, bara att du vill lagra något och datorn kommer att räkna ut vad du ska göra. Det finns naturligtvis undantag, och detta är en något förenklad vy, men programmering borde vara kul! Om du börjar gräva in i de komplexa tekniska detaljerna kan det bli lite mödosamt.

Python är skiftlägeskänslig. Detta är viktigt att veta, eftersom Python inte kommer att känna igen föremål även om de stavas korrekt om fallet är fel. "Dosomething ()" fungerar inte om metoden faktiskt kallas "DoSomething ()". Python använder också intryck. Andra programmeringsspråk kanske inte bryr sig om hur många indrag din kod har, medan Python gör vård. Indrag används för att berätta för Python var koden tillhör. Andra språk kan använda "Curly Braces" ({}) för att gruppera kod - Python använder inte dessa. Python använder en hash (#) för kommentarer, och kommentarer används för att berätta för andra utvecklare eller personer som tittar på koden vad en viss del gör eller varför den behövs. Python ignorerar någonting efter en hash.

Slutligen finns det två huvudversioner av Python - Python 2.7.x och Python 3.x. Det finns vissa skillnader mellan de två (vad är skillnaderna?). Denna handledning kommer att använda Python 3.

Första installationen

Att tillhandahålla din Pi är redan installera och köra Raspbian Hur man installerar ett operativsystem på en Raspberry PiSå här installerar du ett operativsystem på din Raspberry Pi och hur du klonerar din perfekta installation för snabb katastrofåterställning. Läs mer , det behövs inte mycket initial installation.

Öppen terminal (Meny> Tillbehör> Terminal) och kör detta kommando. Det är alltid god praxis att hålla lagringslistan uppdaterad, och detta hämtar den senaste listan över program (den kommer inte att ladda ner själva programmen, detta hjälper Pi att veta vilka program som heter och var de kan hitta dem).

sudo apt-get-uppdatering. 

Uppdatera nu Pi (det kan ta en stund):

sudo apt-get upgrade. 

Python och Minecraft Pi är redan installerade, men om Minecraft Pi inte är installerat av någon anledning, det är enkelt att installera 5 sätt att installera programvara på Raspberry PiFör att göra något med en Raspberry Pi, måste du veta hur du installerar ett operativsystem och programvara för att köra på det. Om du är ny på Linux kan det vara skrämmande. Läs mer :

sudo apt-get install minecraft-pi

Navigera till dokument och skapa en ny mapp som heter "Minecraft":

cd-dokument / mkdir Minecraft

Du kan se innehållet i den nya mappen:

ls

Här är ett tips - om du börjar skriva och trycker på TAB-tangenten kommer kommandoraden att försöka fullfölja uttalandet för dig.

Du kan undersöka sökvägen till den aktuella katalogen med pwd, som står för Print Working Directory:

pwd

Starta Minecraft genom att gå till Meny> Spel> Minecraft Pi. Du behöver detta köras, men kommer tillbaka till det senare.

Öppna Python 3 från Meny> Programmering> Python 3 (IDLE). Detta program ger dig ett sätt att köra Python-kommandon och skriva program.

Nu kan du skriva dina Python-kommandon här, men det är inte så praktiskt. Gå till Fil> Ny fil och då Arkiv> Spara och spara detta i mappen du skapade tidigare. (Dokument> Minecraft). Låt oss kalla det "hello_world.py“. Du behöver inte använda .py-tillägget, det läggs till automatiskt, men det är bra praxis.

Om du växlar tillbaka till terminalen och navigerar till Minecraft-mappen bör du se filen du just skapade:

cd Minecraft / ls

Du kan köra den här filen så här:

python hej_världen

Lägg märke till hur "python" är små bokstäver. Detta måste vara före filnamnet, eftersom det säger till Pi att följande fil är Python, så den bör köras som sådan.

Byt tillbaka till Python-redigeraren och skriv:

tryck "Hej världen!"

Spara den här filen och kör den igen - nu bör du se "Hej, världen!" visas i kommandoraden - snyggt! Utskriftskommandot berättar helt enkelt för Python att skriva ut följande text i dubbla citat. Det här är bra, men inte särskilt användbart för Minecraft, låt oss koppla upp det:

från mcpi.minecraft import Minecraft mc = Minecraft.create () mc.postToChat ("Hej, världen!")

Om du sparar och kör den här filen, bör du se "Hej, världen!" visas i Minecraft-spelet. Låt oss fördela koden:

från mcpi.minecraft-import Minecraft

Denna rad berättar för Python att du vill använda kod från en annan fil. Denna mcpi.minecraft-fil har utvecklats för att möjliggöra enkel kontroll av Minecraft.

mc = Minecraft.create ()

Den här linjen skapar ett objekt som heter "mc" (Minecraft). Du måste skapa detta för att tillåta kommunikation till Minecraft-spelet - det räcker inte bara att inkludera filen.

mc.postToChat ("Hej, världen!")

Slutligen berättar denna rad Minecraft att skriva lite text till chatten. Prova att ändra "Hej, världen!" till något annat och se vad som händer, men kom ihåg att inkludera båda dubbla citat. Om du har programvaruproblem är dessa några vanliga Python- och Minecraft Pi-fel:

  • AttributeError - detta är en skrivfel, som pint eller prnt istället för utskrift
  • NameError: namn 'Minecraft' är inte definierat - kom ihåg att importera de moduler du behöver
  • NameError: namn 'true' är inte definierat - Python är skiftlägeskänsligt, ändra till "True"
  • socket.error: [Errno 111] Anslutning avvisades - Se till att Minecraft körs

projekt

Nu när du känner till grunderna i Python och Minecraft, låt oss göra några coola projekt. Allt codecan kan laddas ner från github.

Automated Bridge Builder

Minecraft-Pi-brobyggare

Detta program kommer effektivt att bygga en bro över vatten. När spelaren kommer nära en vattenmassa kommer programmet att konvertera flera block till sten. Eftersom Minecraft använder ett koordinatsystem är det mycket enkelt att få platsen för spelaren, tillsammans med typen av block runt spelaren. Minecraft Pi är något begränsat, så det är inte möjligt att uppdatera flera olika block i bulk. Du kan dock enkelt koda detta beteende själv.

Skapa en ny fil (Fil> Ny fil) och spara det som "bridge_builder.py“.

från mcpi.minecraft-import Minecraft. mc = Minecraft.create () # skapa Minecraft-objekt medan det är sant: x, y, z = mc.player.getPos () # lagra spelarens position # lagra de omgivande blocken a = mc.getBlock (x, y - 1, z + 1) b = mc.getBlock (x, y - 1, z - 1) c = mc.getBlock (x - 1, y - 1, z) d = mc.getBlock (x + 1, y - 1, z) om a == 8 eller a == 9 eller b == 8 eller b == 9 eller c == 8 eller c == 9 eller d == 8 eller d == 9: # 8 eller 9 är vatten. Ställ omgivande block på golvet på en fast (sten) om vatten hittas mc.setBlocks (x, y - 1, z, x + 1, y - 1, z + 1, 1) mc.setBlocks (x, y - 1, z, x - 1, y - 1, z - 1, 1) mc.setBlock (x, y - 1, z, x - 1, y - 1, z + 1, 1) mc .setBlock (x, y - 1, z, x + 1, y - 1, z - 1, 1)

Lägg märke till hur y-värdet faktiskt ser på y - 1. Detta är golvnivån. Om värdet på y användes skulle skriptet leta efter block på ungefär knänivå - det skulle inte fungera särskilt bra! Mc.getBlock () returnerar id för ett block för de givna koordinaterna. Eftersom x, y och z är koordinaterna för spelaren, kan du lägga till eller subtrahera från dem för att få positioner runt spelaren. Du behöver inte använda värdena x, y och z, du kan använda valfritt nummer, men du kanske inte vet hur det specifika blocket relaterar till spelaren - det är bättre att använda värden i förhållande till spelaren. Kör den här filen från kommandoraden och se vad som händer.

Du bör se att ett litet markområde förvandlas till sten när spelaren når en vattenmassa. Det är inte bra - du kan gå tillräckligt snabbt för att orsaka problem. Du kan lösa detta genom att konvertera en större volym vatten till land. Den sista delen av metoden mc.setBlocks () är block-id. Den ena är block-id för sten. Du kan ändra detta till trä, gräs eller vad som helst. Om du ville, kan du ganska enkelt konvertera detta till en komplex design - kanske en hängbro!

Super Mining-knapp

Minecraft-Pi-Super-Mine

Detta exempel kommer att göra kort gruvdrift. Den består av en fysisk knapp, som när den trycks ned kommer att bryta 10 block kuberade. Låt oss börja med knappen. I likhet med knapparna på Arduino behöver du en liten mängd elektronik, som alla bör hittas i en grundläggande startpaket Vad finns i ditt Arduino-startpaket? [Arduino nybörjare]Inför en låda full av elektroniska komponenter är det lätt att bli överväldigad. Här är en guide till exakt vad du hittar i ditt kit. Läs mer :

  • 1 x brödbräda
  • 1 x momentomkopplare
  • 1 x 220 ohm-motstånd
  • Kvinna> manliga hoppkablar
  • Hane> Hoppkablar för män

Här är kretsen:

Pi-Button-anslutning

Detta motstånd kallas ett "pull down" -motstånd. Det hjälper till att säkerställa att det som Pi tror är knappen som trycks ner, verkligen är knappen som trycks in. Du behöver inte använda detta, men det rekommenderas, eftersom du kan hitta mycket buller och falska avläsningar utan det.

Knappen är ansluten till GPIO-stift (General Purpose Input Output) 14. Du kan använda vilken GPIO-pin som helst, men titta på pinout för det första eftersom de inte alla kan kontrolleras från Pi och varierar något mellan modellerna.

Nu när knappen är ansluten är det dags att testa den. Skapa en ny fil och spara den som "button_test.py“. Lägg till den här koden, spara den och kör den sedan i Terminal.

importera RPi. GPIO som GPIO. importtid GPIO.setmode (GPIO.BCM) # berätta för Pi vilka rubriker som ska användas. GPIO.setup (14, GPIO.IN) # berätta för Pi att denna stift är en ingång medan True: om GPIO.input (14) == True: # leta efter knapptryckning tryck på "BUTTON WORKS!" # log result time.sleep (0.5) # vänta 0,5 sekunder. 

Tryck Kontroll + C för att stoppa skriptet. Om allt fungerar korrekt ska du se "KNAPPARBETE!" i terminalen. Lägg märke till hur detta test, precis som Minecraft-modulen, använder RPi. GPIO och tidsmoduler. Dessa gör att Pi får åtkomst till hårdvarupinnarna och ger användbara timingfunktioner.

Nu kan vi avsluta resten av koden. Skapa en ny fil kallat "super_mine.py“. Här är koden:

importera RPi. GPIO som GPIO. importtid. från mcpi.minecraft import Minecraft mc = Minecraft.create () # skapa Minecraft Object GPIO.setmode (GPIO.BCM) # berätta för Pi vilka rubriker som ska användas. GPIO.setup (14, GPIO.IN) # berätta för Pi att denna stift är en ingång medan True: om GPIO.input (14) == True: # leta efter knapptryck på x, y, z = mc.player.getPos ( ) # läs spelaren position mc.setBlocks (x, y, z, x + 10, y + 10, z + 10, 0) # min 10 block mc.setBlocks (x, y, z, x - 10, y + 10, z - 10, 0) # min 10 block time.sleep (0.5) # wait 0.5 sekunder. 

mc.player.getPos () returnerar spelarnas aktuella koordinater, som sedan lagras i x, y och z. De setBlocks () metod berättar Minecraft att fylla alla block mellan start och slut med följande block. Noll är block-id för luft. Du kan ändra detta till ett annat block-id för att fylla ett område. Du kan också ändra koordinaterna till +100 eller till och med +1000 block, men Pi kan komma att börja kämpa om du blir för galen. Lägg märke till hur y + 10 är samma för båda linjerna. Du kan ändra detta till y - 10 om du ville ta bort block under jord.

Teleporting

Minecraft-Pi-Teleporting

En annan enkel användning för den här knappen kan vara att "teleportera". Minecraft Pi Api ger ett sätt att ställa in spelarens position. Följande kod "teleporterar" spelaren till en förinställd plats:

mc.player.setPos (0, 0, 0)

Observera att hans metod accepterar tre parametrar; x, y och z - så du kan ställa in dessa på vad som helst för att omedelbart teleportera spelaren till den platsen.

Skapa en kopia av filen super_mine (Fil> Spara kopia som) och ändra den genom att ersätta if med följande:

om GPIO.input (14) == True: # leta efter knapptryckning mc.player.setPos (0, 0, 0) # teleport player time.sleep (0.5) # vänta 0,5 sekunder. 

Den här filen ska nu se ut så här:

importera RPi. GPIO som GPIO. från mcpi.minecraft-import Minecraft. importtid mc = Minecraft.create () # skapa Minecraft Object GPIO.setmode (GPIO.BCM) # berätta för Pi vilka rubriker som ska användas. GPIO.setup (14, GPIO.IN) # berätta för Pi att denna stift är en ingång medan True: om GPIO.input (14) == True: # leta efter knapptryckning mc.player.setPos (0, 0, 0) # teleport player time.sleep (0.5) # wait 0.5 sekunder. 

Spara det som "teleport.py”Och kör.

Du kanske hittar att spelaren fastnar i några block när du använder detta, i vilket fall du måste göra det justera koordinaterna till ett känt öppet utrymme (längst upp till vänster på skärmen visar din ström plats).

Bygga ett hus

Minecraft-Pi-House

En sista uppgift för den här knappen är att bygga ett hus. I likhet med snabbbrytningsexemplet ovan kommer detta helt enkelt att ersätta block som omger spelaren för att skapa ett hus. Olika block-id används för olika material (fönster, väggar etc.). För att göra saker enklare att koda skapas ett solidt block och sedan tas insidan bort (ställ blocket i luften), detta skapar ett ihåligt skal. Du kan lägga till extra som en säng eller dörr, men Minecraft Pi-projektet är lite ofullständigt, och medan dessa objekt fungerar när de placeras av spelaren, är de inte lysande när du använder Python.

från mcpi.minecraft-import Minecraft. importera RPi. GPIO som GPIO. importtid mc = Minecraft.create () # skapa Minecraft Object GPIO.setmode (GPIO.BCM) # berätta för Pi vilka rubriker som ska användas. GPIO.setup (14, GPIO.IN) # berätta för Pi att denna stift är en ingång medan True: om GPIO.input (14) == True: x, y, z = mc.player.getPos () mc.setBlocks ( x + 2, y - 1, z + 2, x + 7, y + 3, z + 8, 5) # göra skal mc.setBlocks (x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # ta bort inuti mc.setBlocks (x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # skapa dörröppning mc.setBlock (x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # make-fönster 1 mc.setBlock (x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # make-fönster 2 mc.setBlocks (x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # make-fönster 3. 

Spara detta som "house.py”Och kör. När du är väl bör du se ett litet hus dyka upp (du kan behöva vända dig för att hitta det). Det är väldigt enkelt, en öppning och några fönster. I teorin finns det ingen gräns för hur stor eller komplex en byggnad du kan bygga.

Gör ett minispel

Minecraft-Pi-Lava-Game

Låt oss nu göra ett minispel! Detta kommer att vara ganska enkelt, när spelaren går på ett sandblock kommer det att bli lava efter en slumpmässig tid. Detta är ett bra spel att göra, eftersom du kan designa dina egna nivåer eller ändra det för att göra saker svårare. Du behöver inte knappen för det här exemplet.

Skapa en ny fil och spara den som "mini_game.py“. Här är koden:

från mcpi.minecraft-import Minecraft. importera slumpmässigt. importtid mc = Minecraft.create () # skapa Minecraft-objekt medan True: x, y, z = mc.player.getPos () block_under_player = mc.getBlock (x, y - 1, z) om block_under_player == 12: # spelare som står på sand, starta timern random_time = random.uniform (0.1, 2.5) # generera slumpmässigt antal tid. sov (Random_time); # vänta mc.setBlock (x, y - 1, z, 11) # förvandla den till lava. 

Den här koden är en bra start på slumpmässig() fungera: random.uniform (0,1, 2,5) kommer att generera ett slumpmässigt antal mellan 0,1 (1/10 sekund) och 2,5 (2 1/2 sekund). Att öka dessa nummer kommer att göra spelet enklare.

Testa! Stå på ett sandblock och det kommer snart att bli lava. Detta kan ligga till grund för ett mer komplext spel.

Gör ett annat minispel

Minecraft-Pi-minispel

Förutsättningen för detta spel är enkel - stå inte på trägolvet när tiden går ut. Spelaren blir teleporterad till en "arena". De tvingas stå stilla tills spelet startar. När väl startat kommer golvet att vända till vatten när timern tar slut. Spelaren måste stå i säkerhetszonen (diamantblock) för att överleva. Varje nivå minskar timern med en sekund. Efter varje framgångsrik nivå blir det säkra området större. Kolla in koden nedan:

importtid. importera slumpmässigt. från mcpi.minecraft import Minecraft mc = Minecraft.create () # skapa Minecraft Object # clear area. mc.setBlocks (-10, 1, -10, 25, 5, 25, 0) # skapa arenaskal. mc.setBlocks (0, 0, 0, 25, 10, 25, 17) # hollow out arena. mc.setBlocks (1, 1, 1, 24, 10, 24, 0) # flytta spelaren till arenan. mc.player.setPos (14, 25, 20) # teleportspelare # gör att de förblir satte. # teleportspelare för att börja position varje 1/10: e sekund. # gör detta i 5 sekunder och starta sedan spelet. time.sleep (2) total_vänta = 0. mc.postToChat ("Väntar på att börja") medan total_wait <5: mc.player.setPos (14, 1, 20) # teleportspelare time.sleep (0.1) total_wait + = 0.1 mc.postToChat ("BEGIN!") # 10 nivåer. för nivå inom intervallet (10): x, y, z = mc.player.getPos () level_time = 10 - level # minska tiden med 1 sekund för varje nivå mc.postToChat ("Level -" + str (nivå + 1) + "start") # bygg golv mc.setBlocks (0, 0, 0, 25, 0, 25, 17) # make safe area safe_area_start = random.uniform (0, 22) safe_area_end = random.uniform (0, 22) mc.setBlocks (safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57) förflutit_tid = 0 medan elapsed_time <10: x, y, z = mc.player.getPos () time.sleep (0.25) elapsed_time + = 0.25 # check player är fortfarande på golvet om y <0.75: mc.postToChat ("Game Över ") paus; annat: # ta bort golv mc.setBlocks (-10, 0, -10, 25, 0, 25, 8) # sätta tillbaka säkerhetsområdet mc.setBlocks (safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57) tid.sov (2.5) fortsätt pausen.

Spara detta som "mini_game_2.py”Och ge det en körning.

Pi 2 har några prestandaproblem när Minecraft körs. CPU-användningsgrafen (Central Processing Unit)översta högra hörnet) visar aldrig någon tung belastning, så detta måste bero på dålig design och optimeringar av utvecklarna. Dessa problem är inte relaterade till körkod (eftersom de fortsätter när Python inte körs), men de förvärras av detta minispel. Om din Pi verkligen kämpar kanske du vill minska storleken på arenan eller överklocka din Pi Inte tillräckligt med juice? Pressa din hallonpi genom att överklockaOm det finns någon hårdvara som släpptes under 2012 som du troligtvis kommer att bli förälskad i, är det Raspberry Pi med söt-som-socker, en minidator som är designad och byggd i Storbritannien som har levererats runt ... Läs mer .

Diamantdetektor

Minecraft-Pi-Diamonds

Låt oss göra en annan krets. Detta kommer att använda en ljusemitterande diod (LED) för att lysa upp när det finns diamanter under (inom 15 kvarter). Här är vad du behöver:

  • 1 x brödbräda
  • 1 x LED
  • 1 x 220 ohm-motstånd
  • Kvinna> manliga hoppkablar
  • Hane> Hoppkablar för män

Här är kretsen:

Pi-LED-Anslutning

Anslut anoden (lång ben) till GPIO Pin 14. Denna stift fungerar som + 5v. Anslut katoden (korta benet) till marken.

Jag har använt en billig malmleksak och modifierat den genom att ta bort det bakre locket och elektroniken, jag placerade sedan en lysdiod under den. Du kan lätt göra detta permanent med varmt lim eller något liknande.

Minecraft-Ore-Toy

Spara den här koden som "diamonds.py“:

importera RPi. GPIO som GPIO. importtid. från mcpi.minecraft import Minecraft mc = Minecraft.create () # skapa Minecraft Object led_pin = 14 # lagra GPIO-stiftnummer GPIO.setmode (GPIO.BCM) # berätta Pi vilka rubriker som ska användas. GPIO.setup (14, GPIO.OUT) # berätta för Pi att denna stift är en utgång medan True: # upprepa på obestämd tid x, y, z = mc.player.getPos () för i inom intervallet (15): # titta på varje blockera tills block 15 om mc.getBlock (x, y - i, z) == 56: GPIO.output (led_pin, True) # slå LED på time.sleep (0.25) # vänta GPIO.output (led_pin, False) # turn LED off time.sleep (0.25) # vänta. 

När det finns ett diamantmalmblock under spelaren (inom 15 block) kommer lampan att blinka.

Har du gjort något coolt med Minecraft Pi? Låt mig veta i kommentarerna vad du gjorde eller hur långt du tog det i spelen.

Joe är en examen i datavetenskap från University of Lincoln, Storbritannien. Han är en professionell mjukvaruutvecklare, och när han inte flyger drönare eller skriver musik kan han ofta hitta foton eller producera videor.