Lær Python og elektronik med Minecraft Pi Edition

Lær Python og elektronik med Minecraft Pi Edition

Har du altid ønsket at lære at kode, men vidste ikke, hvor du skulle starte? Lær, hvordan du styrer Minecraft på Raspberry Pi ved hjælp af Python og lidt enkel elektronik. Her er slutresultatet:





Du skal bruge en Pi 2 eller nyere til dette projekt, og selvom du kunne udføre de fleste af disse opgaver via kommandolinje over Secure Shell (SSH), vil denne vejledning fokusere på kodning direkte på Pi.





Ny på Minecraft? Bare rolig - her er vores Minecraft begyndervejledning .





Introduktion til Minecraft Pi

Minecraft til Raspberry Pi er udviklet til læring og tinkering (og det er gratis). Den leveres med en Application Programming Interface (API), der giver en måde, hvorpå kode let kan tale med Minecraft. Det er genialt til at lære at kode i Python, såvel som at komme i gang med elektronik.

Hvad er Python?

Python er et programmeringssprog. det er fortolket , hvilket betyder, at når du kører en Python -fil eller et program, skal computeren først udføre en lille smule arbejde med filen. Ulemperne er, at det kan betragtes som langsomt sammenlignet med kompilerede sprog [Broken URL Removed].



Fordelene ved fortolkede sprog er kodningshastigheden og deres venlighed. Du behøver ikke fortælle det til computeren hvad data, du vil gemme, bare at du vil gemme noget, og computeren finder ud af, hvad du skal gøre. Der er selvfølgelig undtagelser, og dette er en lidt forenklet visning, men programmering skal være sjovt! Hvis du begynder at grave i de komplekse tekniske detaljer, kan det blive lidt besværligt.

