Lär dig Python och elektronik med Minecraft Pi Edition

Lär dig Python och elektronik med Minecraft Pi Edition

Har du alltid velat lära dig att koda men visste inte var du ska börja? Lär dig hur du styr 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 även om 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.





Ny på Minecraft? Oroa dig inte - här är vår Nybörjarguide för Minecraft .





Introduktion till Minecraft Pi

Minecraft för Raspberry Pi har utvecklats för inlärning och pyssel (och det är gratis). Den levereras med ett Application Programming Interface (API) som ger ett sätt för kod att enkelt prata med Minecraft. Det är lysande för att lära sig att koda i Python, liksom att komma igång med elektronik.

Vad är Python?

Pytonorm är ett programmeringsspråk. Det är tolkad , vilket betyder att när du kör en Python -fil eller ett program måste datorn göra lite arbete med filen först. Nackdelarna är att det kan anses långsamt jämfört med kompilerade språk [Bruten URL har tagits bort].



Fördelarna med tolkade språk är kodningshastigheten 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 ta reda på vad du ska göra. Det finns naturligtvis undantag, och detta är en något förenklad uppfattning, men programmering borde vara kul! Om du börjar gräva i de komplexa tekniska detaljerna kan det bli lite mödosamt.

Python är skiftlägeskänsligt. Detta är viktigt att veta, eftersom Python inte känner igen objekt även om de är rätt stavade om fallet är fel. 'Dosomething ()' fungerar inte om metoden faktiskt kallas 'DoSomething ()'. Python använder också indrag . Andra programmeringsspråk kanske inte bryr sig om hur många streck din kod har, medan Python gör vård. Indrag används för att berätta för Python var koden hö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 människor som tittar på koden vad en viss del gör, eller varför den 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 installera och köra Raspbian , det behövs inte mycket initial installation.





Öppen terminal ( Meny> Tillbehör> Terminal ) och kör det här kommandot. Det är alltid bra att hålla arkivlistan uppdaterad, och den här laddar ner den senaste listan över program (den laddar inte ner själva programmen, det hjälper Pi att veta vilka program som heter och var de kan hittas).

sudo apt-get update

Uppdatera nu Pi (detta kan ta ett tag):

sudo apt-get upgrade

Python och Minecraft Pi är redan installerade, men om Minecraft Pi inte är installerat av någon anledning är det enkelt att installera:

sudo apt-get install minecraft-pi

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

cd Documents/
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 autoslutföra satsen åt 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 kommer att behöva detta körs, men återkommer senare.

Ö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ärskilt praktiskt. Gå till Arkiv> Ny fil och då Arkiv> Spara och spara detta i den mapp du skapade tidigare. ( Dokument> Minecraft ). Låt oss kalla det ' hej_värld.py '. Du behöver inte använda .py -tillägget, detta läggs till automatiskt, men det är bra.

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 hello_world

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:

print 'Hello, World!'

Spara den här filen och kör den igen - nu ska du se 'Hej, värld!' visas på kommandoraden - snyggt! Utskriftskommandot säger helt enkelt till Python att skriva ut följande text i dubbla citattecken. Det här är bra, men inte särskilt användbart för Minecraft, låt oss länka det:

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.postToChat('Hello, World!')

Om du nu sparar och kör den här filen ska du se 'Hej, värld!' visas i Minecraft -spelet. Låt oss bryta koden:

from mcpi.minecraft import Minecraft

Den här raden talar om för 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 av Minecraft.

mc = Minecraft.create()

Denna rad 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 att bara inkludera filen.

mc.postToChat('Hello, World!')

Slutligen säger den här raden åt Minecraft att skriva lite text till chatten. Prova att ändra 'Hej, värld!' till något annat och se vad som händer, men kom ihåg att inkludera båda citattecken. Om du har programvaruproblem är det några vanliga Python- och Minecraft Pi -fel:

  • AttributeError - det här är ett stavfel, 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änsligt, ändra till 'True'
  • socket.error: [Errno 111] Anslutning nekad - Kontrollera att Minecraft körs

Projekt

Nu när du känner till grunderna i Python och Minecraft, låt oss göra några häftiga projekt. All kod kan laddas ner från Github.

Automatiserad brobyggare

Detta program kommer effektivt att bygga en bro över vatten. När spelaren kommer nära en vattendrag kommer programmet att omvandla flera block till sten. Eftersom Minecraft använder ett koordinatsystem är det mycket enkelt att få plats för spelaren, tillsammans med typen av block runt spelaren. Minecraft Pi är något begränsad, 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 ( Arkiv> Ny fil ) och spara det som ' bridge_builder.py '.

from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos() # store player position

# store the surrounding blocks
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)
if a == 8 or a == 9 or b == 8 or b == 9 or c == 8 or c == 9 or d == 8 or d == 9:
# 8 or 9 is water. Set surrounding blocks on floor to a solid (stone) if water is found
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.setBlocks(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 manuset 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 angivna koordinaterna. Eftersom x, y och z är spelarens koordinater, kan du lägga till eller subtrahera från dem för att få positioner runt spelaren. Du behöver inte använda x-, y- och z -värdena, du kan använda valfritt tal, men du kanske inte vet hur just det blocket förhåller sig 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 blir till sten när spelaren når en vattendrag. Det är inte bra - du kan gå tillräckligt snabbt för att orsaka problem. Du kan lösa detta genom att omvandla en större volym vatten till land. Den sista delen av metoden mc.setBlocks () är block -id. En är block -id för sten. Du kan ändra detta till trä, gräs eller vad som helst. Om du ville kan du enkelt konvertera detta till en komplex design - kanske en hängbro!

Super Mining -knapp

Detta exempel kommer att göra kort arbete med gruvdrift. Den består av en fysisk knapp, som när den trycks in kommer att gruva 10 block i kuber. Låt oss börja med knappen. I likhet med knapparna på Arduino behöver du en liten mängd elektronik, som alla ska finnas i ett grundläggande startpaket:

  • 1 x brödbräda
  • 1 x tillfällig omkopplare
  • 1 x 220 ohm motstånd
  • Hona> manliga hoppkablar
  • Hane> Hankablar

Här är kretsen:

Pi-knapp-anslutning

Detta motstånd kallas ett 'pull down' -motstånd. Det hjälper till att se till att det som Pi tror är knappen som trycks, verkligen är knappen som trycks. 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 General Purpose Input Output (GPIO) pin 14. Du kan använda valfri GPIO -pin, men titta på pinout för det första, 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 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.

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
print 'BUTTON WORKS!' # log result
time.sleep(0.5) # wait 0.5 seconds

Tryck Kontroll + C för att stoppa manuset. Om allt fungerar korrekt bör du se 'KNAPPEN FUNGERAR!' i terminalen. Lägg märke till hur detta test, precis som Minecraft -modulen, använder RPi.GPIO- och tidsmodulerna. Dessa tillåter Pi att komma åt hårdvarustiften och tillhandahålla användbara tidsfunktioner.

Nu kan vi avsluta resten av koden. Skapa en ny filkallad ' super_mine.py '. Här är koden:

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
x, y, z = mc.player.getPos() # read the player position
mc.setBlocks(x, y, z, x + 10, y + 10, z + 10, 0) # mine 10 blocks
mc.setBlocks(x, y, z, x - 10, y + 10, z - 10, 0) # mine 10 blocks
time.sleep(0.5) # wait 0.5 seconds

mc.player.getPos () returnerar spelarens aktuella koordinater, som sedan lagras i x, y och z. De setBlocks () metoden säger åt 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 helt. 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. Lägg märke till hur y + 10 är samma för båda raderna. Du kan ändra detta till y - 10 om du vill ta bort block under jorden.

Teleportering

En annan enkel användning för denna knapp kan vara att 'teleportera'. Minecraft Pi Api ger ett sätt att ställa in spelarens position. Följande kod kommer att 'teleportera' 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å att du kan ställa in dem på allt för att direkt teleportera spelaren till den platsen.

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

if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

Denna fil ska nu se ut så här:

import RPi.GPIO as GPIO
from mcpi.minecraft import Minecraft
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

Spara det som ' teleport.py 'och spring.

Du kan upptäcka att spelaren fastnar i några block när du använder detta, 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. Ungefär som exemplet med snabbbrytning ovan kommer detta helt enkelt att ersätta block som omger spelaren för att skapa ett hus. Olika block-id kommer att användas för olika material (fönster, väggar etc). För att göra det lättare att koda skapas ett solidt block, och sedan tas insidan bort (sätt block till luft), detta skapar ett ihåligt skal. Du kan lägga till tillbehör som en säng eller dörr, men Minecraft Pi -projektet är lite ofullständigt, och även om dessa objekt fungerar när de placeras av spelaren, är de inte lysande när du använder Python.

from mcpi.minecraft import Minecraft
import RPi.GPIO as GPIO
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if 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) # make shell
mc.setBlocks(x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # remove inside
mc.setBlocks(x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # make doorway
mc.setBlocks(x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # make window 1
mc.setBlocks(x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # make window 2
mc.setBlocks(x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # make window 3

Spara detta som ' hus. py 'och spring. När allt är bra bör du se ett litet hus dyka upp (du kan behöva vända dig om 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 byggnad du kan bygga.

Gör ett minispel

Låt oss sedan göra ett minispel! Detta kommer att vara ganska enkelt, när spelaren kliver 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 detta exempel.

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

from mcpi.minecraft import Minecraft
import random
import time
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos()
block_under_player = mc.getBlock(x, y - 1, z)

if block_under_player == 12:
# player standing on sand, start the timer
random_time = random.uniform(0.1, 2.5) # generate random number
time.sleep(random_time); # wait
mc.setBlock(x, y - 1, z, 11) # turn it into lava

Denna kod är en bra start på slumpmässig() fungera: random.uniform (0,1, 2,5) genererar ett slumpmässigt tal 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 sandblock, och det kommer snart att bli lava. Detta kan vara grunden för ett mer komplext spel.

Gör ett nytt minispel

Utgångspunkten för det här spelet är enkel - stå inte på trägolvet när tiden tar slut. Spelaren blir teleporterad till en 'arena'. De tvingas stå stilla tills spelet startar. När det väl har börjat blir golvet till vatten när timern rinner ut. Spelaren måste stå i den säkra zonen (diamantblock) för att överleva. Varje nivå reducerar timern med en sekund. Efter varje lyckad nivå blir det säkra området större. Kolla in koden nedan:

import time
import random
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
# clear area
mc.setBlocks(-10, 1, -10, 25, 5, 25, 0)
# create arena shell
mc.setBlocks(0, 0, 0, 25, 10, 25, 17)
# hollow out arena
mc.setBlocks(1, 1, 1, 24, 10, 24, 0)
# move player to arena
mc.player.setPos(14, 25, 20) # teleport player
# make them stay put
# teleport player to start position every 1/10th second.
# do this for 5 seconds then start the game
time.sleep(2)
total_wait = 0
mc.postToChat('Waiting to Start')
while 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 några prestandaproblem när du kör Minecraft. Användningsgrafen för den centrala processorenheten (CPU) ( ö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 arenans storlek eller överklocka din Pi.

var får man en valp nära mig

Diamantdetektor

Låt oss göra en annan krets. Detta kommer att använda en Light Emitting Diode (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
  • Hona> manliga hoppkablar
  • Hane> Hankablar

Här är kretsen:

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

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

Spara den här koden som ' diamonds.py ':

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
led_pin = 14 # store the GPIO pin number
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.OUT) # tell the Pi this pin is an output
while True:
# repeat indefinitely
x, y, z = mc.player.getPos()
for i in range(15):
# look at every block until block 15
if mc.getBlock(x, y - i, z) == 56:
GPIO.output(led_pin, True) # turn LED on
time.sleep(0.25) # wait
GPIO.output(led_pin, False) # turn LED off
time.sleep(0.25) # wait

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

ThinkGeek Minecraft Light -Up Blue Stone Diamond Ore - Säkert att hålla grisarna borta KÖP NU PÅ AMAZON

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.

Vi hoppas att du gillar de saker vi rekommenderar och diskuterar! MUO har samarbetspartners och sponsrade partnerskap, så vi får en del av intäkterna från några av dina köp. Detta påverkar inte priset du betalar och hjälper oss att erbjuda de bästa produktrekommendationerna.

Dela med sig Dela med sig Tweet E-post Är det värt att uppgradera till Windows 11?

Windows har gjorts om. Men är det tillräckligt för att övertyga dig om att byta från Windows 10 till Windows 11?

Läs Nästa
Relaterade ämnen
  • DIY
  • Programmering
  • Minecraft
  • Raspberry Pi
  • Elektronik
  • Pytonorm
Om författaren Joe Coburn(136 artiklar publicerade)

Joe är utbildad 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 hittas ta foton eller producera videor.

Mer från Joe Coburn

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera