Lær Python og elektronikk med Minecraft Pi Edition

Lær Python og elektronikk med Minecraft Pi Edition

Har du alltid ønsket å lære å kode, men visste ikke hvor du skulle begynne? Lær hvordan du kontrollerer Minecraft på Raspberry Pi ved hjelp av Python og litt enkel elektronikk. Her er sluttresultatet:





Du trenger en Pi 2 eller nyere for dette prosjektet, og mens du kan fullføre de fleste av disse oppgavene via kommandolinjen over Secure Shell (SSH), vil denne opplæringen fokusere på koding direkte på Pi.





Ny på Minecraft? Ikke bekymre deg - her er vår Nybegynnerguide for Minecraft .





Introduksjon til Minecraft Pi

Minecraft for Raspberry Pi er utviklet for læring og tinkering (og det er gratis). Den leveres med et Application Programming Interface (API) som gir en måte for kode å enkelt snakke med Minecraft. Det er strålende for å lære å kode i Python, i tillegg til å komme i gang med elektronikk.

Hva er Python?

Python er et programmeringsspråk. Det er tolket , noe som betyr at når du kjører en Python -fil eller et program, må datamaskinen gjøre litt arbeid med filen først. Ulempene er at det kan betraktes som tregt sammenlignet med kompilerte språk [Broken URL Removed].



Fordelene med tolkede språk er kodingshastigheten og vennligheten. Du trenger ikke å fortelle datamaskinen hva data du vil lagre, bare at du vil lagre noe, og datamaskinen vil finne ut hva du skal gjøre. Det er selvfølgelig unntak, og dette er et litt forenklet syn, men programmering bør være morsomt! Hvis du begynner å grave i de komplekse tekniske detaljene, kan det bli litt slitsomt.

