Annonse

Har du alltid ønsket å lære å kode, men ikke visste hvor du skal 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 selv om 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.

Er du ny på Minecraft? Ikke bekymre deg - her er vårt Minecraft nybegynnerguide The (Latecomer) Beginner's Guide To MinecraftHvis du er sent ute til festen, ikke bekymre deg - denne omfattende nybegynnerguiden har du dekket. Les mer .

Introduksjon til Minecraft Pi

Minecraft-Pi-Meny

Minecraft for Raspberry Pi er utviklet for læring og fiksing (og det er gratis). Den leveres med et applikasjonsprogrammeringsgrensesnitt (API) som gir en måte å kode på enkelt å snakke med Minecraft. Det er strålende å lære å kode i Python, så vel som komme i gang med elektronikk Begynnerelektronikk: 10 ferdigheter du trenger å vite

instagram viewer
Mange av oss har aldri rørt et loddejern - men å gjøre ting kan være utrolig givende. Her er ti av de mest grunnleggende DIY-elektronikkferdighetene for å hjelpe deg i gang. Les mer .

Hva er Python?

Python er et programmeringsspråk. Det er tolket, som betyr at når du kjører en Python-fil eller et program, må datamaskinen gjøre en liten bit av arbeidet først. Ulempene er at det kan betraktes som tregt sammenlignet med samlet språk.

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

Python er små og små bokstaver. Dette er viktig å vite, siden Python ikke vil gjenkjenne gjenstander 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 hvor mange innrykk koden har, mens Python gjør omsorg. Innrykk brukes til å fortelle Python hvor koden hører hjemme. Andre språk kan bruke “Curly Braces” ({}) for å gruppere kode - Python bruker ikke disse. Python bruker en hasj (#) for kommentarer, og kommentarer brukes til å fortelle andre utviklere eller personer som ser på koden hva en bestemt del gjør, eller hvorfor den er nødvendig. Python ignorerer noe etter en hasj.

Endelig 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 vil bruke Python 3.

Førstegangs oppsett

Å gi din Pi er allerede installere og kjøre Raspbian Slik installerer du et operativsystem på en Raspberry PiSlik installerer du et OS på Raspberry Pi og hvordan du kloner det perfekte oppsettet for rask gjenoppretting av katastrofer. Les mer , er det ikke mye innledende oppsett som trengs.

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

sudo apt-get oppdatering. 

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

sudo apt-get oppgradering. 

Python og Minecraft Pi er allerede installert, men hvis Minecraft Pi ikke er installert av noen grunn, det er enkelt å installere 5 måter å installere programvare på Raspberry PiFor å gjøre noe med en Raspberry Pi, må du vite hvordan du installerer et operativsystem og programvare for å kjøre på det. Hvis du er ny på Linux, kan dette være skremmende. Les mer :

sudo apt-get install minecraft-pi

Naviger til dokumenter og lag en ny mappe som heter "Minecraft":

cd-dokumenter / mkdir Minecraft

Du kan se innholdet i denne nye mappen:

ls

Dette er et tips - hvis du begynner å skrive og trykker på TAB-tasten, vil kommandolinjen prøve å fullføre uttalelsen automatisk.

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

pwd

Start Minecraft med å gå til Meny> Spill> Minecraft Pi. Du trenger dette kjører, men kommer tilbake til det senere.

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

Nå kan du skrive inn Python-kommandoene 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 "hello_world.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 i 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å være før filnavnet, ettersom den forteller Pi at følgende fil er Python, så den skal kjøres som sådan.

Bytt tilbake til Python-editoren og skriv:

trykk "Hallo, verden!"

Lagre denne filen og kjør den igjen - du skal nå se "Hallo, verden!" vises i kommandolinjen - ryddig! Utskriftskommandoen ber Python ganske enkelt om å skrive ut følgende tekst i doble sitater. Dette er bra, men ikke veldig nyttig for Minecraft, la oss koble det sammen:

fra mcpi.minecraft import Minecraft mc = Minecraft.create () mc.postToChat ("Hei, verden!")

Hvis du lagrer og kjører denne filen, skal du se "Hei, verden!" vises i Minecraft-spillet. La oss fordele koden:

fra 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 av Minecraft.

mc = Minecraft.create ()

Denne linjen oppretter et objekt som heter "mc" (Minecraft). Du må lage dette for å tillate kommunikasjon til Minecraft-spillet - det er ikke nok bare å ta med filen.

mc.postToChat ("Hei, verden!")

Til slutt ber denne linjen Minecraft om å skrive litt tekst til chatten. Prøv å endre "Hallo, verden!" til noe annet og se hva som skjer, men husk å ta med begge dobbeltsidene. 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: navnet ‘Minecraft’ er ikke definert - husk å importere modulene du trenger
  • NameError: name ‘true’ er ikke definert - Python er store og små bokstaver, endre til “True”
  • socket.error: [Errno 111] Tilkoblingen nektet - Forsikre deg om at Minecraft kjører

prosjekter

Nå som du kjenner det grunnleggende om Python og Minecraft, la oss lage noen kule prosjekter. Alt codecan kan lastes ned fra GitHub.

Automatisert Bridge Builder

Minecraft-Pi-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 å få 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.

Opprett en ny fil (Fil> Ny fil) og lagre den som "bridge_builder.py“.

fra mcpi.minecraft import Minecraft. mc = Minecraft.create () # opprett Minecraft-objekt mens det er sant: x, y, z = mc.player.getPos () # lagre spillerposisjon # lagre de omkringliggende blokkene 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) hvis 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 er vann. Sett omliggende blokker på gulvet til en solid (stein) hvis vann finnes 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 skriptet se etter blokker på omtrent knenivå - det ville ikke fungert veldig bra! Mc.getBlock () returnerer IDen til en blokk for de gitte koordinatene. Ettersom 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 verdiene x, y og z, du kan bruke et hvilket som helst tall, men du vet kanskje ikke hvordan den spesielle 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å raskt 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 hva som helst. Hvis du ville, kunne du ganske enkelt konvertere dette til et komplekst design - kanskje en hengebro!

Super gruvedrift-knapp

Minecraft-Pi-Super-Mine

Dette eksemplet vil gjøre kort arbeid med gruvedrift. Den består av en fysisk knapp, som når den trykkes, vil gruve 10 kubikkblokker. La oss begynne med knappen. I likhet med knappene på Arduino, trenger du en liten mengde elektronikk, som alle skal finnes i en grunnleggende startpakke Hva finnes i Arduino Starter Kit? [Arduino nybegynnere]Overfor en boks full av elektroniske komponenter er det lett å bli overveldet. Her er en guide til nøyaktig hva du finner i settet ditt. Les mer :

  • 1 x brødbrett
  • 1 x momentant bryter
  • 1 x 220 ohm motstand
  • Kvinne> hoppkabler for menn
  • Mann> Hoppkabler for menn

Her er kretsen:

Pi-Button-Connection

Denne motstanden kalles en "trekk ned" motstand. Det hjelper til å sikre at det Pi mener er knappen som trykkes, virkelig er knappen som trykkes. Du trenger ikke å bruke dette, men det anbefales, siden du kan finne mye støy og falske avlesninger uten det.

Knappen er koblet til GPIO-stift 14 (General Purpose Input Output). Du kan bruke hvilken som helst GPIO-pinne, men se på pinout først, da de ikke alle er kontrollerbare 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.

importer RPi. GPIO som GPIO. importtid GPIO.setmode (GPIO.BCM) # fortell Pi hvilke topptekster du skal bruke. GPIO.setup (14, GPIO.IN) # fortell Pi at denne pinnen er en inngang mens True: Hvis GPIO.input (14) == True: # se etter knappetrykk på trykk "BUTTON WORKS!" # log result time.sleep (0.5) # vent 0,5 sekunder. 

trykk Kontroll + C for å stoppe manuset. Hvis alt fungerer som det skal, skal du se “KNAPPARBEID!” i terminalen. Legg merke til hvordan denne testen, som Minecraft-modulen, bruker RPi. GPIO og tidsmoduler. Disse gjør at Pi får tilgang til maskinvarepinnene og gir nyttige tidsfunksjoner.

La oss nå fullføre resten av koden. Opprett en ny innkalt “super_mine.py“. Her er koden:

importer RPi. GPIO som GPIO. importtid. fra mcpi.minecraft import Minecraft mc = Minecraft.create () # create Minecraft Object GPIO.setmode (GPIO.BCM) # fortell Pi hvilke topptekster som skal brukes. GPIO.setup (14, GPIO.IN) # fortell Pi at denne pinnen er en inngang mens True: Hvis GPIO.input (14) == True: # se etter knappetrykk på x, y, z = mc.player.getPos ( ) # lese spilleren posisjon mc.setBlocks (x, y, z, x + 10, y + 10, z + 10, 0) # mine 10 blokker mc.setBlocks (x, y, z, x - 10, y + 10, z - 10, 0) # mine 10 blokkerer tid. Sover (0.5) # vent 0.5 sekunder. 

mc.player.getPos () returnerer spillerne gjeldende 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. Null er blokkerings-id for luft. Du kan endre dette til en annen blokkering-id for å fylle et område. Du kan også endre koordinatene til +100 eller +1000 blokker, men Pi-en kan begynne å slite hvis du blir for gal. Legg merke til hvordan y + 10 er den samme for begge linjene. Du kan endre dette til y - 10 hvis du ville fjerne blokker under jorden.

teleportere

Minecraft-Pi-teleportere

En annen enkel bruk for denne knappen kan være å "teleportere". Minecraft Pi Api gir en måte å stille spillerposisjonen på. Følgende kode "teleporterer" 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 stille disse til noe som helst for å 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:

hvis GPIO.input (14) == True: # se etter knappetrykk på mc.player.setPos (0, 0, 0) # teleport player time.sleep (0.5) # vent 0,5 sekunder. 

Denne filen skal nå se slik ut:

importer RPi. GPIO som GPIO. fra mcpi.minecraft import Minecraft. importtid mc = Minecraft.create () # create Minecraft Object GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter som skal brukes. GPIO.setup (14, GPIO.IN) # fortell Pi at denne pinnen er en inngang mens True: hvis GPIO.input (14) == True: # se etter knappetrykk mc.player.setPos (0, 0, 0) # teleport player time.sleep (0.5) # wait 0.5 sekunder. 

Lagre den som “teleport.py”Og løp.

Du kan finne at spilleren blir sittende fast i noen blokker når du bruker dette, i hvilket tilfelle du trenger det juster koordinatene til et kjent åpent rom (øverst til venstre på skjermen viser strømmen din plassering).

Bygg et hus

Minecraft-Pi-House

En siste oppgave for denne knappen er å bygge et hus. I likhet med hurtiggruveeksemplet ovenfor, vil dette ganske enkelt erstatte blokker som omgir spilleren for å lage et hus. Ulike blokkeringer vil bli brukt for forskjellige materialer (vindu, vegger osv.). For å gjøre ting lettere å kode, opprettes en solid blokk, og deretter fjernes innsiden (sett blokkering til luft), dette vil skape et hult skall. Du kan legge til ekstrautstyr som en seng eller en 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.

fra mcpi.minecraft import Minecraft. importer RPi. GPIO som GPIO. importtid mc = Minecraft.create () # create Minecraft Object GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter som skal brukes. GPIO.setup (14, GPIO.IN) # fortell Pi at denne pinnen er en inngang mens True: hvis 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) # lag skall mc.setBlocks (x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # fjern inne i mc.setBlocks (x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # lage døråpning mc.setBlocks (x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # lage vindu 1 mc.setBlocks (x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # lage vindu 2 mc.setBlocks (x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # lage vindu 3. 

Lagre dette som “house.py”Og løp. Hvis du er i orden, bør du se et lite hus dukke opp (du må kanskje snu deg for å finne det). Det er veldig enkelt, en åpning og noen vinduer. I teorien er det ingen grense for hvor stort eller komplekst et bygg du kan konstruere.

Lag et minispel

Minecraft-Pi-Lava-spill

Neste, la oss lage et minispel! Dette vil være ganske enkelt, når spilleren tråkker på en sandblokk, vil den bli til lava etter en tilfeldig periode. Dette er et godt spill å lage, siden du kan designe dine egne nivåer eller endre det for å gjøre ting vanskeligere. Du trenger ikke knappen for dette eksempelet.

Lag en ny fil og lagre den som "mini_game.py“. Her er koden:

fra mcpi.minecraft import Minecraft. import tilfeldig. importtid mc = Minecraft.create () # lage Minecraft-objekt mens sant: x, y, z = mc.player.getPos () block_under_player = mc.getBlock (x, y - 1, z) hvis block_under_player == 12: # spiller som står på sand, start tidtakeren random_time = random.uniform (0.1, 2.5) # generer random number time.sleep (Random_time); # vent mc.setBlock (x, y - 1, z, 11) # gjør det til 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 den vil snart bli lava. Dette kan være grunnlaget for et mer komplekst spill.

Lag et annet minispel

Minecraft-Pi-minispill

Forutsetningen for dette spillet er enkelt - ikke stå på tregulvet når tiden er ute. Spilleren blir teleportert til en "arena". De blir tvunget til å stå stille til spillet starter. Når gulvet er startet, vil gulvet bli til vann når timeren går ut. Spilleren må stå i sikker sone (diamantblokker) for å overleve. Hvert nivå reduserer tidtakeren med ett sekund. Etter hvert vellykkede nivå blir det trygge området større. Sjekk koden nedenfor:

importtid. import tilfeldig. fra mcpi.minecraft import Minecraft mc = Minecraft.create () # opprett Minecraft Object # klart område. mc.setBlocks (-10, 1, -10, 25, 5, 25, 0) # lage arena shell. mc.setBlocks (0, 0, 0, 25, 10, 25, 17) # hul ut arena. mc.setBlocks (1, 1, 1, 24, 10, 24, 0) # flytt spilleren til arenaen. mc.player.setPos (14, 25, 20) # teleport-spiller # får dem til å bli satt. # teleportspiller for å starte posisjon hvert 1. / 10. sekund. # gjør dette i 5 sekunder og start spillet. time.sleep (2) totalt_venter = 0. mc.postToChat ("Venter på å starte") mens total_wait <5: mc.player.setPos (14, 1, 20) # teleport player time.sleep (0.1) total_wait + = 0.1 mc.postToChat ("BEGIN!") # 10 nivåer. for nivå i området (10): x, y, z = mc.player.getPos () level_time = 10 - level # reduser tiden med 1 sekund for hvert nivå mc.postToChat ("Nivå -" + str (nivå + 1) + "start") # bygg gulv 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) forløpt_tid = 0 mens 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 ") pause; annet: # fjerne gulvet mc.setBlocks (-10, 0, -10, 25, 0, 25, 8) # sett det sikre området tilbake mc.setBlocks (safe_area_start, 0, safe_area_end, safe_area_start + nivå, 0, safe_area_end + level, 57) tid.søvn (2.5) fortsett pause.

Lagre dette som “mini_game_2.py”Og gi det et løp.

Pi 2 har noen ytelsesproblemer mens jeg kjører Minecraft. CPU-bruksgrafen (Central Processing Unit)øverste høyre hjørne) viser aldri tung belastning, så dette må være ned til dårlig design og optimaliseringer av utviklerne. Disse problemene er ikke relatert til kjørekode (som de fortsetter når Python ikke kjører), men de blir forsterket av dette minispelet. Hvis Pi-en din virkelig sliter, kan det være lurt å redusere størrelsen på arenaen eller overklokke din Pi Ikke nok juice? Klem bringebærpien din ved å overklokkeHvis det er gitt ut noen maskinvare i 2012 som du sannsynligvis vil bli forelsket i, er det Raspberry Pi, søt som sukker, en minidatamaskin designet og bygget i Storbritannia som har sendt rundt hele ... Les mer .

