Lär dig Python och elektronik med Minecraft Pi Edition

Lär dig Python och elektronik med Minecraft Pi Edition / DIY

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

Du behöver en Pi 2 eller nyare för det här projektet, och samtidigt som du kan slutföra de flesta av dessa uppgifter via kommandoraden över Secure Shell (SSH), kommer denna handledning att fokusera på kodning direkt på Pi.

Raspberry Pi 3 Modell B Moderkort Raspberry Pi 3 Modell B Moderkort Köp nu på Amazon $ 34.49

Ny på Minecraft? Oroa dig inte - här är vår Minecraft Beginners Guide The (Latecomer) Nybörjarens Guide till Minecraft (Latecomer) Nybörjarens Guide till Minecraft Om du är sen till festen, oroa dig inte - den här omfattande nybörjarhandboken har du täckt. Läs mer .

Introduktion till Minecraft Pi

Minecraft för Raspberry Pi har utvecklats för lärande och tinkering (och det är gratis). Den levereras med ett Program Programmeringsgränssnitt (API) som ger ett sätt att kod enkelt kan prata med Minecraft. Det är briljant att lära sig hur man kodar i Python, liksom att börja med elektronik. Beginners Electronics: 10 färdigheter du behöver veta Beginners Electronics: 10 färdigheter du behöver veta Många av oss har aldrig ens rört ett lödstryk - men att göra saker kan otroligt givande. Här är tio av de mest grundläggande DIY elektronik färdigheter för att hjälpa dig att komma igång. Läs mer .

Vad är Python?

Python är ett programmeringsspråk. Det är tolkas, vilket betyder att när du kör en Python-fil eller ett program måste datorn först göra en liten bit av jobbet till filen. Nackdelarna är att det kan betraktas långsamt jämfört med kompilerade 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 det du vill lagra något och datorn kommer att räkna ut vad du ska göra. Det finns naturligtvis undantag, och det här är en något förenklad vy, men programmering ska vara kul! Om du börjar gräva i komplexa tekniska detaljer kan det bli lite mödosamt.

Python är skiftlägeskänslig. Det här är viktigt att veta, eftersom Python inte känner igen objekt även om de stavas rätt om fallet är fel. “Göra någonting()” kommer inte fungera om metoden faktiskt kallas “Göra någonting()”. Python använder också indryckning. Andra programmeringsspråk kanske inte bryr sig om hur många streckkod du har, medan Python gör vård. Indrag används för att berätta för Python där kod hör till. Andra språk kan använda “Curly Braces” () till gruppkod - 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 det behövs. Python ignorerar allt 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 inställd och körs Raspbian Så här installerar du ett operativsystem till din Raspberry Pi Så här installerar du ett operativsystem till din Raspberry Pi Så här får du ett nytt OS installerat och kört på din Pi - och hur man klonar din perfekta inställning för snabb katastrofåterställning. Läs mer, det behövs inte mycket initial installation.

Öppet terminal (Meny> Tillbehör> Terminal) och kör det här kommandot. Det är alltid bra att hålla lagringslistan uppdaterad, och det här hämtar den senaste listan över program (det går inte att ladda ner programmen själva, det hjälper Pi att veta vilka program som heter och var de ska hitta dem).

sudo apt-get uppdatering 

Uppdatera nu Pi (det kan ta ett tag):

sudo apt-get uppgradering 

Python och Minecraft Pi installeras redan, men om Minecraft Pi inte är installerad av någon anledning, är det enkelt att installera 5 sätt att installera programvara på Raspberry Pi 5 sätt att installera programvara på Raspberry Pi För att göra något med en Raspberry Pi, kommer du behöver veta hur man installerar ett operativsystem och programvara för att köra på den. 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 här nya mappen:

ls

Här är ett tips - om du börjar skriva och tryck på TAB-tangenten, kommer kommandoraden att försöka autofullständiga uppgiften för dig.

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

pwd

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

Öppna Python 3 från Meny> Programmering> Python 3 (IDLE). Detta program ger dig möjlighet 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 det i den mapp 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 automatiskt till, men det är bra.

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

cd minecraft / ls

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

python hej_world

Lägg märke till hur “pytonorm” är alla småfall. Detta måste vara före filnamnet, eftersom det säger Pi att följande fil är Python, så den borde utföras som sådan.