Python er små og små bokstaver. Dette er viktig å vite, ettersom Python ikke gjenkjenner objekter selv om de er stavet riktig hvis saken er feil. 'Dosomething ()' vil ikke fungere hvis metoden faktisk kalles 'DoSomething ()'. Python bruker også innrykk . Andre programmeringsspråk bryr seg kanskje ikke om hvor mange innrykk koden din har, mens Python gjør omsorg. Innrykk brukes til å fortelle Python hvor koden hører til. Andre språk kan bruke 'Curly Braces' ({}) til å gruppere kode - Python bruker ikke disse. Python bruker en hash (#) for kommentarer, og kommentarer brukes til å fortelle andre utviklere eller folk som ser på koden hva en bestemt del gjør, eller hvorfor den er nødvendig. Python ignorerer alt etter en hasj.





Til slutt er det to hovedversjoner av Python - Python 2.7.x og Python 3.x. Det er noen forskjeller mellom de to ( hva er forskjellene? ). Denne opplæringen bruker Python 3.

Førstegangs oppsett

Å gi din Pi er allerede oppsett og kjøring av Raspbian , det er ikke mye første oppsett som trengs.





Åpen terminal ( Meny> Tilbehør> Terminal ) og kjør denne kommandoen. Det er alltid god praksis å holde arkivlisten oppdatert, og dette vil laste ned den nyeste listen over programmer (den vil ikke laste ned programmene selv, dette hjelper Pi med å vite hvilke programmer som heter og hvor de skal finne dem).

sudo apt-get update

Oppdater nå Pi (dette kan ta en stund):

sudo apt-get upgrade

Python og Minecraft Pi er allerede installert, men hvis Minecraft Pi ikke er installert av en eller annen grunn, er det enkelt å installere:

sudo apt-get install minecraft-pi

Naviger til dokumenter og lag en ny mappe kalt 'Minecraft':

cd Documents/
mkdir Minecraft

Du kan se innholdet i denne nye mappen:

ls

Her er et tips - hvis du begynner å skrive og trykker på TAB -tasten, vil kommandolinjen prøve å autofullføre setningen for deg.

Du kan undersøke banen til den nåværende katalogen ved å bruke pwd, som står for Print Working Directory:

pwd

Start Minecraft ved å gå til Meny> Spill> Minecraft Pi . Du trenger denne kjøringen, men kommer tilbake til den senere.

Åpne Python 3 fra Meny> Programmering> Python 3 (IDLE) . Dette programmet gir deg mulighet til å kjøre Python -kommandoer og skrive programmer.

Nå kan du skrive inn Python -kommandoene dine her, men det er ikke veldig praktisk. Gå til Fil> Ny fil og så Fil> Lagre og lagre dette i mappen du opprettet tidligere. ( Dokumenter> Minecraft ). La oss kalle det ' hei_verden.py '. Du trenger ikke å bruke .py -utvidelsen, dette blir lagt til automatisk, men det er god praksis.

Hvis du bytter tilbake til terminalen og navigerer til Minecraft -mappen, bør du se filen du nettopp opprettet:

cd Minecraft/
ls

Du kan kjøre denne filen slik:

python hello_world

Legg merke til hvordan 'python' er små bokstaver. Dette må stå foran filnavnet, da det forteller Pi at den følgende filen er Python, så den bør kjøres som sådan.

Bytt tilbake til Python -editoren og skriv:

print 'Hello, World!'

Lagre denne filen og kjør den igjen - du bør nå se 'Hei, verden!' vises på kommandolinjen - pent! Utskriftskommandoen ber Python ganske enkelt om å skrive ut følgende tekst i doble anførselstegn. Dette er bra, men ikke veldig nyttig for Minecraft, la oss koble det opp:

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

Hvis du lagrer og kjører denne filen, bør du se 'Hei, verden!' vises i Minecraft -spillet. La oss bryte koden:

from mcpi.minecraft import Minecraft

Denne linjen forteller Python at du vil bruke kode fra en annen fil. Denne mcpi.minecraft -filen ble utviklet for å tillate enkel kontroll over Minecraft.

mc = Minecraft.create()

Denne linjen lager et objekt kalt 'mc' (Minecraft). Du må lage dette for å tillate kommunikasjon til Minecraft -spillet - det er ikke nok bare å inkludere filen.

mc.postToChat('Hello, World!')

Til slutt forteller denne linjen Minecraft å skrive litt tekst til chatten. Prøv å endre 'Hei, verden!' til noe annet og se hva som skjer, men husk å inkludere begge sitatene. Hvis du har programvareproblemer, er dette noen vanlige Python- og Minecraft Pi -feil:

  • AttributeError - dette er en skrivefeil, for eksempel halvliter eller prnt i stedet for utskrift
  • NameError: navn 'Minecraft' er ikke definert - husk å importere modulene du trenger
  • NameError: navn 'true' er ikke definert - Python er skiftende mellom store og små bokstaver, endre til 'True'
  • socket.error: [Errno 111] Tilkobling nektet - Kontroller at Minecraft kjører

Prosjekter

Nå som du kjenner det grunnleggende i Python og Minecraft, la oss lage noen kule prosjekter. All kodeken kan lastes ned fra Github.

Automatisert brobygger

Dette programmet vil effektivt bygge en bro over vann. Når spilleren kommer nær en vannmasse, vil programmet konvertere flere blokker til stein. Siden Minecraft bruker et koordinatsystem, er det veldig enkelt å finne plasseringen til spilleren, sammen med typen blokker rundt spilleren. Minecraft Pi er litt begrenset, så det er ikke mulig å oppdatere flere forskjellige blokker i bulk. Du kan imidlertid enkelt kode denne oppførselen selv.

Lag en ny fil ( Fil> Ny fil ) og lagre 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)

Legg merke til hvordan y -verdien faktisk ser på y - 1. Dette er gulvnivået. Hvis verdien av y ble brukt, ville manuset se etter blokker på omtrent knenivå - det ville ikke fungere veldig bra! Mc.getBlock () returnerer id for en blokk for de gitte koordinatene. Siden x, y og z er koordinatene til spilleren, kan du legge til eller trekke fra dem for å få posisjoner rundt spilleren. Du trenger ikke å bruke x-, y- og z -verdiene, du kan bruke et hvilket som helst tall, men du vet kanskje ikke hvordan den aktuelle blokken forholder seg til spilleren - det er bedre å bruke verdier i forhold til spilleren. Kjør denne filen fra kommandolinjen og se hva som skjer.