Diamantdetektor

Minecraft-Pi-Diamonds

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

  • 1 x brødbrett
  • 1 x LED
  • 1 x 220 ohm motstand
  • Kvinne> hoppkabler for menn
  • Mann> Hoppkabler for menn

Her er kretsen:

Pi-LED-Connection

Koble anoden (langbenet) til GPIO Pin 14. Denne pinnen fungerer som + 5v. Koble katoden (korte benet) til bakken.

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

Minecraft-Ore-Toy

Lagre denne koden som “diamonds.py“:

importer RPi. GPIO som GPIO. importtid. fra mcpi.minecraft import Minecraft mc = Minecraft.create () # create Minecraft Object led_pin = 14 # lagre GPIO-pinnenummer GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter som skal brukes. GPIO.setup (14, GPIO.OUT) # fortell Pi at denne pinnen er en utgang mens True: # gjenta på ubestemt tid x, y, z = mc.player.getPos () for i innen rekkevidde (15): # se på hver blokker til blokk 15 hvis mc.getBlock (x, y - i, z) == 56: GPIO.output (led_pin, True) # slå LED på time.sleep (0.25) # vent GPIO.output (led_pin, False) # turn LED off time.sleep (0.25) # vente. 

Når det er en diamantmalmblokk under spilleren (innen 15 blokker), vil lyset blinke.

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

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