Byt tillbaka till Python-redigeraren och skriv:

skriv ut "Hej världen!"

Spara den här filen och kör den igen - du borde nu se “Hej världen!” visas i kommandoraden - snyggt! Utskriftskommandot berättar enkelt att Python ska mata ut följande text i dubbla citat. Detta är bra, men inte fruktansvärt användbart för Minecraft, låt oss koppla upp det:

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

Nu om du sparar och kör den här filen bör du se “Hej världen!” visas i Minecraft-spelet. Låt oss bryta ned koden:

från mcpi.minecraft import Minecraft

Den här raden berättar Python att du vill använda kod från en annan fil. Denna mcpi.minecraft-fil utvecklades för att möjliggöra enkel kontroll över Minecraft.

mc = Minecraft.create ()

Den här raden 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 för att inkludera filen.

mc.postToChat ("Hej, Värld!")

Slutligen berättar denna rad Minecraft om att skriva lite text till chatten. Försök ändra “Hej världen!” till något annat och se vad som händer, men kom ihåg att inkludera både dubbla citat. Om du har programvaruproblem är det några vanliga Python- och Minecraft Pi-fel:

  • AttributeError - detta är ett typsnitt, till exempel 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änslig, ändras till “Sann”
  • socket.error: [Errno 111] Anslutning vägrade - Se till att Minecraft körs

projekt

Nu när du vet grunderna i Python och Minecraft, låt oss göra några coola projekt. Hela codecan laddas ner från Github.

Automatiserad brobyggare

Detta program kommer effektivt bygga en bro över vatten. När spelaren kommer i närheten av en vattenkälla, kommer programmet att konvertera flera kvarter till sten. Eftersom Minecraft använder ett koordinatsystem är det väldigt enkelt att få platsen för spelaren, tillsammans med typen av block runt spelaren. Minecraft Pi är lite begränsad, så det går inte att uppdatera flera olika block i bulk. Du kan dock enkelt koda detta beteende själv, dock.

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 Object medan True: x, y, z = mc.player.getPos () # butikspositionsposition # 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 omliggande block på golv till en solid (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.setBlocks (x, y - 1, z, x - 1, y - 1, z + 1, 1) mc.setBlock - 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, letade skriptet efter block på ungefär knänivå - det skulle inte fungera mycket 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 dem för att få positioner runt spelaren. Du behöver inte använda x-, y- och z-värdena, du kan använda något nummer, men du kanske inte vet hur det specifika blocket gäller 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 område av mark blir sten när spelaren når en vattenkropp. Det är inte bra - du kan gå fort nog för att orsaka problem. Du kan lösa detta genom att konvertera en större mängd vatten till land. Den sista delen av mc.setBlocks () -metoden är block-id. En är block id för sten. Du kan ändra detta till trä, gräs eller något. Om du ville, kan du ganska enkelt konvertera detta till en komplex design - kanske en upphängningsbro!

Super Mining Button

Detta exempel kommer att göra korta arbeten med gruvdrift. Den består av en fysisk knapp, som när den pressas, kommer mina 10 kvarter cubed. Låt oss börja med knappen. På samma sätt som knapparna på Arduino behöver du en liten mängd elektronik, som alla finns i ett grundläggande startpaket Vad finns i ditt Arduino Starter Kit? [Arduino Beginners] Vad finns i din Arduino Starter Kit? [Arduino Beginners] 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> Hanehoppkablar
  • Man> Man hoppar kablar

Här är kretsen:

Detta motstånd kallas a “dra ner” motstånd. Det hjälper till att se till att det som Pi tycker är att knappen trycks in, är verkligen att knappen trycks in. Du behöver inte använda det här, men det rekommenderas, eftersom du kan hitta massor av ljud och falska avläsningar utan det.

Knappen är ansluten till GPIO-stift 14. Du kan använda någon GPIO-stift, men titta först på stiftet eftersom de inte alla kan styras från Pi, och varierar något mellan modellerna.

Nu när knappen är ansluten är det dags att testa det. Skapa en ny fil och spara den som “button_test.py“. Lägg till den här koden, spara den och kör den 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 denna PIN är en inmatning medan True: om GPIO.input (14) == Sannt: # leta efter knappen tryck på "BUTTON WORKS!" # loggresultat time.sleep (0.5) # vänta 0,5 sekunder 

Tryck Kontroll + C för att stoppa manuset. Om allt fungerar korrekt bör du se “KNAPP ARBETAR!” i terminalen. Lägg märke till hur, liksom Minecraft-modulen, använder detta test RPi.GPIO och tidsmoduler. Dessa gör det möjligt för Pi att komma åt hårdvararpinnarna och ge användbara tidsfunktioner.

Nu kan vi avsluta resten av koden. Skapa en ny filecalled “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 denna knapp är en ingång medan True: om GPIO.input (14) == True: # leta efter knappen tryck x, y, z = mc.player.getPos () # läs spelarens 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) minen 10 kvarter time.sleep (0.5) # wait 0.5 seconds 

mc.player.getPos () returnerar spelarnas nuvarande koordinater, som sedan lagras i x, y och z. De setBlocks () Metoden 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 i ett område. Du kan också ändra koordinaterna till +100 eller till och med +1000 block, men Pi kan börja kämpa om du blir för galen. Observera hur y + 10 är densamma för båda linjerna. Du kan ändra detta till y - 10 om du vill ta bort block under jord.

teleportera

En annan enkel användning för den här knappen kan vara att “teleport”. Minecraft Pi Api ger ett sätt att ställa in spelarens position. Följande kod kommer att “teleport” 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 till något för att omedelbart teleportera spelaren till den platsen.

Skapa en kopia av super_mine-filen (Arkiv> Spara kopia som) och ändra det genom att ersätta om med följande:

om GPIO.input (14) == True: # leta efter knappen tryck på mc.player.setPos (0, 0, 0) # teleportspelare time.sleep (0.5) # wait 0.5 seconds 

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 denna pin är en ingång medan True: om GPIO.input (14) == True: # leta efter knappen tryck på mc.player.setPos (0, 0, 0) # teleportspelare time.sleep (0.5) # vänta 0,5 sekunder 

Spara det som “teleport.py” och springa.

Det kan hända att spelaren fastnar i vissa block när du använder det, i så fall måste du justera koordinaterna till ett känt öppet utrymme (längst upp till vänster på skärmen visar din nuvarande plats).

Bygga ett hus

En sista uppgift för den här knappen är att bygga ett hus. Precis som snabbmynningsexemplet ovan kommer detta helt enkelt att ersätta block som omger spelaren för att göra ett hus. Olika block-ids kommer att användas för olika material (fönster, väggar etc). För att göra det enklare att koda kommer ett solidt block att skapas, och sedan inuti borttaget (inställt block till luft), kommer detta att skapa ett ihåligt skal. Du kan lägga till extrafunktioner 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 import 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: ​​den här nålen är en ingång medan sant: om GPIO.input (14) == Sannt: x, y, z = mc.player.getPos () mc.setBlocks (x + 2, y - 1, z + 2, x + 7, y + 3, z + 8, 5) # gör skalet mc.setBlocks (x +3, y, z + 3, x + 6, y + 2, z + 7, 0) inuti mc.setBlocks (x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # gör dörröppningen mc.setBlocks (x +4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # gör fönstret 1 mc.setBlocks (x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) mc.setBlocks (x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) 

Spara detta som “house.py” och springa. Allt är bra, du borde se ett litet hus visas (du kan behöva vända dig för att hitta den). 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 konstruera.

Gör en minispel

Låt oss göra ett mini-spel! Det här blir ganska enkelt, när spelaren stiger på ett block av sand, blir det till lava efter en slumpmässig tid. Detta är ett bra spel att göra, eftersom du kan utforma 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 import slumpmässig importtid mc = Minecraft.create () # skapa Minecraft Object 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 timer random_time = random.uniform (0.1, 2.5) # generera slumpmässigt antal time.sleep (random_time); # vänta mc.setBlock (x, y - 1, z, 11) # vrid det till lava 

Denna kod är en bra start på slumpmässig() fungera: random.uniform (0,1, 2,5) kommer att generera ett slumptal mellan 0,1 (1/10 sekund) och 2,5 (2 1/2 sekunder). Att öka dessa siffror kommer att göra spelet enklare.

Testa! Stå på ett block av sand, och det kommer snart att bli lava. Detta kan vara grunden för ett mer komplext spel.

Gör ett annat mini-spel

Förutsättningen för detta spel är enkel - stå inte på trägolvet när tiden går ut. Spelaren får teleporteras till en “arena”. De tvingas stå stilla tills spelet börjar. När en gång är igång, kommer golvet att vända sig till vatten när timern löper ut. Spelaren måste stå i säkerhetszonen (diamantblock) för att överleva. Varje nivå minskar timern med en sekund. Efter varje lyckad nivå blir det säkra området större. Kolla in koden nedan:

importtid import 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 arena shell mc. setBlocks (0, 0, 0, 25, 10, 25, 17) # hål ut arenan mc.setBlocks (1, 1, 1, 24, 10, 24, 0) # flytta spelare till arena mc.player.setPos , 25, 20) # teleportspelare # få dem att stanna sätta # teleportspelare till startposition var 1/10 sekund. # gör detta i 5 sekunder och starta spelet time.sleep (2) total_wait = 0 mc.postToChat ("Väntar på Start") medan total_wait < 5: mc.player.setPos(14, 1, 20) # teleport player time.sleep(0.1) total_wait += 0.1 mc.postToChat("BEGIN!") # 10 levels for level in range(10): x, y, z = mc.player.getPos() level_time = 10 - level # reduce time by 1 second for each level mc.postToChat("Level - " + str(level + 1) + " start") # build floor 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) elapsed_time = 0 while elapsed_time < 10: x, y, z = mc.player.getPos() time.sleep(0.25) elapsed_time += 0.25 # check player is still on floor if y < 0.75: mc.postToChat("Game Over") break; else: # remove floor mc.setBlocks(-10, 0, -10, 25, 0, 25, 8) # put safe area back mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57) time.sleep(2.5) continue break 

Spara detta som “mini_game_2.py” och ge det en körning.

Pi 2 har vissa prestationsproblem medan du kör Minecraft. Den centrala bearbetningsenhetens (CPU) användningsgrafik (översta högra hörnet) visar aldrig någon tung belastning, så det måste gå ner till 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 är förknippade med detta minispel. Om din Pi verkligen kämpar kanske du vill minska arenans storlek eller överklocka din Pi inte tillräckligt med juice? Krama din hallon Pi genom överklockning Inte tillräckligt med juice? Krama din Raspberry Pi genom överklockning Om det finns någon hårdvara som släpptes år 2012 som du sannolikt kommer att bli kär i är det söt-som-socker Raspberry Pi, en mini-dator som är designad och byggd i Storbritannien som har levererats runt ... Läs mer .

Diamantdetektor

Låt oss göra en annan krets. Detta kommer att använda en lysdiod (LED) för att tändas när det finns diamanter nedan (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> Hanehoppkablar
  • Man> Man hoppar kablar

Här är kretsen:

Anslut anoden (långbenet) till GPIO Pin 14. Denna pin fungerar som + 5v. Anslut katoden (kort ben) till marken.

Jag har använt en billig malmleksong och modifierad den genom att ta bort bakplåten och elektroniken, så lade jag en LED under den. Du kan enkelt göra det här permanent med varmt lim eller något liknande.

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-pinnumret GPIO.setmode (GPIO.BCM) # berätta för Pi vilka rubriker som ska användas GPIO.setup (14, GPIO.OUT) # berätta för Pi denna pin är en utgång medan True: # upprepa obestämt x, y, z = mc.player.getPos () för jag i intervallet (15): # titta på varje blockera till block 15 om mc.getBlock (x, y - i, z) == 56: GPIO.output (led_pin, True) # vrid LED på time.sleep (0.25) # vänta GPIO.output (led_pin, False) # stäng av lysdioden från tid.sleep (0.25) # vänta 

När det finns ett diamantmalmblock under spelaren (inom 15 kvarter) blinkar ljuset.

ThinkGeek Minecraft Light Up Blue Stone Diamond Ore - Säker att hålla pigmen Away ThinkGeek Minecraft Light Up Blue Stone Diamond Ore - Säker att hålla pigmen Away Köp nu hos Amazon $ 31.99

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

Utforska mer om: Elektronik, Minecraft, Programmering, Python, Raspberry Pi.