Du bør se at et lite område av bakken blir til stein når spilleren når en vannmasse. Det er ikke bra - du kan gå fort nok til å forårsake et problem. Du kan løse dette ved å konvertere et større volum vann til land. Den siste delen av metoden mc.setBlocks () er blokk -ID. Den ene er blokk -ID for stein. Du kan endre dette til tre, gress eller noe annet. Hvis du ville, kunne du ganske enkelt konvertere dette til et komplekst design - kanskje en hengebro!

Super Mining -knapp

Dette eksemplet vil gjøre kort arbeid med gruvedrift. Den består av en fysisk knapp, som når den trykkes, vil gruve 10 blokker i terninger. La oss starte med knappen. I likhet med knapper på Arduino, trenger du en liten mengde elektronikk, som alle skal finnes i et grunnleggende startpakke:

  • 1 x brødbrett
  • 1 x momentan bryter
  • 1 x 220 ohm motstand
  • Kvinne> mannlige hoppkabler
  • Hanne> Hannkoplinger

Her er kretsen:

Pi-knapp-tilkobling

Denne motstanden kalles en 'trekk ned' -motstand. Det er med på å sikre at det som Pi tror er knappen som trykkes, virkelig er knappen som trykkes. Du trenger ikke å bruke dette, men det anbefales, da du kan finne mye støy og falske avlesninger uten det.

Knappen er koblet til GPIO -pin (General Purpose Input Output) 14. Du kan bruke hvilken som helst GPIO -pin, men se på pinout først, ettersom de ikke alle kan kontrolleres fra Pi, og varierer litt mellom modellene.

Nå som knappen er tilkoblet, er det på tide å teste den. Lag en ny fil og lagre den som ' button_test.py '. Legg til denne koden, lagre den og kjør den 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

trykk Kontroll + C for å stoppe skriptet. Hvis alt fungerer som det skal, bør du se 'KNAPPEN VIRKER!' i terminalen. Legg merke til hvordan denne testen, i likhet med Minecraft -modulen, bruker RPi.GPIO og tidsmoduler. Disse gir Pi tilgang til maskinvarepinnene og gir nyttige timefunksjoner.

La oss nå fullføre resten av koden. Lag en ny filoppringning ' super_mine.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 nåværende koordinater, som deretter lagres i x, y og z. De setBlocks () metoden forteller Minecraft å fylle alle blokker mellom start og slutt med følgende blokk. Zero er blokk-ID for luft. Du kan endre dette til en annen blokk-ID for å fylle et område helt. Du kan også endre koordinatene til +100 eller til og med +1000 blokker, men Pi kan begynne å slite hvis du blir for gal. Legg merke til hvordan y + 10 er det samme for begge linjene. Du kan endre dette til y - 10 hvis du vil fjerne blokker under jorden.

Teleportering

En annen enkel bruk for denne knappen kan være å 'teleportere'. Minecraft Pi Api gir en måte å angi spillerens posisjon. Følgende kode vil 'teleportere' spilleren til et forhåndsinnstilt sted:

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

Legg merke til at metoden hans godtar tre parametere; x, y og z - slik at du kan sette disse til alt for å umiddelbart teleportere spilleren til det stedet.

Lag en kopi av super_mine -filen ( Fil> Lagre kopi som ) og endre den ved å 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 filen skal nå se slik ut:

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

Lagre det som ' teleport.py 'og løp.

Det kan hende du finner spilleren fast i noen blokker når du bruker dette. I så fall må du justere koordinatene til et kjent åpent rom (øverst til venstre på skjermen viser din nåværende posisjon).

Bygg et hus

En siste oppgave for denne knappen er å bygge et hus. I likhet med eksempelet for rask gruvedrift ovenfor, vil dette ganske enkelt erstatte blokker rundt spilleren for å lage et hus. Ulike blokk-ID-er vil bli brukt til forskjellige materialer (vindu, vegger osv.). For å gjøre ting enklere å kode, vil en solid blokk bli opprettet, og deretter fjernes innsiden (sett blokken til luft), dette vil skape et hul skall. Du kan legge til statister som en seng eller dør, men Minecraft Pi -prosjektet er litt ufullstendig, og selv om disse objektene fungerer når de plasseres av spilleren, er de ikke strålende når du bruker 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

Lagre dette som ' house.py 'og løp. Alt godt, bør du se et lite hus dukke opp (du må kanskje snu for å finne det). Det er veldig enkelt, en åpning og noen vinduer. I teorien er det ingen grense for hvor stor eller kompleks bygning du kan bygge.

Lag et minispill

La oss deretter lage et minispill! Dette vil være ganske enkelt, når spilleren tråkker på en sandblokk, blir det til lava etter en tilfeldig tid. Dette er et godt spill å lage, ettersom du kan designe dine egne nivåer eller endre det for å gjøre ting vanskeligere. Du trenger ikke knappen for dette eksemplet.

Lag en ny fil og lagre 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 koden er en god start på tilfeldig() funksjon: tilfeldig. uniform (0,1, 2,5) vil generere et tilfeldig tall mellom 0,1 (1/10 sekund) og 2,5 (2 1/2 sekund). Å øke disse tallene vil gjøre spillet enklere.

Prøv det! Stå på en sandblokk, og det vil snart bli til lava. Dette kan være grunnlaget for et mer komplekst spill.

Lag et nytt minispill

Forutsetningen for dette spillet er enkel - ikke stå på tregulvet når tiden går ut. Spilleren blir teleportert til en 'arena'. De blir tvunget til å stå stille til kampen starter. Når det er startet, blir gulvet til vann når timeren går ut. Spilleren må stå i den sikre sonen (diamantblokker) for å overleve. Hvert nivå reduserer timeren med ett sekund. Etter hvert vellykket nivå blir det trygge området større. Sjekk koden nedenfor:

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

Lagre dette som ' mini_game_2.py 'og prøv det.

Pi 2 har noen ytelsesproblemer mens du kjører Minecraft. Bruksdiagram for sentralbehandlingsenhet (CPU) ( øverste høyre hjørne ) viser aldri noen tung belastning, så dette må skyldes dårlig design og optimalisering av utviklerne. Disse problemene er ikke relatert til kjøringskode (som de fortsetter når Python ikke kjører), men de blir sammensatt av dette minispillet. Hvis Pi virkelig sliter, kan det være lurt å redusere størrelsen på arenaen eller overklokke Pi.

last ned en film fra et hvilket som helst nettsted

Diamantdetektor

La oss lage en annen krets. Dette vil bruke en lysemitterende diode (LED) for å lyse når det er diamanter under (innen 15 blokker). Her er hva du trenger:

  • 1 x brødbrett
  • 1 x LED
  • 1 x 220 ohm motstand
  • Kvinne> mannlige hoppkabler
  • Hanne> Hannkoplinger

Her er kretsen:

Koble anoden (langt ben) til GPIO Pin 14. Denne pinnen fungerer som +5v. Koble katoden (kortbenet) til bakken.

Jeg har brukt et billig malmleketøy og modifisert det ved å fjerne bakdekselet og elektronikken, og deretter plasserte jeg en LED under det. Du kan enkelt gjøre dette permanent med varmt lim eller noe lignende.

Lagre denne 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 er en diamantmalmblokk under spilleren (innen 15 blokker), blinker lyset.

ThinkGeek Minecraft Light -Up Blue Stone Diamond Ore - Sørg for å holde grisene borte KJØP NÅ PÅ AMAZON

Har du laget noe kult med Minecraft Pi? Gi meg beskjed i kommentarene hva du har gjort eller hvor langt du har gjort det i spillene.

Vi håper du liker elementene vi anbefaler og diskuterer! MUO har tilknyttede og sponsede partnerskap, så vi mottar en andel av inntektene fra noen av kjøpene dine. Dette påvirker ikke prisen du betaler, og hjelper oss med å tilby de beste produktanbefalingene.

Dele Dele kvitring E -post Er det verdt å oppgradere til Windows 11?

Windows har blitt redesignet. Men er det nok til å overbevise deg om å bytte fra Windows 10 til Windows 11?

Les neste
Relaterte temaer
  • DIY
  • Programmering
  • Minecraft
  • Bringebær Pi
  • Elektronikk
  • Python
Om forfatteren Joe Coburn(136 artikler publisert)

Joe er utdannet i informatikk fra University of Lincoln, Storbritannia. Han er en profesjonell programvareutvikler, og når han ikke flyr droner eller skriver musikk, kan han ofte bli funnet å ta bilder eller produsere videoer.

Mer fra Joe Coburn

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere