Naučite se Pythona in elektronike z Minecraft Pi Edition

Naučite se Pythona in elektronike z Minecraft Pi Edition

Ste se vedno želeli naučiti kodirati, pa niste vedeli, kje začeti? Naučite se upravljati Minecraft na Raspberry Pi z uporabo Pythona in nekaj preproste elektronike. Tu je končni rezultat:





Za ta projekt boste potrebovali Pi 2 ali novejšo različico, medtem ko lahko večino teh nalog dokončate prek ukazne vrstice prek Secure Shell (SSH), se bo ta vadnica osredotočila na kodiranje neposredno na Pi.





Ste novi v Minecraftu? Ne skrbite - tukaj je naš Vodnik za začetnike Minecraft .





Uvod v Minecraft Pi

Minecraft za Raspberry Pi je bil razvit za učenje in petljanje (in to brezplačno). Na voljo je z vmesnikom za programiranje aplikacij (API), ki kodi omogoča preprost pogovor z Minecraftom. To je odlično za učenje kodiranja v Pythonu, pa tudi za začetek z elektroniko.

Kaj je Python?

Python je programski jezik. je interpretirano , kar pomeni, da mora računalnik, ko zaženete datoteko ali program Python, najprej narediti nekaj dela. Slaba stran je, da se lahko v primerjavi s prevedenimi jeziki šteje za počasno [Odstranjen zlomljen URL].



Prednosti tolmačenih jezikov so hitrost kodiranja in njihova prijaznost. Računalniku ni treba povedati kaj podatke, ki jih želite shraniti, samo da želite nekaj shraniti in računalnik bo ugotovil, kaj naj naredi. Seveda obstajajo izjeme in to je nekoliko poenostavljen pogled, vendar bi moralo biti programiranje zabavno! Če začnete kopati po zapletenih tehničnih podrobnostih, lahko postane nekoliko mukotrpno.