Python er store og små bogstaver. Dette er vigtigt at vide, da Python ikke genkender objekter selvom de er stavet korrekt hvis sagen er forkert. 'Dosomething ()' virker ikke, hvis metoden faktisk kaldes 'DoSomething ()'. Python bruger også indrykning . Andre programmeringssprog er muligvis ligeglade med, hvor mange indrykninger din kode har, mens Python gør omsorg. Indrykninger bruges til at fortælle Python, hvor koden hører til. Andre sprog kan bruge 'Curly Braces' ({}) til at gruppere kode - Python bruger disse ikke. Python bruger en hash (#) til kommentarer, og kommentarer bruges til at fortælle andre udviklere eller folk, der ser på koden, hvad en bestemt del gør, eller hvorfor det er nødvendigt. Python ignorerer alt efter en hash.





Endelig er der to hovedversioner af Python - Python 2.7.x og Python 3.x. Der er nogle forskelle mellem de to ( hvad er forskellene? ). Denne vejledning bruger Python 3.

Første opsætning

At levere din Pi er allerede opsætning og kørsel af Raspbian , der er ikke meget første opsætning nødvendig.





Åben terminal ( Menu> Tilbehør> Terminal ) og kør denne kommando. Det er altid god praksis at holde opbevaringslisten ajour, og dette vil downloade den nyeste programliste (den vil ikke downloade programmerne selv, dette hjælper Pi med at vide, hvilke programmer der hedder, og hvor de kan findes).

sudo apt-get update

Opdater nu Pi (dette kan tage et stykke tid):

sudo apt-get upgrade

Python og Minecraft Pi er allerede installeret, men hvis Minecraft Pi ikke er installeret af en eller anden grund, er det enkelt at installere:

sudo apt-get install minecraft-pi

Naviger til dokumenter og opret en ny mappe kaldet 'Minecraft':

cd Documents/
mkdir Minecraft

Du kan se indholdet i denne nye mappe:

ls

Her er et tip - hvis du begynder at skrive og trykker på TAB -tasten, vil kommandolinjen forsøge at autofuldføre sætningen for dig.

Du kan undersøge stien til det aktuelle bibliotek ved hjælp af pwd, som står for Print Working Directory:

pwd

Start Minecraft ved at gå til Menu> Spil> Minecraft Pi . Du skal bruge dette kørende, men vender tilbage til det senere.

Åbn Python 3 fra Menu> Programmering> Python 3 (IDLE) . Dette program giver dig mulighed for at køre Python -kommandoer og skrive programmer.

Nu kunne du skrive dine Python -kommandoer her, men det er ikke særlig praktisk. Gå til Fil> Ny fil og så Fil> Gem og gem dette i den mappe, du har oprettet tidligere. ( Dokumenter> Minecraft ). Lad os kalde det ' hej_verden.py '. Du behøver ikke at bruge .py -udvidelsen, dette tilføjes automatisk, men det er god praksis.

Hvis du skifter tilbage til terminalen og navigerer til Minecraft -mappen, skal du se den fil, du lige har oprettet:

cd Minecraft/
ls

Du kan køre denne fil på denne måde:

python hello_world

Bemærk, hvordan 'python' alle er små bogstaver. Dette skal være før filnavnet, da det fortæller Pi, at den følgende fil er Python, så den skal udføres som sådan.

Skift tilbage til Python -editoren, og skriv:

print 'Hello, World!'

Gem denne fil, og kør den igen - du skulle nu se 'Hej, verden!' vises i kommandolinjen - pænt! Udskriv -kommandoen fortæller ganske enkelt Python at sende følgende tekst i dobbelte anførselstegn. Dette er godt, men ikke særlig nyttigt for Minecraft, lad os koble det op:

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

Hvis du nu gemmer og kører denne fil, skal du se 'Hej verden!' vises i Minecraft -spillet. Lad os opdele koden:

from mcpi.minecraft import Minecraft

Denne linje fortæller Python, at du vil bruge kode fra en anden fil. Denne mcpi.minecraft -fil blev udviklet for at muliggøre let kontrol af Minecraft.

mc = Minecraft.create()

Denne linje opretter et objekt kaldet 'mc' (Minecraft). Du skal oprette dette for at tillade kommunikation til Minecraft -spillet - det er ikke nok bare at inkludere filen.

mc.postToChat('Hello, World!')

Endelig fortæller denne linje Minecraft at skrive noget tekst til chatten. Prøv at ændre 'Hej, verden!' til noget andet og se, hvad der sker, men husk at medtage begge de dobbelte citater. Hvis du har softwareproblemer, er disse nogle almindelige Python- og Minecraft Pi -fejl:

  • AttributeError - dette er en skrivefejl, f.eks. Pint eller prnt i stedet for udskrivning
  • NameError: navn 'Minecraft' er ikke defineret - husk at importere de moduler, du har brug for
  • NameError: navn 'true' er ikke defineret - Python er store og små bogstaver, skift til 'True'
  • socket.error: [Errno 111] Forbindelse afvist - Sørg for, at Minecraft kører

Projekter

Nu hvor du kender det grundlæggende i Python og Minecraft, lad os lave nogle fede projekter. Hele codecen kan downloades fra Github.

Automatiseret brobygger

Dette program vil effektivt bygge en bro over vand. Når spilleren kommer tæt på en vandmasse, konverterer programmet flere blokke til sten. Da Minecraft bruger et koordinatsystem, er det meget let at få placeringen af ​​afspilleren sammen med typen af ​​blokke omkring spilleren. Minecraft Pi er lidt begrænset, så det er ikke muligt at opdatere flere forskellige blokke i bulk. Du kan dog let selv kode denne adfærd.

Opret en ny fil ( Fil> Ny fil ) og gem 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æg mærke til hvordan y -værdien faktisk ser på y - 1. Dette er gulvniveauet. Hvis værdien af ​​y blev brugt, ville scriptet lede efter blokke på knæhøjde - det ville ikke fungere særlig godt! Mc.getBlock () returnerer id for en blok for de givne koordinater. Da x, y og z er spillerens koordinater, kan du tilføje eller trække fra dem for at få positioner omkring spilleren. Du behøver ikke at bruge x-, y- og z -værdierne, du kan bruge et hvilket som helst tal, men du ved måske ikke, hvordan den pågældende blok relaterer sig til afspilleren - det er bedre at bruge værdier i forhold til afspilleren. Kør denne fil fra kommandolinjen og se, hvad der sker.

Du skal se, at et lille areal bliver til sten, når spilleren når en vandmasse. Det er ikke fantastisk - du kan gå hurtigt nok til at forårsage et problem. Du kan løse dette ved at konvertere en større mængde vand til land. Den sidste del af metoden mc.setBlocks () er blok -id'et. Den ene er blok -id for sten. Du kan ændre dette til træ, græs eller noget. Hvis du ville, kunne du ganske let konvertere dette til et komplekst design - måske en hængebro!

Super Mining -knap

Dette eksempel vil gøre kort arbejde med minedrift. Den består af en fysisk knap, der når der trykkes på den, vil mine 10 blokke i terninger. Lad os starte med knappen. Ligesom knapper på Arduino, skal du bruge en lille mængde elektronik, som alle skal findes i et grundlæggende startsæt:

  • 1 x brødbræt
  • 1 x kortvarig kontakt
  • 1 x 220 ohm modstand
  • Kvinde> mandlige springkabler
  • Hanne> Hannekopper

Her er kredsløbet:

Pi-knap-forbindelse

Denne modstand kaldes en 'pull down' modstand. Det hjælper med at sikre, at det, Pi tror, ​​er, at der trykkes på knappen, virkelig er at der trykkes på knappen. Du behøver ikke at bruge dette, men det anbefales, da du kan finde masser af støj og falske aflæsninger uden det.

Knappen er forbundet til General Purpose Input Output (GPIO) pin 14. Du kan bruge en hvilken som helst GPIO pin, men se på pinout for det første, da de ikke alle kan styres fra Pi, og varierer lidt mellem modellerne.

Nu hvor knappen er tilsluttet, er det tid til at teste den. Opret en ny fil, og gem den som ' button_test.py '. Tilføj denne kode, gem den, og kør den derefter 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

Trykke Control + C at stoppe scriptet. Hvis alt fungerer korrekt, skal du se 'KNAPPEN VIRKER!' i Terminalen. Læg mærke til hvordan denne test, ligesom Minecraft -modulet, bruger RPi.GPIO- og tidsmodulerne. Disse giver Pi adgang til hardware -benene og giver nyttige timingfunktioner.

Lad os nu afslutte resten af ​​koden. Opret en ny fil kaldet ' super_min.py '. Her er 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 () returnerer spillernes aktuelle koordinater, som derefter gemmes i x, y og z. Det setBlocks () metode fortæller Minecraft at udfylde alle blokke mellem start og slutning med følgende blok. Zero er blok-id for luft. Du kan ændre dette til et andet blok-id for at fylde et område fast. Du kan også ændre koordinaterne til +100 eller endda +1000 blokke, men Pi kan begynde at kæmpe, hvis du bliver for skør. Bemærk hvordan y + 10 er det samme for begge linjer. Du kan ændre dette til y - 10, hvis du vil fjerne blokke under jorden.

Teleportering

En anden simpel brug af denne knap kan være at 'teleportere'. Minecraft Pi Api giver en måde at indstille spillerens position. Følgende kode vil 'teleportere' afspilleren til et forudindstillet sted:

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

Bemærk, at hans metode accepterer tre parametre; x, y og z - så du kan indstille disse til alt for øjeblikkeligt at teleportere afspilleren til det sted.

Opret en kopi af super_mine -filen ( Fil> Gem kopi som ) og ændre det ved at erstatte if med følgende:

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

Denne fil skal nu se sådan ud:

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

Gem det som ' teleport.py 'og løb.

Du finder muligvis, at spilleren sidder fast inde i nogle blokke, når du bruger dette. I så fald skal du justere koordinaterne til et kendt åbent rum (øverst til venstre på skærmen viser din aktuelle placering).

Byg et hus

En sidste opgave for denne knap er at bygge et hus. Ligesom eksemplet med hurtig minedrift ovenfor, vil dette ganske enkelt erstatte blokke omkring spilleren for at lave et hus. Forskellige blok-id'er vil blive brugt til forskellige materialer (vindue, vægge osv.). For at gøre tingene lettere at kode, oprettes en solid blok, og derefter fjernes indersiden (sæt blok til luft), dette vil skabe en hul skal. Du kan tilføje ekstraudstyr som en seng eller dør, men Minecraft Pi -projektet er lidt ufuldstændigt, og selvom disse objekter fungerer, når de placeres af afspilleren, er de ikke geniale, når du bruger 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

Gem dette som ' hus.py 'og løb. Alt i orden bør du se et lille hus dukke op (du skal muligvis vende om for at finde det). Det er meget enkelt, en åbning og nogle vinduer. I teorien er der ingen grænse for, hvor stor eller kompleks en bygning du kan opføre.

Lav et minispil

Lad os derefter lave et minispil! Dette vil være ret simpelt, når spilleren træder på en sandblok, vil det blive til lava efter tilfældig tid. Dette er et godt spil at lave, da du kan designe dine egne niveauer eller ændre det for at gøre tingene sværere. Du behøver ikke knappen til dette eksempel.

Opret en ny fil, og gem den som ' mini_game.py '. Her er 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

Denne kode er en god start på tilfældig() fungere: tilfældig. ensartet (0,1, 2,5) vil generere et tilfældigt tal mellem 0,1 (1/10 sekund) og 2,5 (2 1/2 sekund). Forøgelse af disse tal vil gøre spillet lettere.

Prøve det! Stå på en sandblok, og det vil snart blive til lava. Dette kunne være grundlaget for et mere komplekst spil.

Lav et andet minispil

Forudsætningen for dette spil er enkel - stå ikke på trægulvet, når tiden løber ud. Spilleren bliver teleporteret til en 'arena'. De er tvunget til at stå stille, indtil spillet starter. Når det er startet, bliver gulvet til vand, når timeren løber ud. Spilleren skal stå i den sikre zone (diamantblokke) for at overleve. Hvert niveau reducerer timeren med et sekund. Efter hvert vellykket niveau bliver det sikre område større. Tjek koden herunder:

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

Gem dette som ' mini_game_2.py 'og giv det et løb.

Pi 2 har nogle ydelsesproblemer, mens du kører Minecraft. Anvendelsesgrafen for den centrale behandlingsenhed (CPU) ( øverste højre hjørne ) viser aldrig nogen tung belastning, så dette må skyldes dårligt design og optimeringer af udviklerne. Disse problemer er ikke relateret til kørende kode (da de fortsætter, når Python ikke kører), men de er sammensat af dette minispil. Hvis din Pi virkelig kæmper, kan du reducere arenaens størrelse eller overklokke din Pi.

hvordan man kaster damp til tv

Diamant detektor

Lad os lave et andet kredsløb. Dette vil bruge en lysemitterende diode (LED) til at lyse op, når der er diamanter nedenunder (inden for 15 blokke). Her er hvad du har brug for:

  • 1 x brødbræt
  • 1 x LED
  • 1 x 220 ohm modstand
  • Kvinde> mandlige springkabler
  • Hanne> Hannekopper

Her er kredsløbet:

Tilslut anoden (langt ben) til GPIO Pin 14. Denne pin fungerer som +5v. Tilslut katoden (det korte ben) til jorden.

Jeg har brugt et billigt malmlegetøj og modificeret det ved at fjerne bagdækslet og elektronikken, og derefter placerede jeg en LED under det. Du kan nemt gøre dette permanent med varm lim eller lignende.

Gem denne kode 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 der er en diamantmalmblok under afspilleren (inden for 15 blokke) blinker lyset.

ThinkGeek Minecraft Light -Up Blue Stone Diamond Ore - Sørg for at holde grise væk KØB NU PÅ AMAZON

Har du lavet noget fedt med Minecraft Pi? Lad mig vide i kommentarerne, hvad du lavede, eller hvor langt du gjorde det i spillene.

Vi håber, at du kan lide de ting, vi anbefaler og diskuterer! MUO har tilknyttede og sponsorerede partnerskaber, så vi modtager en andel af omsætningen fra nogle af dine køb. Dette påvirker ikke den pris, du betaler, og hjælper os med at tilbyde de bedste produktanbefalinger.

Del Del Tweet E -mail Er det værd at opgradere til Windows 11?

Windows er blevet redesignet. Men er det nok til at overbevise dig om at skifte fra Windows 10 til Windows 11?

Læs Næste
Relaterede emner
  • gør det selv
  • Programmering
  • Minecraft
  • Hindbær Pi
  • Elektronik
  • Python
Om forfatteren Joe Coburn(136 artikler udgivet)

Joe er uddannet i datalogi fra University of Lincoln, UK. Han er en professionel softwareudvikler, og når han ikke flyver med droner eller skriver musik, kan han ofte findes tage fotos eller producere videoer.

Mere fra Joe Coburn

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere