Har du altid ønsket at lære at kode, men vidste ikke, hvor du skal starte? Lær at styre Minecraft på Raspberry Pi ved hjælp af Python og nogle enkle elektronik. Her er slutresultatet:
Du skal bruge en Pi 2 eller nyere til dette projekt, og mens du kunne gennemføre de fleste af disse opgaver via kommandolinjen via Secure Shell (SSH), vil denne vejledning fokusere på kodning direkte på Pi.
Hindbær Pi 3 Model B Hovedkort Hindbær Pi 3 Model B Hovedkort Køb nu På Amazon $ 29.99
Ny til Minecraft? Du skal ikke bekymre dig - her er vores Minecraft Beginners Guide The (Latecomer) Begynder's Guide til Minecraft (Latecomer) Begynder's Guide til Minecraft Hvis du er sent til festen, skal du ikke bekymre dig - denne omfattende nybegynder guide har du dækket. Læs mere .
Introduktion til Minecraft Pi
Minecraft til Raspberry Pi er blevet udviklet til læring og tinkering (og det er gratis). Den leveres med et Application Programming Interface (API), som giver mulighed for kode til nemt at tale med Minecraft. Det er glimrende at lære at kode i Python, samt at komme i gang med elektronik. Begynderens elektronik: 10 færdigheder, du behøver at vide Begynderens elektronik: 10 færdigheder, du behøver at vide Mange af os har aldrig engang rørt ved et loddejern - men at gøre ting kan utrolig givende. Her er ti af de mest grundlæggende DIY elektronik færdigheder til at hjælpe dig med at komme i gang. Læs mere .
Hvad er Python?
Python er et programmeringssprog. Det fortolkes, hvilket betyder, at når du kører en Python-fil eller et program, skal computeren først udføre en lille smule arbejde på filen. Ulemperne er, at det kan anses for langsomt sammenlignet med kompilerede sprog.
Fordelene ved fortolket sprog er kodenes hastighed og deres venlighed. Du behøver ikke at fortælle computeren hvilke data du vil gemme, bare at du vil gemme noget, og computeren vil finde ud af, hvad du skal gøre. Der er naturligvis undtagelser, og dette er en noget forenklet visning, men programmering skal være sjovt! Hvis du begynder at grave ind i de komplekse tekniske detaljer, kan det blive lidt besværligt.
Python er sagerfølsom. 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 hedder "DoSomething ()". Python bruger også indrykning . Andre programmeringssprog kan ikke bekymre sig om hvor mange indrykninger din kode har, mens Python bryr sig. Indenter bruges til at fortælle Python, hvor kode tilhører. Andre sprog kan bruge "Curly Braces" ({}) til gruppekode - Python bruger ikke disse. Python bruger en hash (#) til kommentarer, og kommentarer bruges til at fortælle andre udviklere, eller folk kigger 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 vil bruge Python 3.
Indledende opsætning
At give din Pi er allerede konfigureret og kører Raspbian Sådan installeres et operativsystem til din Raspberry Pi Sådan installeres et operativsystem til din Raspberry Pi Sådan får du et nyt OS installeret og kører på din Pi - og hvordan man kloner dit perfekte setup til hurtig katastrofeinddrivelse. Læs mere, der er ikke meget initial opsætning nødvendig.
Åbn Terminal ( Menu> Tilbehør> Terminal ) og Kør denne kommando. Det er altid god praksis at holde opbevaringslisten opdateret, og det henter den nyeste liste over programmer (det vil ikke downloade programmerne selv, det hjælper Pi ved, hvad programmerne hedder og hvor de finder dem).
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 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, vil du skal vide, hvordan man installerer et operativsystem og software til at køre på det. Hvis du er ny til Linux, kan det være skræmmende. Læs mere :
sudo apt-get install minecraft-pi
Naviger til dokumenter og opret en ny mappe kaldet "Minecraft":
cd Documents/ mkdir Minecraft
Du kan se indholdet af denne nye mappe:
ls
Her er et tip - hvis du begynder at skrive og trykke på TAB-tasten, vil kommandolinjen forsøge at autofuldføre erklæringen for dig.
Du kan undersøge stien til den aktuelle mappe 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 løb, men vil komme 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 kan du skrive dine Python-kommandoer her, men det er ikke så praktisk. Gå til Filer> Ny fil og derefter Fil> Gem og gem det 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 netop har oprettet:
cd Minecraft/ ls
Du kan køre denne fil som denne:
python hello_world
Bemærk, hvordan "python" er helt lille. 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 skal nu se "Hej, Verden!" Vises i kommandolinjen - pænt! Print-kommandoen fortæller simpelthen Python at udstille følgende tekst i dobbelt citater. Dette er godt, men ikke forfærdeligt nyttigt for Minecraft, lad os linke det op:
from mcpi.minecraft import Minecraft mc = Minecraft.create() mc.postToChat("Hello, World!")
Nu, hvis du gemmer og kører denne fil, skal du se "Hej, Verden!" Vises i Minecraft-spillet. Lad os nedbryde 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 give nem styring 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 blot at medtage filen.
mc.postToChat("Hello, World!")
Endelig fortæller denne linje Minecraft at skrive nogle tekst til chatten. Prøv at skifte "Hello, World!" Til noget andet og se hvad der sker, men husk at inkludere både de dobbelte citater. Hvis du har softwareproblemer, er disse nogle almindelige Python og Minecraft Pi fejl:
- AttributeError - dette er en typografi, som 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 sagerfølsomt, 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 flotte projekter. Alle codecan hentes fra Github.
Automatiseret brobygger
Dette program vil effektivt bygge en bro over vand. Når spilleren nærmer sig en vandkrop, konverterer programmet flere blokke til sten. Da Minecraft bruger et koordinatsystem, er det meget nemt at få placeringen af afspilleren 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 nemt kode denne adfærd selv.
Opret en ny fil ( Fil> Ny fil ) og gem den 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)
Bemærk hvordan y-værdien faktisk ser på y - 1. Dette er gulvniveauet. Hvis værdien af y blev brugt, ville scriptet se efter blokke på omkring knæniveau - det ville ikke fungere rigtig godt! Mc.getBlock () returnerer id for en blok for de givne koordinater. Da x, y og z er koordinaterne til afspilleren, kan du tilføje eller trække fra dem for at få positioner omkring afspilleren. Du behøver ikke bruge værdierne x, y og z, du kan bruge et hvilket som helst nummer, men du ved måske ikke, hvordan den pågældende blok vedrører 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 jordareal bliver til sten, når spilleren når en vandkrop. Det er ikke fantastisk - du kan 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 mc.setBlocks () -metoden er blok-id. Den ene er blok id for sten. Du kan ændre dette til træ, græs eller noget. Hvis du ville, kunne du ganske enkelt konvertere dette til et komplekst design - måske en hængebro!
Super Mining Button
Dette eksempel vil gøre kort arbejde med minedrift. Den består af en fysisk knap, at når den trykkes, vil min 10 blokke blokeres. Lad os starte med knappen. På samme måde som knapper på Arduino, skal du bruge en lille mængde elektronik, som alle skal findes i et grundstartpakke Hvad er der i dit Arduino Starter Kit? [Arduino Beginners] Hvad er der i din Arduino Starter Kit? [Arduino Beginners] Facet med en kasse fuld af elektroniske komponenter, er det nemt at blive overvældet. Her er en vejledning til, hvad du finder i dit kit. Læs mere :
- 1 x brødbræt
- 1 x øjeblikkelig switch
- 1 x 220 ohm modstand
- Kvinde> Hanehoppekabler
- Mand> Mand hoppe kabler
Her er kredsløbet:
Denne modstand kaldes en "pull down" modstand. Det hjælper med at sikre, at hvad Pi mener er, at knappen trykkes, er virkelig at trykke på knappen. Du behøver ikke bruge dette, men det anbefales, da du kan finde masser af støj og falske aflæsninger uden det.
Knappen er tilsluttet GPIO-pin 14. Du kan bruge en hvilken som helst GPIO-pin, men se først på pinout, da de ikke alle kan styres fra Pi, og varierer lidt mellem modeller.
Nu hvor knappen er tilsluttet, er det tid til at teste det. Opret en ny fil og gem den som " button_test.py ". Tilføj denne kode, gem den og kør den så 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
Tryk på Control + C for at stoppe scriptet. Hvis alt fungerer korrekt, skal du se "BUTTON WORKS!" I Terminal. Bemærk hvordan, ligesom Minecraft-modulet, bruger denne test RPi.GPIO og tidsmoduler. Disse giver Pi mulighed for adgang til hardwarestifterne og giver nyttige timingfunktioner.
Nu kan vi afslutte resten af koden. Opret en ny filecalled " 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 spillerne aktuelle koordinater, som derefter gemmes i x, y og z. Metoden setBlocks () fortæller Minecraft at fylde alle blokke mellem start og slut med den følgende blok. Nul er blok-id for luft. Du kan ændre dette til et andet blok-id for at udfylde et område. 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 den samme for begge linjer. Du kan ændre dette til y - 10 hvis du ønskede at fjerne blokke under jorden.
teleporting
En anden simpel brug for denne knap kan være at "teleportere". Minecraft Pi Api giver mulighed for 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 noget for at straks teleportere afspilleren til den pågældende placering.
Opret en kopi af super_min-filen ( Fil> Gem kopi som ) og modificer den ved at erstatte ifen 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 kør.
Du kan finde, at afspilleren 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. I lighed med hurtig minedrift eksempel ovenfor, vil dette blot erstatte blokke, der omgiver afspilleren til at gøre et hus. Forskellige blok-ids 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 (indstillet blok til luft), hvilket vil skabe en hul shell. Du kan tilføje ekstraudstyr som en seng eller dør, men Minecraft Pi-projektet er lidt ufuldstændigt, og mens disse objekter fungerer, når de placeres af spilleren, er de ikke strålende, når de 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 " house.py " og kør. Alt er godt, du skal se et lille hus vises (du skal muligvis vende rundt 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 konstruere.
Lav et minispil
Lad os nu lave et mini-spil! Dette vil være ret simpelt, når spilleren træder på en blok sand, bliver den til lava efter en 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 starter på tilfældig () -funktionen: random.uniform (0.1, 2.5) vil generere et tilfældigt tal mellem 0, 1 ( 1/10 sekund) og 2, 5 (2 1/2 sekunder). At øge disse tal vil gøre spillet nemmere.
Prøve det! Stå på en blok sand, og det vil snart blive til lava. Dette kunne være grundlaget for et mere komplekst spil.
Lav et andet mini-spil
Princippet for dette spil er simpelt - stå ikke på trægulvet, når tiden løber ud. Spilleren bliver teleporteret til en "arena". De er nødt til at stå stille, indtil spillet starter. Når en gang er startet, bliver gulvet til vand, når timeren løber ud. Spilleren skal stå i sikkerhedszonen (diamantblokke) for at overleve. Hvert niveau reducerer timeren med et sekund. Efter hvert vellykket niveau bliver det sikre område større. Tjek 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
Gem dette som " mini_game_2.py " og giv det kørende.
Pi 2 har nogle præstationsproblemer, mens du kører Minecraft. Brugskurven til centralprocessoren (CPU) ( øverste højre hjørne ) viser aldrig nogen tung belastning, så dette skal være ned til dårlig design og optimeringer af udviklerne. Disse problemer er ikke relateret til kørselskode (da de fortsætter, når Python ikke kører), men de er forstærket af dette minispil. Hvis din Pi virkelig kæmper, vil du måske reducere størrelsen på arenaen eller overklare din Pi ikke nok juice? Klem din Raspberry Pi ved Overclocking Ikke nok Juice? Klem din Raspberry Pi ved Overclocking Hvis der er nogen hardware udgivet i 2012, som du sandsynligvis vil forelske sig i, er det søde-som-sukker Raspberry Pi, en mini computer designet og bygget i Storbritannien, som har afsendt rundt omkring. .. Læs mere .
Diamantdetektor
Lad os lave et andet kredsløb. Dette vil bruge en lysdiode (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> Hanehoppekabler
- Mand> Mand hoppe kabler
Her er kredsløbet:
Tilslut anoden (langt ben) til GPIO Pin 14. Denne pin virker som + 5v. Tilslut katoden (kort ben) til jorden.
Jeg har brugt en billig malm legetøj og ændret det ved at fjerne bagdæksel og elektronik, så lagde jeg en LED under den. Du kunne nemt gøre dette permanent med varm lim eller noget 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.
Think Geek Minecraft Light Up Diamond Ore Think Geek Minecraft Light Up Diamond Ore Køb Nu På Amazon $ 12.89
Har du lavet noget cool med Minecraft Pi? Lad mig vide i kommentarerne, hvad du lavede eller hvor langt du lavede det i spillene.