Lær Python og elektronikk med Minecraft Pi Edition

Lær Python og elektronikk med Minecraft Pi Edition / DIY

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

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

Hindbær Pi 3 Modell B Hovedkort Hindbær Pi 3 Modell B Hovedkort Kjøp nå på Amazon $ 34.49

Ny på Minecraft? Ikke bekymre deg - her er vår Minecraft Beginners Guide The (Latecomer) Begynners Guide til Minecraft The (Latecomer) Begynner's Guide To Minecraft Hvis du er sent til festen, ikke vær redd - denne omfattende beginners guide har du dekket. Les mer .

Introduksjon til Minecraft Pi

Minecraft for Raspberry Pi har blitt utviklet for læring og tinkering (og det er gratis). Den leveres med et Application Programming Interface (API) som gir en måte å kode enkelt å snakke med Minecraft. Det er glimrende for å lære å kodes i Python, så vel som å komme i gang med elektronikk. Begynnerens elektronikk: 10 ferdigheter du trenger å vite Nybegynnerens elektronikk: 10 ferdigheter du trenger å vite Mange av oss har aldri engang rørt et loddestang - men å gjøre ting kan utrolig givende. Her er ti av de mest grunnleggende DIY elektronikk ferdighetene for å hjelpe deg med å komme 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 -program, må datamaskinen først gjøre en liten bit av arbeidet til filen først. Ulemper er at det kan betraktes sakte i forhold til kompilerte språk.

Fordelene med tolket språk er kodenes hastighet og deres vennlighet. Du trenger ikke å fortelle datamaskinen hva data du vil lagre, bare det du vil lagre noe og datamaskinen vil finne ut hva du skal gjøre. Det er unntak, selvfølgelig, og dette er en noe forenklet visning, men programmering bør være morsomt! Hvis du begynner å grave inn i komplekse tekniske detaljer, kan det bli litt mektig.

Python er saksfølsom. Dette er viktig å vite, da Python ikke vil gjenkjenne gjenstander selv om de er stavet riktig hvis saken er feil. “Gjør noe()” vil ikke fungere hvis metoden faktisk kalles “Gjør noe()”. Python bruker også innrykk. Andre programmeringsspråk kan ikke bryr seg om hvor mange ledd kodene dine har, mens Python gjør omsorg. Inndelinger brukes til å fortelle Python hvor kode tilhører. Andre språk kan bruke “Krøllete regulering” () til gruppekode - 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 det er nødvendig. Python ignorerer alt etter en hash.

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

Å sørge for at Pi er installert og kjører Raspbian Slik installerer du et operativsystem til din Raspberry Pi Slik installerer du et operativsystem til din Raspberry Pi Her er hvordan du får et nytt OS installert og kjører på din Pi - og hvordan du kloner ditt perfekte oppsett for rask katastrofegjenoppretting. Les mer, det er ikke mye initialoppsett som trengs.