Python razlikuje velike in male črke. To je pomembno vedeti, saj Python ne prepozna objektov tudi če so pravilno napisane če je primer napačen. 'Dosomething ()' ne bo delovalo, če se metoda dejansko imenuje 'DoSomething ()'. Python uporablja tudi zamik . Drugi programski jeziki morda ne zanimajo, koliko alinej ima vaša koda, medtem ko Python naredi oskrba. Z zamiki se Pythonu pove, kam pripada koda. Drugi jeziki lahko za kodiranje skupine uporabljajo 'Curly Braces' ({}) - Python jih ne uporablja. Python uporablja hash (#) za komentarje, komentarji pa se uporabljajo, da drugim razvijalcem ali ljudem, ki gledajo kodo, povejo, kaj določen del počne ali zakaj je potreben. Python po razpršitvi ne upošteva ničesar.





Končno obstajata dve glavni različici Pythona - Python 2.7.x in Python 3.x. Med obema je nekaj razlik ( kakšne so razlike? ). Ta vadnica bo uporabljala Python 3.

Začetna nastavitev

Če je vaš Pi že nastavitev in zagon Raspbiana , začetne nastavitve niso potrebne.





Odprite terminal ( Meni> Pripomočki> Terminal ) in zaženite ta ukaz. Vedno je dobra praksa, da je seznam skladišč posodobljen in s tem boste prenesli najnovejši seznam programov (sami programi ne bodo naloženi, to pomaga Pi vedeti, kateri programi se imenujejo in kje jih najdejo).

sudo apt-get update

Zdaj posodobite Pi (to lahko traja nekaj časa):

sudo apt-get upgrade

Python in Minecraft Pi sta že nameščena, če pa Minecraft Pi iz kakršnega koli razloga ni nameščen, je namestitev preprosta:

sudo apt-get install minecraft-pi

Pomaknite se do dokumentov in ustvarite novo mapo z imenom 'Minecraft':

cd Documents/
mkdir Minecraft

Vsebino te nove mape si lahko ogledate:

ls

Tukaj je nasvet - če začnete tipkati in pritisnete tipko TAB, bo ukazna vrstica poskušala samodejno izpolniti stavek.

Pot do trenutnega imenika lahko preverite s pomočjo pwd, kar pomeni Natisni delovni imenik:

pwd

Zaženite Minecraft tako, da odprete Meni> Igre> Minecraft Pi . Ta zagon boste potrebovali, vendar se boste k njemu vrnili kasneje.

Odprite Python 3 iz Meni> Programiranje> Python 3 (IDLE) . Ta program vam omogoča izvajanje ukazov Python in pisanje programov.

Zdaj lahko tukaj vnesete svoje ukaze Python, vendar to ni zelo praktično. Pojdi do Datoteka> Nova datoteka in potem Datoteka> Shrani in to shranite v mapo, ki ste jo ustvarili prej. ( Dokumenti> Minecraft ). Pokličimo ' hello_world.py '. Razširitve .py vam ni treba uporabljati, ta bo dodana samodejno, vendar je to dobra praksa.

Če preklopite nazaj na terminal in se pomaknete v mapo Minecraft, bi morali videti datoteko, ki ste jo pravkar ustvarili:

cd Minecraft/
ls

To datoteko lahko zaženete tako:

python hello_world

Opazite, kako je 'python' vse z malimi črkami. To mora biti pred imenom datoteke, saj Pi pove, da je naslednja datoteka Python, zato jo je treba izvesti kot takšno.

Preklopite nazaj na urejevalnik Python in vnesite:

print 'Hello, World!'

Shranite to datoteko in jo znova zaženite - zdaj bi morali videti 'Hello, World!' v ukazni vrstici - lepo! Ukaz print preprosto pove Pythonu, naj naslednje besedilo prikaže v dvojnih narekovajih. To je dobro, vendar ni zelo koristno za Minecraft, povežimo ga:

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

Če shranite in zaženete to datoteko, bi morali videti 'Hello, World!' se pojavijo v igri Minecraft. Razčlenimo kodo:

from mcpi.minecraft import Minecraft

Ta vrstica pove Pythonu, da želite uporabiti kodo iz druge datoteke. Ta datoteka mcpi.minecraft je bila razvita za enostaven nadzor nad Minecraftom.

mc = Minecraft.create()

Ta vrstica ustvari predmet, imenovan 'mc' (Minecraft). To morate ustvariti, da omogočite komunikacijo z igro Minecraft - ni dovolj le vključiti datoteko.

mc.postToChat('Hello, World!')

Nazadnje ta vrstica Minecraftu pove, naj v klepet napiše nekaj besedila. Poskusite spremeniti 'Pozdravljeni, svet!' na kaj drugega in poglejte, kaj se zgodi, vendar ne pozabite vključiti obeh dvojnih narekovajev. Če imate težave s programsko opremo, je to nekaj pogostih napak Python in Minecraft Pi:

  • AttributeError - to je tipkarska napaka, na primer pint ali prnt namesto tiskanja
  • NameError: ime 'Minecraft' ni definirano - ne pozabite uvoziti modulov, ki jih potrebujete
  • NameError: ime 'true' ni definirano - Python razlikuje velike in male črke, spremenite v 'True'
  • socket.error: [Errno 111] Povezava zavrnjena - Preverite, ali Minecraft deluje

Projekti

Zdaj, ko poznate osnove Pythona in Minecrafta, naredimo nekaj kul projektov. Vse kode je mogoče prenesti iz Github -a.

Avtomatiziran graditelj mostov

Ta program bo učinkovito zgradil most čez vodo. Ko se igralec približa vodnemu telesu, bo program pretvoril več blokov v kamen. Ker Minecraft uporablja koordinatni sistem, je zelo enostavno določiti lokacijo igralca skupaj z vrsto blokov okoli igralca. Minecraft Pi je nekoliko omejen, zato ni mogoče posodobiti več različnih blokov v velikem obsegu. To vedenje pa lahko preprosto kodirate sami.

Ustvarite novo datoteko ( Datoteka> Nova datoteka ) in shranite kot ' 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)

Opazujte, kako vrednost y dejansko gleda na y - 1. To je nivo tal. Če bi uporabili vrednost y, bi skript iskal bloke približno na ravni kolena - ne bi delovalo zelo dobro! Mc.getBlock () vrne id bloka za podane koordinate. Ker so x, y in z koordinate igralca, jih lahko dodate ali odštejete, da dobite položaje okoli igralca. Vrednosti x, y in z vam ni treba uporabiti, lahko uporabite poljubno število, vendar morda ne veste, kako se določeni blok nanaša na predvajalnik - bolje je uporabiti vrednosti glede na predvajalnik. Zaženite to datoteko iz ukazne vrstice in poglejte, kaj se zgodi.

Videti morate, da se majhna površina zemlje spremeni v kamen, ko igralec doseže vodno telo. Ni super - lahko hodite dovolj hitro, da povzročite težavo. To bi lahko rešili s pretvorbo večje količine vode v kopno. Zadnji del metode mc.setBlocks () je ID bloka. Eden je id bloka za kamen. To lahko spremenite v les, travo ali karkoli drugega. Če bi to želeli, bi to lahko preprosto pretvorili v kompleksno zasnovo - morda viseči most!

Gumb za super rudarjenje

Ta primer bo skrajšal rudarsko delo. Sestavljen je iz fizičnega gumba, ki bo ob pritisku izkopal 10 blokov. Začnimo z gumbom. Podobno kot gumbi na Arduinu boste potrebovali majhno količino elektronike, ki bi jo morali najti v osnovnem začetnem kompletu:

  • 1 x Deska
  • 1 x trenutno stikalo
  • 1 x 220 ohmski upor
  • Ženski> moški kabli za preskok
  • Moški> Moški preskočni kabli

Tukaj je vezje:

Povezava z gumbom Pi

Ta upor se imenuje 'pull down' upor. Pomaga zagotoviti, da je tisto, kar Pi misli, da je pritisnjen gumb, v resnici pritisnjen gumb. Tega vam ni treba uporabljati, vendar je priporočljivo, saj lahko brez njega najdete veliko hrupa in lažnih odčitkov.

Gumb je priključen na pin 14. Splošni vhodni izhod (GPIO) 14. Uporabite lahko kateri koli pin GPIO, vendar poglejte pinout prvič, saj jih ni vse mogoče upravljati s Pi in se med modeli nekoliko razlikujejo.

Zdaj, ko je gumb priključen, je čas, da ga preizkusite. Ustvarite novo datoteko in jo shranite kot » button_test.py '. Dodajte to kodo, jo shranite in nato zaženite v terminalu.

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

Pritisnite Control + C. da ustavite skript. Če vse deluje pravilno, bi morali videti 'GUMB DELUJE!' v terminalu. Upoštevajte, kako ta test, tako kot modul Minecraft, uporablja module RPi.GPIO in časovne module. Ti omogočajo Pi dostop do zatičev strojne opreme in zagotavljajo uporabne časovne funkcije.

Zdaj pa zaključimo preostalo kodo. Ustvari novo datoteko z imenom ' super_mine.py '. Tukaj je koda:

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 () vrne trenutne koordinate igralcev, ki so nato shranjene v x, y in z. The setBlocks () metoda pove Minecraftu, da vse bloke med začetkom in koncem zapolni z naslednjim blokom. Nič je blok-id za zrak. To lahko spremenite v drug ID bloka, da polno zapolni območje. Prav tako lahko spremenite koordinate na +100 ali celo +1000 blokov, vendar se lahko Pi začne boriti, če postanete preveč nori. Upoštevajte, kako je y + 10 enako za obe vrstici. To lahko spremenite v y - 10, če želite odstraniti bloke pod zemljo.

Teleportiranje

Druga preprosta uporaba tega gumba je lahko 'teleport'. Minecraft Pi Api ponuja način nastavitve položaja igralca. Naslednja koda bo 'teleportirala' predvajalnika na prednastavljeno mesto:

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

Upoštevajte, da njegova metoda sprejema tri parametre; x, y in z - tako da jih lahko nastavite na karkoli, da takoj predvajate predvajalnik na to mesto.

Ustvarite kopijo datoteke super_mine ( Datoteka> Shrani kopijo kot ) in ga spremenite tako, da if zamenjate z naslednjim:

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

Zdaj bi morala biti ta datoteka videti tako:

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

Shrani kot ' teleport.py 'in teči.

Morda boste ugotovili, da se predvajalnik ob uporabi tega zatakne v nekaterih blokih, v tem primeru boste morali koordinate prilagoditi znanemu odprtemu prostoru (zgornji levi del zaslona prikazuje vašo trenutno lokacijo).

Zgraditi hišo

Zadnja naloga tega gumba je gradnja hiše. Podobno kot v zgornjem primeru hitrega rudarjenja bo to preprosto nadomestilo bloke, ki obkrožajo igralca, da naredi hišo. Za različne materiale (okna, stene itd.) Bodo uporabljeni različni bloki. Za lažje kodiranje bo ustvarjen trden blok, nato pa bo odstranjena notranjost (blok nastavljen na zrak), kar bo ustvarilo votlo lupino. Dodali bi lahko dodatke, na primer posteljo ali vrata, vendar je projekt Minecraft Pi nekoliko nepopoln in čeprav ti predmeti delujejo, ko jih predvaja igralec, pri uporabi Pythona niso briljantni.

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

Shrani to kot ' house.py 'in teči. Če je vse v redu, bi morali videti majhno hišo (morda se boste morali obrniti, da jo najdete). To je zelo preprosto, odprtina in nekaj oken. Teoretično ni omejitve, kako veliko ali zapleteno zgradbo bi lahko zgradili.

Naredite mini igro

Nato naredimo mini igro! To bo precej preprosto, ko igralec stopi na pesek, se bo po naključnem času spremenil v lavo. To je dobra igra, saj lahko oblikujete svoje ravni ali jih spremenite, da otežite stvari. Za ta primer gumba ne potrebujete.

Ustvarite novo datoteko in jo shranite kot » mini_game.py '. Tukaj je koda:

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

Ta koda je dober začetnik na naključen() funkcija: random.uniform (0,1, 2,5) bo ustvaril naključno število med 0,1 (1/10 sekunde) in 2,5 (2 1/2 sekunde). Povečanje teh številk bo olajšalo igro.

Poskusi! Stojte na peščenem bloku in kmalu se bo spremenil v lavo. To je lahko osnova za bolj zapleteno igro.

Naredite še eno mini igro

Predpostavka te igre je preprosta - ne zmanjka časa na lesenih tleh. Igralec se teleportira v 'areno'. Prisiljeni so mirovati do začetka igre. Ko se čas zažene, se bodo tla spremenila v vodo. Igralec mora za preživetje stati v varnem območju (diamantni bloki). Vsaka stopnja zmanjša časovnik za eno sekundo. Po vsaki uspešni ravni se varno območje poveča. Preverite spodnjo kodo:

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

Shrani to kot ' mini_game_2.py 'in daj teči.

Pi 2 ima med izvajanjem Minecrafta nekaj težav z zmogljivostjo. Graf uporabe centralne procesorske enote (CPE) ( zgornji desni kot ) nikoli ne kaže velike obremenitve, zato morajo biti to posledica slabe zasnove in optimizacije razvijalcev. Te težave niso povezane z izvajanjem kode (saj se nadaljujejo, ko se Python ne izvaja), vendar jih ta mini igra še povečuje. Če se vaš Pi res bori, boste morda želeli zmanjšati velikost arene ali overclockati svoj Pi.

katera storitev dostave hrane je najbolje plačana

Diamantni detektor

Naredimo drugo vezje. Ta bo uporabljala svetlečo diodo (LED), da zasveti, ko so pod njo diamanti (v 15 blokih). Tukaj potrebujete:

  • 1 x Deska
  • 1x LED
  • 1 x 220 ohmski upor
  • Ženski> moški kabli za preskok
  • Moški> Moški preskočni kabli

Tukaj je vezje:

Priključite anodo (dolga noga) na GPIO Pin 14. Ta pin deluje kot +5v. Priključite katodo (kratka noga) na ozemljitev.

Uporabil sem poceni igračo iz rude in jo spremenil tako, da sem odstranil zadnji pokrov in elektroniko, nato pa sem podnjo postavil LED. To lahko enostavno naredite trajno z vročim lepilom ali kaj podobnega.

Shrani to kodo kot ' 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

Ko je pod predvajalnikom blok diamantne rude (v 15 blokih), bo lučka utripala.

ThinkGeek Minecraft Light -Up modra kamnita diamantna ruda - zagotovo obdržite prašiče KUPITE ZDAJ NA AMAZONU

Ste z Minecraft Pi naredili kaj kul? Sporočite mi v komentarjih, kaj ste dosegli ali kako daleč ste prišli v igrah.

Upamo, da vam bodo všeč predmeti, ki jih priporočamo in o katerih bomo razpravljali! MUO ima pridružena in sponzorirana partnerstva, zato prejemamo del prihodkov od nekaterih vaših nakupov. To ne vpliva na ceno, ki jo plačate, in nam pomaga ponuditi najboljša priporočila za izdelke.

Deliti Deliti Cvrkutati E-naslov Ali je vredno nadgraditi na Windows 11?

Windows je bil preoblikovan. Toda ali je to dovolj, da vas prepriča, da preidete z operacijskega sistema Windows 10 na Windows 11?

Preberite Naprej
Sorodne teme
  • DIY
  • Programiranje
  • Minecraft
  • Malina Pi
  • Elektronika
  • Python
O avtorju Joe Coburn(136 objavljenih člankov)

Joe je diplomiral iz računalništva na Univerzi v Lincolnu v Veliki Britaniji. Je poklicni razvijalec programske opreme in ko ne leti z brezpilotnimi letali ali ne piše glasbe, ga pogosto najdejo pri fotografiranju ali ustvarjanju videoposnetkov.

Več od Joea Coburna

Naročite se na naše novice

Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e -knjige in ekskluzivne ponudbe!

Kliknite tukaj, če se želite naročiti
Kategorija Diy