Aflați Python și electronice cu Minecraft Pi Edition

Aflați Python și electronice cu Minecraft Pi Edition

Ați dorit întotdeauna să învățați să codificați dar nu știați de unde să începeți? Aflați cum să controlați Minecraft pe Raspberry Pi folosind Python și câteva elemente electronice simple. Iată rezultatul final:





Veți avea nevoie de un Pi 2 sau mai nou pentru acest proiect și, deși ați putea finaliza majoritatea acestor sarcini prin linia de comandă prin Secure Shell (SSH), acest tutorial se va concentra pe codificarea direct pe Pi.





Ești nou în Minecraft? Nu vă faceți griji - iată a noastră Ghid pentru începători Minecraft .





Introducere în Minecraft Pi

Minecraft pentru Raspberry Pi a fost dezvoltat pentru învățare și bricolaj (și este gratuit). Acesta vine cu o interfață de programare a aplicațiilor (API) care oferă o modalitate prin care codul poate vorbi cu ușurință cu Minecraft. Este genial să înveți cum să codezi în Python, precum și să începi cu electronica.

Ce este Python?

Piton este un limbaj de programare. Este interpretat , ceea ce înseamnă că atunci când rulați un fișier sau program Python, computerul trebuie să facă mai întâi un pic de lucru la fișier. Dezavantajele sunt că poate fi considerat lent în comparație cu limbile compilate [Adresă URL ruptă].



Avantajele limbajelor interpretate sunt viteza codării și prietenia lor. Nu trebuie să spuneți computerului ce datele pe care doriți să le stocați, doar că doriți să stocați ceva și computerul va afla ce să facă. Desigur, există excepții, iar aceasta este o viziune oarecum simplificată, cu toate acestea programarea ar trebui să fie distractivă! Dacă începeți să căutați în detaliile tehnice complexe, acesta poate deveni un pic laborios.

Python este sensibil la majuscule și minuscule. Acest lucru este important de știut, deoarece Python nu va recunoaște obiecte chiar dacă sunt ortografiate corect dacă cazul este greșit. „Dosomething ()” nu va funcționa dacă metoda se numește de fapt „DoSomething ()”. Python folosește și indentare . Este posibil ca altor limbaje de programare să nu-ți pese de câte liniuțe are codul tău, în timp ce Python face îngrijire. Indentările sunt folosite pentru a spune Python unde aparține codul. Alte limbi pot folosi „Paranteze„ ({}) pentru a grupa codul - Python nu le folosește. Python folosește un hash (#) pentru comentarii, iar comentariile sunt folosite pentru a spune altor dezvoltatori sau persoane care se uită la cod ce face o anumită parte sau de ce este necesară. Python ignoră orice după un hash.





În cele din urmă, există două versiuni principale ale Python - Python 2.7.x și Python 3.x. Există unele diferențe între cele două ( care sunt diferențele? ). Acest tutorial va folosi Python 3.

Configurare inițială

Furnizarea Pi-ului dvs. este deja configurați și rulați Raspbian , nu este nevoie de multă configurare inițială.





Terminal deschis ( Meniu> Accesorii> Terminal ) și rulați această comandă. Este întotdeauna o bună practică să mențineți lista de depozite actualizată, iar aceasta va descărca cea mai recentă listă de programe (nu va descărca programele în sine, acest lucru ajută Pi să știe ce programe sunt numite și unde să le găsească).

sudo apt-get update

Acum actualizați Pi (acest lucru poate dura ceva timp):

sudo apt-get upgrade

Python și Minecraft Pi sunt deja instalate, cu toate acestea, dacă Minecraft Pi nu este instalat din orice motiv, este simplu de instalat:

sudo apt-get install minecraft-pi

Navigați la documente și creați un folder nou numit „Minecraft”:

cd Documents/
mkdir Minecraft

Puteți vizualiza conținutul acestui nou folder:

ls

Iată un sfat - dacă începeți să tastați și apăsați tasta TAB, linia de comandă va încerca să completeze automat declarația pentru dvs.

Puteți examina calea către directorul curent folosind pwd, care înseamnă Print Working Directory:

pwd

Porniți Minecraft accesând Meniu> Jocuri> Minecraft Pi . Veți avea nevoie de această rulare, dar veți reveni la ea mai târziu.

Deschideți Python 3 din Meniu> Programare> Python 3 (IDLE) . Acest program vă oferă o modalitate de a rula comenzi Python și de a scrie programe.

Acum puteți scrie comenzile Python aici, dar acest lucru nu este foarte practic. Mergi la Fișier> Fișier nou și apoi Fișier> Salvare și salvați acest lucru în dosarul pe care l-ați creat anterior. ( Documente> Minecraft ). Hai să-i spunem hello_world.py '. Nu trebuie să utilizați extensia .py, aceasta va fi adăugată automat, dar este o bună practică.

Dacă reveniți la terminal și navigați în folderul Minecraft, ar trebui să vedeți fișierul pe care tocmai l-ați creat:

cd Minecraft/
ls

Puteți rula acest fișier astfel:

python hello_world

Observați cum „python” este minuscul. Aceasta trebuie să fie înainte de numele fișierului, deoarece îi spune Pi că următorul fișier este Python, deci ar trebui să fie executat ca atare.

Reveniți la editorul Python și tastați:

print 'Hello, World!'

Salvați acest fișier și rulați-l din nou - acum ar trebui să vedeți „Bună ziua, lume!” apare în linia de comandă - îngrijit! Comanda de tipărire îi spune pur și simplu Python să scoată textul următor în ghilimele duble. Acest lucru este bun, dar nu este extrem de util pentru Minecraft, să îl conectăm:

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

Acum, dacă salvați și rulați acest fișier, ar trebui să vedeți „Bună ziua, lume!” apare în jocul Minecraft. Să descompunem codul:

from mcpi.minecraft import Minecraft

Această linie spune Python că doriți să utilizați codul dintr-un alt fișier. Acest fișier mcpi.minecraft a fost dezvoltat pentru a permite controlul ușor al Minecraft.

mc = Minecraft.create()

Această linie creează un obiect numit „mc” (Minecraft). Trebuie să creați acest lucru pentru a permite comunicarea cu jocul Minecraft - nu este suficient doar să includeți fișierul.

mc.postToChat('Hello, World!')

În cele din urmă, această linie îi spune Minecraft să scrie un text în chat. Încercați să schimbați „Bună ziua, lume!” la altceva și vedeți ce se întâmplă, dar nu uitați să includeți ambele ghilimele. Dacă aveți probleme cu software-ul, acestea sunt câteva erori comune Python și Minecraft Pi:

  • AttributeError - aceasta este o greșeală de tipar, cum ar fi pint sau prnt în loc de print
  • NameError: numele „Minecraft” nu este definit - nu uitați să importați modulele de care aveți nevoie
  • NameError: numele „true” nu este definit - Python este sensibil la majuscule și minuscule, treceți la „True”
  • socket.error: [Errno 111] Conexiunea refuzată - Asigurați-vă că Minecraft rulează

Proiecte

Acum, că știți elementele de bază ale Python și Minecraft, haideți să facem câteva proiecte interesante. Toate codecan-urile pot fi descărcate de pe Github.

Constructor automat de poduri

Acest program va construi în mod eficient un pod peste apă. Când jucătorul se apropie de un corp de apă, programul va converti mai multe blocuri în piatră. Deoarece Minecraft folosește un sistem de coordonate, este foarte ușor să obțineți locația jucătorului, împreună cu tipul de blocuri din jurul jucătorului. Minecraft Pi este ușor limitat, deci nu este posibil să actualizați mai multe blocuri diferite în bloc. Cu toate acestea, puteți codifica cu ușurință acest comportament.

Creați un fișier nou ( Fișier> Fișier nou ) și salvați-l ca „ 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)

Observați cum valoarea y se uită de fapt la y - 1. Acesta este nivelul etajului. Dacă s-ar folosi valoarea lui y, scriptul ar căuta blocuri la nivelul genunchiului - nu ar funcționa foarte bine! Mc.getBlock () returnează ID-ul unui bloc pentru coordonatele date. Deoarece x, y și z sunt coordonatele jucătorului, puteți adăuga sau scădea din ele pentru a obține poziții în jurul jucătorului. Nu trebuie să utilizați valorile x, y și z, puteți utiliza orice număr, totuși este posibil să nu știți cum se leagă acel bloc special de jucător - este mai bine să utilizați valori în raport cu jucătorul. Rulați acest fișier din linia de comandă și vedeți ce se întâmplă.

Ar trebui să vedeți că o mică suprafață de pământ se transformă în piatră odată ce jucătorul ajunge la un corp de apă. Nu este grozav - puteți merge suficient de repede pentru a provoca o problemă. Ați putea rezolva acest lucru transformând un volum mai mare de apă în uscat. Ultima parte a metodei mc.setBlocks () este ID-ul blocului. Unul este ID-ul blocului pentru piatră. Ați putea schimba acest lucru în lemn, iarbă sau orice altceva. Dacă doriți, puteți transforma acest lucru într-un design complex - poate un pod suspendat!

Butonul Super Mining

Acest exemplu va face o scurtă activitate de minerit. Acesta constă dintr-un buton fizic, care, atunci când este apăsat, va extrage 10 blocuri în cuburi. Să începem cu butonul. Similar cu butoanele de pe Arduino, veți avea nevoie de o cantitate mică de electronice, toate acestea ar trebui să fie găsite într-un kit de bază de pornire:

  • 1 x panou de pâine
  • 1 x comutator momentan
  • 1 rezistor de 220 ohmi
  • Cabluri de salt feminin> masculin
  • Cabluri masculine> masculine

Iată circuitul:

Conexiune Pi-Button

Acest rezistor se numește rezistor „trage în jos”. Vă ajută să vă asigurați că ceea ce Pi crede că este butonul apăsat, este într-adevăr butonul apăsat. Nu trebuie să utilizați acest lucru, cu toate acestea este recomandat, deoarece puteți găsi mult zgomot și citiri false fără el.

Butonul este conectat la pinul de ieșire generală de intrare (GPIO) 14. Puteți utiliza orice pin GPIO, totuși, uitați-vă la pinout în primul rând, deoarece nu sunt toate controlabile de la Pi și variază ușor între modele.

Acum că butonul este conectat, este timpul să-l testați. Creați un fișier nou și salvați-l ca „ button_test.py '. Adăugați acest cod, salvați-l, apoi rulați-l în 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

presa Control + C pentru a opri scenariul. Dacă totul funcționează corect, ar trebui să vedeți „BUTTON WORKS!” în terminal. Observați cum, la fel ca modulul Minecraft, acest test utilizează modulele RPi.GPIO și timp. Acestea permit Pi să acceseze pinii hardware și oferă funcții utile de sincronizare.

Acum să terminăm restul codului. Creați un nou fișier numit ' super_mine.py '. Iată codul:

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 () returnează coordonatele curente ale jucătorilor, care sunt apoi stocate în x, y și z. The setBlocks () Metoda îi spune Minecraft să umple toate blocurile dintre început și sfârșit cu următorul bloc. Zero este blocul pentru aer. Puteți schimba acest lucru cu un alt bloc-id pentru a umple solid o zonă. De asemenea, puteți schimba coordonatele la +100 sau chiar +1000 blocuri, cu toate acestea, Pi poate începe să se lupte dacă vă înnebuniți prea mult. Observați cum y + 10 este același pentru ambele linii. Puteți schimba acest lucru în y - 10 dacă doriți să eliminați blocurile subterane.

Teleportarea

O altă utilizare simplă a acestui buton ar putea fi „teleportarea”. Minecraft Pi Api oferă o modalitate de a seta poziția jucătorului. Următorul cod va „teleporta” jucătorul într-o locație prestabilită:

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

Rețineți că metoda sa acceptă trei parametri; x, y și z - astfel încât să le puteți seta la orice pentru a teleporta instantaneu jucătorul în acea locație.

Creați o copie a fișierului super_mine ( Fișier> Salvare copiere ca ) și modificați-l înlocuind if cu următoarele:

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

Acest fișier ar trebui să arate acum:

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

Salvați-l ca „ teleport.py ' și fugi.

Este posibil să descoperiți că jucătorul se blochează în interiorul unor blocuri atunci când utilizați acest lucru, caz în care va trebui să ajustați coordonatele la un spațiu deschis cunoscut (în partea stângă sus a ecranului este afișată locația dvs. curentă).

Construiește o casă

O ultimă sarcină pentru acest buton este construirea unei case. La fel ca exemplul de extragere rapidă de mai sus, acest lucru va înlocui pur și simplu blocurile din jurul jucătorului pentru a face o casă. Diferite blocuri de identificare vor fi utilizate pentru diferite materiale (ferestre, pereți etc.). Pentru a face lucrurile mai ușor de codat, va fi creat un bloc solid, iar apoi interiorul eliminat (setați blocul la aer), acest lucru va crea o carcasă goală. Puteți adăuga extra ca un pat sau o ușă, cu toate acestea, proiectul Minecraft Pi este puțin incomplet și, deși aceste obiecte funcționează atunci când sunt plasate de jucător, ele nu sunt strălucitoare atunci când utilizați 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

Salvați acest lucru ca „ house.py ' și fugi. Toate fiind bine, ar trebui să vedeți o casă mică apărând (poate fi necesar să vă întoarceți pentru a o găsi). Este foarte simplu, o deschidere și câteva ferestre. În teorie, nu există nicio limită pentru cât de mare sau de complexă ai putea construi o clădire.

Faceți un mini joc

În continuare, să facem un mini-joc! Acest lucru va fi destul de simplu, când jucătorul calcă pe un bloc de nisip, se va transforma în lavă după o perioadă aleatorie de timp. Acesta este un joc bun de făcut, deoarece ai putea să-ți proiectezi propriile niveluri sau să îl modifici pentru a face lucrurile mai grele. Nu veți avea nevoie de buton pentru acest exemplu.

Creați un fișier nou și salvați-l ca „ mini_game.py '. Iată codul:

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

Acest cod este un bun starter pe Aleatoriu() funcţie: random.uniform (0,1, 2,5) va genera un număr aleatoriu între 0,1 (1/10 secunda) și 2,5 (2 1/2 secunde). Creșterea acestor numere va face jocul mai ușor.

Încearcă! Stai pe un bloc de nisip și se va transforma în scurt timp în lavă. Aceasta ar putea fi baza unui joc mai complex.

Creează un alt mini joc

Premisa pentru acest joc este simplă - nu stați pe podeaua de lemn când timpul se scurge. Jucătorul este teleportat într-o „arenă”. Sunt obligați să stea nemișcați până când începe jocul. Odată pornit, podeaua se va transforma în apă odată ce temporizatorul se va epuiza. Jucătorul trebuie să stea în zona de siguranță (blocuri de diamante) pentru a supraviețui. Fiecare nivel reduce cronometrul cu o secundă. După fiecare nivel de succes, zona sigură devine mai mare. Verificați codul de mai jos:

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

Salvați acest lucru ca „ mini_game_2.py 'și dă-i o fugă.

Pi 2 are unele probleme de performanță în timp ce rulează Minecraft. Graficul de utilizare a Unității centrale de procesare (CPU) ( coltul din dreapta-sus ) nu afișează niciodată sarcini grele, deci acest lucru trebuie să se rezumă la un design slab și la optimizări de către dezvoltatori. Aceste probleme nu au legătură cu codul de execuție (deoarece continuă când Python nu rulează), cu toate acestea sunt agravate de acest mini-joc. Dacă Pi-ul tău se luptă cu adevărat, poate vrei să reduci dimensiunea arenei sau să-ți overclockezi Pi-ul.

Windows oprește codul de excepție a serviciului de sistem

Detector de diamante

Să facem un alt circuit. Aceasta va utiliza o diodă emițătoare de lumină (LED) pentru a se aprinde atunci când sunt diamante dedesubt (în limita a 15 blocuri). Iată de ce aveți nevoie:

  • 1 x panou de pâine
  • 1 x LED
  • 1 rezistor de 220 ohmi
  • Cabluri de salt feminin> masculin
  • Cabluri masculine> masculine

Iată circuitul:

Conectați anodul (piciorul lung) la pinul GPIO 14. Acest pin acționează ca + 5v. Conectați catodul (piciorul scurt) la masă.

Am folosit o jucărie ieftină de minereu și am modificat-o scoțând capacul din spate și aparatele electronice, apoi am plasat un LED sub el. Ați putea face cu ușurință acest lucru permanent cu adeziv fierbinte sau ceva similar.

Salvați acest cod ca „ diamante.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

Când există un bloc de minereu de diamant sub player (în termen de 15 blocuri), lumina va clipi.

Minereu ThinkGeek Minecraft Light-Up Blue Stone Diamond Ore - Sigur că îi vei ține pe Pigmen departe CUMPĂRĂ ACUM PE AMAZON

Ai făcut ceva mișto cu Minecraft Pi? Spuneți-mi în comentarii ce ați făcut sau cât de departe ați ajuns în jocuri.

Sperăm să vă placă articolele pe care le recomandăm și le discutăm! MUO are parteneriate afiliate și sponsorizate, așa că primim o parte din venituri din unele dintre achizițiile dvs. Acest lucru nu va afecta prețul pe care îl plătiți și ne ajută să oferim cele mai bune recomandări de produse.

Acțiune Acțiune Tweet E-mail Merită să faceți upgrade la Windows 11?

Windows a fost reproiectat. Dar este suficient pentru a vă convinge să treceți de la Windows 10 la Windows 11?

Citiți în continuare
Subiecte asemănătoare
  • DIY
  • Programare
  • Minecraft
  • Raspberry Pi
  • Electronică
  • Piton
Despre autor Joe Coburn(136 articole publicate)

Joe este absolvent de Informatică de la Universitatea Lincoln, Marea Britanie. Este un dezvoltator de software profesionist și, atunci când nu zboară cu drone sau nu scrie muzică, poate fi găsit adesea făcând fotografii sau producând videoclipuri.

Mai multe de la Joe Coburn

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona
Categorie Diy