Åpen terminal (Meny> Tilbehør> Terminal) og kjør denne kommandoen. Det er alltid god praksis å holde oppbevaringslisten oppdatert, og dette vil laste ned den nyeste listen over programmer (det vil ikke laste ned programmene selv, dette hjelper Pi å vite hvilke programmer som kalles og hvor de skal 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 for noen grunn, er det enkelt å installere 5 måter å installere programvare på Raspberry Pi 5 måter å installere programvare på Raspberry Pi For å gjøre noe med en Raspberry Pi, vil du trenger å vite hvordan du installerer et operativsystem, og programvare for å kjøre på den. Hvis du er ny på Linux, kan dette være skremmende. Les mer :

sudo apt-get install minecraft-pi

Naviger til dokumenter og opprett en ny mappe som heter “Minecraft”:

CD Dokumenter / mkdir Minecraft

Du kan se innholdet i denne nye mappen:

ls

Her er et tips - hvis du begynner å skrive og trykke på TAB-tasten, vil kommandolinjen forsøke å autofullfør setningen for deg.

Du kan undersøke stien til gjeldende katalog ved hjelp av pwd, som står for Print Work Directory:

pwd

Start Minecraft ved å gå til Meny> Spill> Minecraft Pi. Du trenger dette løpende, men vil komme tilbake til det 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 dine Python-kommandoer 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 vil bli lagt til automatisk, men det er god praksis.

Hvis du bytter tilbake til terminalen, og navigerer inn 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 alle små bokstaver. Dette må være før filnavnet, da det forteller Pi at den følgende filen er Python, så den bør utføres som sådan.

Bytt tilbake til Python-editoren og skriv:

Skriv ut "Hei, Verden!"

Lagre denne filen og kjør den igjen - du burde nå se “Hei Verden!” vises i kommandolinjen - pent! Utskriftskommandoen forteller bare Python å skrive ut følgende tekst i dobbelte sitater. Dette er bra, men ikke veldig nyttig for Minecraft, la oss koble det opp:

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

Nå, hvis du lagrer og kjører denne filen, bør du se “Hei Verden!” vises i Minecraft-spillet. La oss slå ned 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 over Minecraft.

mc = Minecraft.create ()

Denne linjen oppretter et objekt som heter “mc” (Minecraft). Du må opprette dette for å tillate kommunikasjon til Minecraft-spillet - det er ikke nok bare for å inkludere filen.

mc.postToChat ("Hei, Verden!")

Endelig 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 både de dobbelte sitatene. Hvis du har programvareproblemer, er dette noen vanlige Python- og Minecraft Pi-feil:

  • AttributeError - dette er en skrivefeil, for eksempel pint 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 saksfølsomt, endres til “ekte”
  • socket.error: [Errno 111] Tilkobling nektet - Pass på at Minecraft kjører

prosjekter

Nå som du kjenner grunnlaget for Python og Minecraft, la oss lage noen kule prosjekter. Alt kodekoden kan lastes ned fra Github.

Automatisert Bridge Builder

Dette programmet vil effektivt bygge en bro over vann. Når spilleren nærmer seg en vannkilde, vil programmet konvertere flere blokker til stein. Som Minecraft bruker et koordinatsystem, er det veldig enkelt å få plassering av 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ørelsen selv, men.

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

fra mcpi.minecraft import Minecraft mc = Minecraft.create () # opprett Minecraft Object mens True: x, y, z = mc.player.getPos () # butikkspiller posisjon # 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 en == 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å gulv til solid (stein) hvis vann er funnet 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 - 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 knelivå - det ville ikke fungere veldig bra! Mc.getBlock () returnerer id av en blokk for de oppgitte koordinatene. Siden x, y og z er koordinatene til spilleren, kan du legge til eller trekke fra dem for å få stillinger rundt spilleren. Du trenger ikke å bruke verdiene x, y og z, du kan bruke et hvilket som helst nummer, men du kan ikke vite hvordan den aktuelle blokken gjelder 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 vannkilde. 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 endelige delen av metoden mc.setBlocks () er blokk-ID. En er blokk-id for stein. Du kan forandre dette til tre, gress eller noe. Hvis du vil, kan du ganske enkelt konvertere dette til en kompleks design - kanskje en hengebro!

Super Mining Button

Dette eksemplet vil gjøre kort arbeid med gruvedrift. Den består av en fysisk knapp, som når presset, vil min 10 blokker kuberte. La oss starte med knappen. I likhet med knapper på Arduino, trenger du en liten mengde elektronikk, som alle bør finnes i et grunnleggende startpakke. Hva er i din Arduino Starter Kit? [Arduino Beginners] Hva er i din Arduino Starter Kit? [Arduino Beginners] Faced med en boks full av elektroniske komponenter, er det enkelt å bli overveldet. Her er en guide til nøyaktig hva du finner i ditt sett. Les mer :

  • 1 x brødbrett
  • 1 x kortvarig bryter
  • 1 x 220 ohm motstand
  • Kvinne> Hoppekabler
  • Mann> Mann hoppe kabler

Her er kretsen:

Denne motstanden kalles a “trekke ned” motstand. Det bidrar til å sikre at det Pi mener er at knappen trykkes, egentlig er knappen trykket. 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 en hvilken som helst GPIO-pin, men se først på pinouten, da de ikke alle kan styres 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 så kjør den i Terminal.

importere RPi.GPIO som GPIO importtid GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter som skal brukes GPIO.setup (14, GPIO.IN) # fortell Pi denne pin er en inngang mens True: hvis GPIO.input (14) == True: # se etter knappen trykk ut "BUTTON WORKS!" # loggresultat time.sleep (0.5) # vent 0.5 sekunder 

trykk Kontroll + C å stoppe skriptet. Hvis alt fungerer riktig, bør du se “KNAPP ARBEIDER!” i terminalen. Legg merke til hvordan, som Minecraft-modulen, bruker denne testen RPi.GPIO og tidsmodulene. Disse tillater Pi å få tilgang til maskinvarepinnene og gi nyttige timingfunksjoner.

Nå kan vi fullføre resten av koden. Lag en ny filecalled “super_mine.py“. Her er koden:

importere RPi.GPIO som GPIO importtid fra mcpi.minecraft import Minecraft mc = Minecraft.create () # opprett Minecraft Object GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter å bruke GPIO.setup (14, GPIO.IN ) # Fortell Pi denne pin er en inngang mens True: hvis GPIO.input (14) == True: # se etter knappetrykk x, y, z = mc.player.getPos () # les spilleren posisjon mc.setBlocks (x, y, z, x + 10, y + 10, z + 10, 0) # min 10 blokker mc.setBlocks (x, y, z, x - 10, y + 10, z - 10, 0) min 10 blokker time.sleep (0.5) # vent 0.5 sekunder 

mc.player.getPos () returnerer spillerne nåværende koordinater, som deretter lagres i x, y og z. De setBlocks () Metode forteller Minecraft å fylle alle blokkene mellom start og slutt med følgende blokk. Null er blokk-id for luft. Du kan endre dette til et annet blokk-ID for å fylle et område solidt. 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 ønsket å fjerne blokker under jorden.

teleportere

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

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

Merk at hans metode aksepterer tre parametre; x, y og z - så du kan sette disse til noe for å umiddelbart teleportere spilleren til den plasseringen.

Lag en kopi av super_min-filen (Fil> Lagre kopi som) og endre det ved å erstatte om med følgende:

hvis GPIO.input (14) == True: # lete etter knappen trykk på mc.player.setPos (0, 0, 0) # teleportspiller time.sleep (0.5) # vent 0.5 sekunder 

Denne filen skal nå se slik ut:

importere RPi.GPIO som GPIO fra mcpi.minecraft import Minecraft importtid mc = Minecraft.create () # opprett Minecraft Object GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter å bruke GPIO.setup (14, GPIO.IN ) # fortell Pi denne pin er en inngang mens True: hvis GPIO.input (14) == True: # se etter knappen trykk mc.player.setPos (0, 0, 0) # teleport spiller time.sleep (0.5) # vent 0,5 sekunder 

Lagre det som “teleport.py” og løp.

Du kan finne at spilleren sitter fast i noen blokker når du bruker dette, i så fall må du justere koordinatene til et kjent åpent mellomrom (ø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 hurtiggruveeksemplet ovenfor, vil dette bare erstatte blokker rundt spilleren for å lage et hus. Ulike blokker vil bli brukt til forskjellige materialer (vindu, vegger osv.). For å gjøre det enklere å kode, vil en solid blokk bli opprettet, og deretter innvendig fjernet (sett blokk til luft), vil dette skape et hulskall. Du kan legge til tillegg som en seng eller dør, men Minecraft Pi-prosjektet er litt ufullstendig, og mens disse objektene fungerer når de plasseres av spilleren, er de ikke strålende når du bruker Python.

fra mcpi.minecraft import Minecraft importere RPi.GPIO som GPIO importtid mc = Minecraft.create () # opprett Minecraft Object GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter å bruke GPIO.setup (14, GPIO.IN ) # Fortell Pi denne pin 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) # lage shell mc.setBlocks (x +3, y, z + 3, x + 6, y + 2, z + 7, 0) # fjern Innenfor mc.setBlocks (x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # gjør døråpningen mc.setBlocks (x +4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # gjør vindu 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) 

Lagre dette som “house.py” og løp. Alt er bra, du bør se et lite hus dukker opp (du må kanskje vende rundt for å finne den). Det er veldig enkelt, en åpning og noen vinduer. I teorien er det ingen grense for hvor stor eller kompleks en bygning du kan konstruere.

Lag et mini-spill

Deretter la oss lage et mini-spill! Dette vil være ganske enkelt, når spilleren går på en blokk med sand, blir det til lava etter en tilfeldig tid. Dette er et godt spill å lage, da du kan designe dine egne nivåer eller endre det for å gjøre tingene vanskeligere. Du trenger ikke knappen for dette eksemplet.

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

fra mcpi.minecraft import Minecraft importere tilfeldig importtid mc = Minecraft.create () # opprett Minecraft Object mens True: x, y, z = mc.player.getPos () block_under_player = mc.getBlock (x, y - 1, z ) hvis block_under_player == 12: # spiller står på sand, start timeren random_time = random.uniform (0.1, 2.5) # generere tilfeldig nummer time.sleep (random_time); # vent mc.setBlock (x, y - 1, z, 11) # slå den til lava 

Denne koden er en god start på tilfeldig() funksjon: random.uniform (0,1, 2,5) vil generere et tilfeldig tall mellom 0,1 (1/10 sekund) og 2,5 (2 1/2 sekunder). Å øke disse tallene vil gjøre spillet enklere.

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

Lag et annet mini-spill

Forutsetningen for dette spillet er enkelt - ikke stå på tregulvet når tiden går ut. Spilleren blir teleportert til en “arena”. De blir tvunget til å stå stille til spillet starter. Når en gang er startet, vil gulvet vende seg til vann når timeren løper ut. Spilleren må stå i sikker sone (diamantblokker) for å overleve. Hvert nivå reduserer timeren med ett sekund. Etter hvert vellykket 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) # opprett arena shell mc. setBlocks (0, 0, 0, 25, 10, 25, 17) # hollow out arena mc.setBlocks (1, 1, 1, 24, 10, 24, 0) # Flytt spiller til arena mc.player.setPos , 25, 20) # teleportspiller # få dem til å bli satt # teleportspiller for å starte posisjon hver 1. / 10. sekund. # Gjør dette i 5 sekunder og start spilletid.sleep (2) total_wait = 0 mc.postToChat ("Venter på Start") mens 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 gi det en løp.

Pi 2 har noen ytelsesproblemer mens du kjører Minecraft. Den sentrale behandlingsenheten (CPU) brukskurven (øverste høyre hjørne) viser aldri noen tung belastning, så dette må være ned til dårlig design og optimaliseringer av utviklerne. Disse problemene er ikke relatert til kjøringskode (som de fortsetter når Python ikke kjører), men de er sammensatt av dette minispillet. Hvis Pi virkelig sliter, vil du kanskje redusere størrelsen på arenaen eller overklare Pi ikke nok juice? Klem din Raspberry Pi Ved Overclocking Ikke nok juice? Klem din Raspberry Pi ved overklokking Hvis det er noen maskinvare utgitt i 2012 som du sannsynligvis vil bli forelsket i, er det søt-som-sukker Raspberry Pi, en mini-datamaskin designet og bygget i Storbritannia som har sendt rundt i verden. Les mer .

Diamantdetektor

La oss lage en annen krets. Dette vil bruke en lysdiode (LED) til å lyse opp 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> Hoppekabler
  • Mann> Mann hoppe kabler

Her er kretsen:

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

Jeg har brukt en billig malm leke og modifisert det ved å fjerne bakdekselet og elektronikk, jeg så plassert en LED under den. Du kan lett gjøre dette permanent med varmt lim eller noe lignende.

Lagre denne koden som “diamonds.py“:

importere RPi.GPIO som GPIO importtid fra mcpi.minecraft import Minecraft mc = Minecraft.create () # opprett Minecraft Object led_pin = 14 # lagre GPIO pin nummer GPIO.setmode (GPIO.BCM) # fortell Pi hvilke overskrifter som skal brukes GPIO.setup (14, GPIO.OUT) # fortell Pi denne pin er en utgang mens True: # gjenta ubestemt x, y, z = mc.player.getPos () for jeg i rekkevidde (15): # se på hver blokkere 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) # slå lysdioden av tid. sov (0,25) # vent 

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

ThinkGeek Minecraft Light Up Blue Stone Diamond Ore - sikker på å holde pigmen Away ThinkGeek Minecraft Light Up Blue Stone Diamond Ore - sikker på å holde pigmen Away Kjøp nå på Amazon $ 31.99

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

Utforsk mer om: Elektronikk, Minecraft, Programmering, Python, Raspberry Pi.