Lær Python og elektronik med Minecraft Pi Edition

  • Harry James
  • 0
  • 2383
  • 87
Reklame

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

Du har brug for en Pi 2 eller nyere til dette projekt, og selvom du kunne udføre de fleste af disse opgaver via kommandolinjen over Secure Shell (SSH), fokuserer denne tutorial på kodning direkte på Pi.

Ny på Minecraft? Bare rolig - her er vores Minecraft Beginner-guide The (Latecomer) Beginners Guide til Minecraft The (Latecomer) Beginners Guide til Minecraft Hvis du er sent til festen, skal du ikke bekymre dig - denne omfattende begynderguide har du dækket. .

Introduktion til Minecraft Pi

Minecraft til Raspberry Pi er udviklet til læring og tinkering (og det er gratis). Det leveres med en applikationsprogrammeringsgrænseflade (API), som giver en måde at kode til let at tale med Minecraft. Det er strålende at lære at kode i Python, såvel som at komme i gang med elektronik Begynderelektronik: 10 færdigheder, du har brug for at vide Begynderelektronik: 10 færdigheder, du har brug for at vide Mange af os har aldrig engang rørt ved et loddejern - men at gøre ting kan utroligt givende. Her er ti af de mest basale DIY-elektronikfærdigheder, der hjælper dig med at komme i gang. .

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 gøre en lille smule arbejde til filen. Ulemperne er, at det kan betragtes som langsomt sammenlignet med kompilerede sprog.

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

Python er store og små bogstaver. Dette er vigtigt at vide, da Python ikke genkender genstande selvom de stave korrekt hvis sagen er forkert. “Gør noget()” fungerer ikke, hvis metoden faktisk kaldes “Gør noget()”. Python bruger også indrykk. Andre programmeringssprog er ligeglad med hvor mange indrykkere din kode har, mens Python gør omsorg. Indrykk bruges til at fortælle Python, hvor koden hører til. Andre sprog kan bruge “Krøllede seler” () til gruppekode - Python bruger ikke disse. Python bruger en hash (#) til kommentarer, og kommentarer bruges til at fortælle andre udviklere eller personer, der ser på koden, hvad en bestemt del gør, eller hvorfor den er nødvendig. Python ignorerer noget 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 tutorial bruger Python 3.

Første opsætning

Forudsat at din Pi allerede er konfigureret og kører Raspbian Sådan installeres et operativsystem på en Raspberry Pi Sådan installeres et operativsystem på en Raspberry Pi Sådan installeres et operativsystem på din Raspberry Pi, og hvordan du kloner din perfekte opsætning til hurtig katastrofegendannelse . , der er ikke meget initial installation nødvendig.

Åben terminal (Menu> Tilbehør> Terminal) og kør denne kommando. Det er altid god praksis at holde opbevaringslisten opdateret, og dette vil hente den nyeste liste over programmer (den vil ikke downloade programmerne i sig selv, dette hjælper Pi med at vide, hvilke programmer der kaldes, og hvor de kan finde dem).

sudo apt-get-opdatering 

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

sudo apt-get-opgradering 

Python og Minecraft Pi er allerede installeret, men hvis Minecraft Pi ikke er installeret af nogen grund, er det nemt at installere 5 måder at installere software på Raspberry Pi 5 måder at installere software på Raspberry Pi For at gøre noget med en Raspberry Pi, skal du har brug for at vide, hvordan man installerer et operativsystem, og software til at køre på det. Hvis du er ny på Linux, kan dette være skræmmende. :

sudo apt-get install minecraft-pi

Naviger til dokumenter og opret en ny mappe, der kaldes “Minecraft”:

cd Dokumenter / mkdir Minecraft

Du kan se indholdet i denne nye mappe:

ls

Her er et tip - hvis du begynder at skrive og rammer TAB-tasten, vil kommandolinjen forsøge at udfylde erklæringen automatisk for dig.

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

pwd

Start Minecraft ved at gå til Menu> Spil> Minecraft Pi. Du har brug for dette, men kører tilbage til det senere.

Åbn Python 3 fra Menu> Programmering> Python 3 (IDLE). Dette program giver dig en måde at køre Python-kommandoer og til at skrive programmer.

Nu kan du skrive dine Python-kommandoer her, men det er ikke meget praktisk. Gå til Fil> Ny fil og så Fil> Gem og gem dette i den mappe, du oprettede tidligere. (Dokumenter> Minecraft). Lad os kalde det “hello_world.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 i 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” er alt med 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:

tryk "Hej, verden!"

Gem denne fil og kør den igen - du skal nu se “Hej Verden!” vises på kommandolinjen - pænt! Udskrivningskommandoen fortæller simpelthen Python at udskrive følgende tekst i dobbeltcitater. Dette er godt, men ikke meget nyttigt for Minecraft, lad os linke det op:

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

Hvis du nu gemmer og kører denne fil, skal du se “Hej Verden!” vises i Minecraft-spillet. Lad os fordele koden:

fra 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 tillade let kontrol af Minecraft.

mc = Minecraft.create ()

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

mc.postToChat ("Hej, verden!")

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 dobbeltcitater. Hvis du har softwareproblemer, er disse nogle almindelige Python og Minecraft Pi fejl:

  • AttributeError - dette er en skrivefejl, fx 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 “Rigtigt”
  • socket.error: [Errno 111] Forbindelse nægtet - Sørg for, at Minecraft kører

Projekter

Nu hvor du kender det grundlæggende i Python og Minecraft, lad os lave nogle seje projekter. Alt codecan downloades fra Github.

Automatiseret brobygger

Dette program vil effektivt bygge en bro over vandet. 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 ​​spilleren sammen med typen af ​​blokke omkring afspilleren. Minecraft Pi er lidt begrænset, så det er ikke muligt at opdatere flere forskellige blokke i bulk. Du kan dog let kode denne opførsel selv.

Opret en ny fil (Fil> Ny fil) og gem det som “bridge_builder.py“.

fra mcpi.minecraft import Minecraft mc = Minecraft.create () # opret Minecraft-objekt, mens sandt: x, y, z = mc.player.getPos () # butik spillerposition # gem de omgivende blokke 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 vand. Indstil omgivende blokke på gulvet til en fast (sten), hvis der findes vand 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) 

Bemærk, hvordan y-værdien rent faktisk ser på y - 1. Dette er gulvniveauet. Hvis værdien af ​​y blev brugt, ville manuskriptet kigge efter blokke på knæet niveau - det ville ikke fungere særlig godt! Mc.getBlock () returnerer id for en blok for de givne koordinater. Da x, y og z er koordinaterne for afspilleren, kan du tilføje eller trække fra dem for at få positioner omkring spilleren. Du behøver ikke at bruge værdierne x, y og z, du kan bruge ethvert tal, men du ved muligvis 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 område af jorden bliver til sten, når spilleren når en vandmasse. Det er ikke godt - du er i stand til at gå hurtigt nok til at forårsage et problem. Du kan løse dette ved at konvertere et større volumen vand til land. Den sidste del af metoden mc.setBlocks () er blok-id. Den ene er blok-id for sten. Du kan ændre dette til træ, græs eller hvad som helst. 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 et kort arbejde med minedrift. Den består af en fysisk knap, der, når der trykkes på, vil miner 10 blokke i kuben. Lad os starte med knappen. I lighed med knapper på Arduino har du brug for en lille mængde elektronik, som alle skal findes i et grundlæggende startsæt Hvad findes i dit Arduino Starter Kit? [Arduino-begyndere] Hvad er der i dit Arduino-startkit? [Arduino-begyndere] Det er let at blive overvældet overfor en kasse fuld af elektroniske komponenter. Her er en guide til nøjagtigt, hvad du finder i dit sæt. :

  • 1 x Breadboard
  • 1 x momentant afbryder
  • 1 x 220 ohm modstand
  • Kvinde> hanhoppekabler
  • Mand> Hoppekabler til mænd

Her er kredsløbet:

Denne modstand kaldes a “træk ned” modstand. Det hjælper med at sikre, at det, Pi mener, er, at der trykkes på knappen, virkelig er knappen, der bliver trykket på. Du behøver ikke at bruge dette, men det anbefales, da du muligvis finder masser af støj og falske aflæsninger uden det.

Knappen er tilsluttet GPIO-stift (General Purpose Input Output). Du kan bruge en hvilken som helst GPIO-pin, men se først på pinout, da de ikke alle kan kontrolleres fra Pi og varierer lidt mellem modeller.

Nu når 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.

importer RPi.GPIO som GPIO importtid GPIO.setmode (GPIO.BCM) # fortæl Pi, hvilke overskrifter, der skal bruges GPIO.setup (14, GPIO.IN) # fortæl Pi, denne pin er en input, mens sandt: hvis GPIO.input (14) == Sand: # kig efter knaptryk udskriv "BUTTON WORKS!" # log resultat tid. søvn (0.5) # vent 0,5 sekunder 

Trykke Kontrol + C for at stoppe scriptet. Hvis alt fungerer korrekt, skal du se “BUTTON WORKS!” i terminalen. Bemærk, hvordan denne test, ligesom Minecraft-modulet, bruger RPi.GPIO og tidsmoduler. Disse giver Pi adgang til hardwarepindene og giver nyttige timingfunktioner.

Lad os nu afslutte resten af ​​koden. Opret en ny filekaldt “super_mine.py“. Her er koden:

import RPi.GPIO som GPIO-importtid fra mcpi.minecraft import Minecraft mc = Minecraft.create () # opret Minecraft Object GPIO.setmode (GPIO.BCM) # fortæl Pi, hvilke overskrifter, der skal bruges GPIO.setup (14, GPIO.IN ) # fortæl til Pi, at denne pin er et input, mens sandt: Hvis GPIO.input (14) == Sandt: # se efter knap, tryk på x, y, z = mc.player.getPos () # læs spillerens position mc.setBlocks (x, y, z, x + 10, y + 10, z + 10, 0) # mine 10 blokke mc.setBlocks (x, y, z, x - 10, y + 10, z - 10, 0) # mine 10 blokke time.sleep (0.5) # vent 0,5 sekunder 

mc.player.getPos () returnerer spillerens aktuelle koordinater, som derefter gemmes i x, y og z. Det setBlocks () metoden fortæller Minecraft at udfylde alle blokke mellem start og slutning med følgende blok. Nul er blok-id for luft. Du kan ændre dette til et andet blok-id til solidt udfylde et område. Du kan også ændre koordinaterne til +100 eller endda +1000 blokke, men Pi kan muligvis begynde at kæmpe, hvis du bliver for skør. Bemærk, hvordan y + 10 er den samme for begge linjer. Du kan ændre dette til y - 10, hvis du ville fjerne blokke under jorden.

teleporting

En anden enkel anvendelse til denne knap kunne være at “teleport”. Minecraft Pi Api giver en måde at indstille spillerpositionen. Følgende kode vil “teleport” 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 noget 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:

hvis GPIO.input (14) == Sand: # se efter knap tryk på mc.player.setPos (0, 0, 0) # teleport-afspiller tid.søvn (0.5) # vent 0,5 sekunder 

Denne fil skal nu se sådan ud:

import RPi.GPIO som GPIO fra mcpi.minecraft import Minecraft importtid mc = Minecraft.create () # Opret Minecraft Object GPIO.setmode (GPIO.BCM) # fortæl Pi, hvilke overskrifter der skal bruges GPIO.setup (14, GPIO.IN ) # fortæl Pi, at denne pin er et input, mens det er sandt: hvis GPIO.input (14) == Sand: # se efter knap, tryk på mc.player.setPos (0, 0, 0) # teleport-afspiller tid.søvn (0.5) # vent 0,5 sekunder 

Gem det som “teleport.py” og løb.

Du finder måske, at afspilleren sidder fast i nogle blokke, når du bruger dette, i hvilket tilfælde skal du justere koordinaterne til et kendt åbent rum (øverste venstre hjørne af skærmen viser din aktuelle placering).

Byg et hus

En sidste opgave for denne knap er at bygge et hus. Ligesom hurtig-mining-eksemplet ovenfor, vil dette simpelthen erstatte blokke, der omgiver spilleren, for at oprette et hus. Forskellige blok-id'er bruges til forskellige materialer (vindue, vægge osv.). For at gøre tingene lettere at kode, oprettes en solid blok, og derefter fjernes indersiden (sættes blok til luft), dette skaber en hul skal. Du kan tilføje ekstraudstyr som en seng eller en dør, men Minecraft Pi-projektet er lidt ufuldstændigt, og selvom disse objekter fungerer, når de placeres af spilleren, er de ikke strålende, når du bruger Python.

fra mcpi.minecraft-import Minecraft-import RPi.GPIO som GPIO-importtid mc = Minecraft.create () # opret Minecraft Object GPIO.setmode (GPIO.BCM) # fortæl Pi, hvilke overskrifter der skal bruges GPIO.setup (14, GPIO.IN ) # fortæl Pi, at denne pin er et input, mens sandt: hvis GPIO.input (14) == Sandt: x, y, z = mc.player.getPos () mc.setBlocks (x + 2, y - 1, z + 2, x + 7, y + 3, z + 8, 5) # lave shell mc.setBlocks (x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # fjern inden i mc.setBlocks (x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # lave døråbning mc.setBlocks (x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # lav vindue 1 mc.setBlocks (x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # make-vindue 2 mc.setBlocks (x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # make-vindue 3 

Gem dette som “house.py” og løb. I det hele taget skal du se et lille hus vises (du skal muligvis vende dig for at finde det). Det er meget enkelt, en åbning og nogle vinduer. I teorien er der ingen grænser for, hvor stor eller kompleks en bygning du kunne konstruere.

Lav et minispil

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

Opret en ny fil og gem den som “mini_game.py“. Her er koden:

fra mcpi.minecraft import Minecraft import tilfældig importtid mc = Minecraft.create () # oprette Minecraft-objekt, mens sandt: x, y, z = mc.player.getPos () block_under_player = mc.getBlock (x, y - 1, z ) Hvis block_under_player == 12: # spiller, der står på sand, skal du starte timeren random_time = random.uniform (0.1, 2.5) # generere tilfældigt tal time.sleep (random_time); # vent mc.setBlock (x, y - 1, z, 11) # forvandle det til lava 

Denne kode er en god starter på tilfældig() fungere: tilfældig.uniform (0,1, 2,5) genererer et tilfældigt tal mellem 0,1 (1/10 sekund) og 2,5 (2 1/2 sekund). At øge disse numre vil gøre spillet lettere.

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

Lav et andet minispil

Forudsætningen for dette spil er enkel - ikke stå på trægulvet, når tiden løber ud. Spilleren bliver teleporteret til en “arena”. De bliver tvunget til at stå stille, indtil spillet starter. Når først gulvet er startet, vil gulvet vende til vand, når timeren løber tør. Spilleren skal stå i sikker 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:

importtid import tilfældigt fra mcpi.minecraft import Minecraft mc = Minecraft.create () # Opret Minecraft Objekt # klart område mc.setBlocks (-10, 1, -10, 25, 5, 25, 0) # skab arena shell mc. setBlocks (0, 0, 0, 25, 10, 25, 17) # hul ud arena mc.setBlocks (1, 1, 1, 24, 10, 24, 0) # flyt spiller til arena mc.player.setPos (14 , 25, 20) # teleport-afspiller # få dem til at forblive sat # teleport-spiller til at starte position hvert 1. / 10. sekund. # gør dette i 5 sekunder, start derefter spilletid. sove (2) total_wait = 0 mc.postToChat ("venter på at 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 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 give det et løb.

Pi 2 har nogle præstationsproblemer, mens Minecraft kører. Den centrale behandlingsenheds (CPU) brugsgraf (øverste højre hjørne) viser aldrig nogen tung belastning, så dette skal være ned til dårlig design og optimeringer fra udviklerne. Disse problemer hænger ikke sammen med kørselskode (da de fortsætter, når Python ikke kører), men de forstærkes af dette minispil. Hvis din Pi virkelig kæmper, ønsker du måske at reducere størrelsen på arenaen eller overklokke din Pi Not Enough Juice? Klem din hindbærpi ved at overklokke ikke nok juice? Klem din Raspberry Pi ved at overklokke Hvis der er frigivet nogen hardware i 2012, som du sandsynligvis vil blive forelsket i, er det Raspberry Pi, sweet-as-sugar, en mini-computer designet og bygget i Storbritannien, der er sendt rundt omkring ... .

Diamantdetektor

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 Breadboard
  • 1 x LED
  • 1 x 220 ohm modstand
  • Kvinde> hanhoppekabler
  • Mand> Hoppekabler til mænd

Her er kredsløbet:

Forbind anoden (langbenet) til GPIO Pin 14. Denne pin fungerer som + 5v. Forbind katoden (kort ben) til jorden.

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

Gem denne kode som “diamonds.py“:

importer RPi.GPIO som GPIO importtid fra mcpi.minecraft import Minecraft mc = Minecraft.create () # opret Minecraft Object led_pin = 14 # gem GPIO-pin-nummer GPIO.setmode (GPIO.BCM) # fortæl Pi, hvilke overskrifter der skal bruges GPIO.setup (14, GPIO.OUT) # fortæl Pi denne pin er en output, mens sand: # gentag på ubestemt tid x, y, z = mc.player.getPos () for i inden for rækkevidde (15): # se på hver bloker indtil blok 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) # sluk for LED-tid. søvn (0,25) # vent 

Når der er en diamantmalmblok under afspilleren (inden for 15 blokke), blinker lyset.

Har du lavet noget cool med Minecraft Pi? Fortæl mig i kommentarerne, hvad du har lavet, eller hvor langt du nåede det i spilene.




Endnu ingen kommentarer

Om moderne teknologi, enkel og overkommelig.
Din guide i en verden af moderne teknologi. Lær hvordan du bruger de teknologier og gadgets, der omgiver os hver dag, og lær, hvordan du finder interessante ting på Internettet.