Impara Python ed elettronica con Minecraft Pi Edition

Impara Python ed elettronica con Minecraft Pi Edition

Hai sempre desiderato imparare a programmare ma non sapevi da dove cominciare? Scopri come controllare Minecraft sul Raspberry Pi usando Python e alcuni semplici dispositivi elettronici. Ecco il risultato finale:





Avrai bisogno di un Pi 2 o più recente per questo progetto e, sebbene tu possa completare la maggior parte di queste attività tramite la riga di comando su Secure Shell (SSH), questo tutorial si concentrerà sulla codifica direttamente sul Pi.





Nuovo per Minecraft? Non preoccuparti, ecco il nostro Guida per principianti di Minecraft .





Introduzione a Minecraft Pi

Minecraft per Raspberry Pi è stato sviluppato per imparare e armeggiare (ed è gratuito). Viene fornito con un'interfaccia di programmazione dell'applicazione (API) che consente al codice di comunicare facilmente con Minecraft. È fantastico per imparare a programmare in Python e per iniziare con l'elettronica.

Cos'è Python?

Pitone è un linguaggio di programmazione. è interpretato , il che significa che quando esegui un file o un programma Python, il computer deve prima eseguire un piccolo lavoro sul file. Gli svantaggi sono che può essere considerato lento rispetto ai linguaggi compilati [Broken URL Removed].



I vantaggi delle lingue interpretate sono la velocità di codifica e la loro cordialità. Non è necessario che lo dica al computer che cosa dati che si desidera archiviare, solo che si desidera archiviare qualcosa e il computer capirà cosa fare. Ci sono delle eccezioni, ovviamente, e questa è una visione un po' semplificata, tuttavia la programmazione dovrebbe essere divertente! Se inizi a scavare nei dettagli tecnici complessi, può diventare un po' laborioso.

Python fa distinzione tra maiuscole e minuscole. Questo è importante da sapere, poiché Python non riconoscerà gli oggetti anche se sono scritti correttamente se il caso è sbagliato. 'DoSomething()' non funzionerà se il metodo è effettivamente chiamato 'DoSomething()'. Python usa anche il rientro . Ad altri linguaggi di programmazione potrebbe non interessare quanti rientri ha il tuo codice, mentre Python fa cura. I rientri sono usati per dire a Python dove appartiene il codice. Altri linguaggi possono usare le 'parentesi graffe' ({}) per raggruppare il codice -- Python non le usa. Python usa un cancelletto (#) per i commenti e i commenti sono usati per dire ad altri sviluppatori o persone che guardano il codice cosa fa una parte particolare, o perché è necessaria. Python ignora qualsiasi cosa dopo un hash.





Infine, ci sono due versioni principali di Python: Python 2.7.x e Python 3.x. Ci sono alcune differenze tra i due ( quali sono le differenze? ). Questo tutorial utilizzerà Python 3.

Configurazione iniziale

Fornire il tuo Pi è già configurare ed eseguire Raspbian , non sono necessarie molte impostazioni iniziali.





Terminale aperto ( Menu > Accessori > Terminale ) ed eseguire questo comando. È sempre buona norma mantenere aggiornato l'elenco dei repository, e questo scaricherà l'elenco più recente di programmi (non scaricherà i programmi stessi, questo aiuta il Pi a sapere come vengono chiamati i programmi e dove trovarli).

sudo apt-get update

Ora aggiorna il Pi (potrebbe volerci un po' di tempo):

sudo apt-get upgrade

Python e Minecraft Pi sono già installati, tuttavia se Minecraft Pi non è installato per qualsiasi motivo, è semplice da installare:

sudo apt-get install minecraft-pi

Vai ai documenti e crea una nuova cartella chiamata 'Minecraft':

cd Documents/
mkdir Minecraft

Puoi visualizzare il contenuto di questa nuova cartella:

ls

Ecco un suggerimento: se inizi a digitare e premi il tasto TAB, la riga di comando tenterà di completare automaticamente l'istruzione per te.

Puoi esaminare il percorso della directory corrente usando pwd, che sta per Print Working Directory:

pwd

Avvia Minecraft andando su Menu > Giochi > Minecraft Pi . Avrai bisogno di questa esecuzione, ma ci tornerai più tardi.

Apri Python 3 da Menù > Programmazione > Python 3 (IDLE) . Questo programma fornisce un modo per eseguire comandi Python e scrivere programmi.

Ora puoi digitare i tuoi comandi Python qui, ma non è molto pratico. Vai a File > Nuovo file poi File > Salva e salvalo nella cartella che hai creato in precedenza. ( Documenti > Minecraft ). chiamiamolo ' ciao_mondo.py '. Non è necessario utilizzare l'estensione .py, questa verrà aggiunta automaticamente, ma è una buona pratica.

Se torni al terminale e navighi nella cartella Minecraft dovresti vedere il file appena creato:

cd Minecraft/
ls

Puoi eseguire questo file in questo modo:

python hello_world

Nota come 'python' è tutto minuscolo. Questo deve essere prima del nome del file, poiché dice al Pi che il seguente file è Python, quindi dovrebbe essere eseguito come tale.

Torna all'editor Python e digita:

print 'Hello, World!'

Salva questo file ed eseguilo di nuovo: ora dovresti vedere 'Hello, World!' appaiono nella riga di comando -- pulito! Il comando print dice semplicemente a Python di produrre il seguente testo tra virgolette. Questo è buono, ma non molto utile per Minecraft, colleghiamolo:

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

Ora se salvi ed esegui questo file, dovresti vedere 'Hello, World!' appaiono nel gioco Minecraft. Analizziamo il codice:

from mcpi.minecraft import Minecraft

Questa riga dice a Python che vuoi usare il codice di un altro file. Questo file mcpi.minecraft è stato sviluppato per consentire un facile controllo di Minecraft.

mc = Minecraft.create()

Questa linea crea un oggetto chiamato 'mc' (Minecraft). Devi crearlo per consentire la comunicazione con il gioco Minecraft: non è sufficiente includere solo il file.

mc.postToChat('Hello, World!')

Infine, questa riga dice a Minecraft di scrivere del testo nella chat. Prova a cambiare 'Ciao, mondo!' a qualcos'altro e vedi cosa succede, ma ricorda di includere entrambe le virgolette. Se hai problemi con il software, questi sono alcuni errori comuni di Python e Minecraft Pi:

  • AttributeError -- questo è un errore di battitura, come pint o prnt invece di print
  • NameError: il nome 'Minecraft' non è definito -- ricordati di importare i moduli di cui hai bisogno
  • NameError: il nome 'true' non è definito -- Python fa distinzione tra maiuscole e minuscole, cambia in 'True'
  • socket.error: [Errno 111] Connessione rifiutata -- Assicurati che Minecraft sia in esecuzione

Progetti

Ora che conosci le basi di Python e Minecraft, realizziamo alcuni progetti interessanti. Tutto il codice può essere scaricato da Github.

Generatore di ponti automatizzato

Questo programma costruirà efficacemente un ponte sull'acqua. Quando il giocatore si avvicina a uno specchio d'acqua, il programma convertirà diversi blocchi in pietra. Poiché Minecraft utilizza un sistema di coordinate, è molto facile ottenere la posizione del giocatore, insieme al tipo di blocchi intorno al giocatore. Minecraft Pi è leggermente limitato, quindi non è possibile aggiornare più blocchi diversi in blocco. Tuttavia, puoi facilmente codificare questo comportamento da solo.

Crea un nuovo file ( File > Nuovo file ) e salvalo come ' 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)

Nota come il valore y sta effettivamente guardando y - 1. Questo è il livello del pavimento. Se fosse stato usato il valore di y, lo script cercherebbe blocchi a livello del ginocchio -- non funzionerebbe molto bene! Mc.getBlock() restituisce l'id di un blocco per le coordinate date. Poiché x, yez sono le coordinate del giocatore, puoi aggiungere o sottrarre da esse per ottenere le posizioni intorno al giocatore. Non è necessario utilizzare i valori x, yez, è possibile utilizzare qualsiasi numero, tuttavia potresti non sapere in che modo quel particolare blocco si riferisce al giocatore: è meglio usare i valori relativi al giocatore. Esegui questo file dalla riga di comando e guarda cosa succede.

Dovresti vedere che una piccola area di terreno si trasforma in pietra una volta che il giocatore raggiunge uno specchio d'acqua. Non è eccezionale: sei in grado di camminare abbastanza velocemente da causare un problema. Potresti risolverlo convertendo un volume maggiore di acqua in terra. La parte finale del metodo mc.setBlocks() è l'id del blocco. Uno è l'ID del blocco per la pietra. Potresti cambiarlo in legno, erba o altro. Se lo volessi, potresti facilmente convertirlo in un progetto complesso, forse un ponte sospeso!

Pulsante Super Mining

Questo esempio renderà breve il lavoro di mining. Consiste in un pulsante fisico che, se premuto, estrae 10 blocchi al cubo. Cominciamo con il pulsante. Simile ai pulsanti su Arduino, avrai bisogno di una piccola quantità di elettronica, che dovrebbe essere trovata in uno starter kit di base:

  • 1 x tagliere
  • 1 x interruttore momentaneo
  • 1 x resistenza da 220 ohm
  • Cavi di avviamento femmina > maschio
  • Cavi di avviamento maschio > maschio

Ecco il circuito:

Pi-Pulsante-Connessione

Questo resistore è chiamato resistore 'pull down'. Aiuta a garantire che ciò che il Pi pensa sia il pulsante che viene premuto, sia davvero il pulsante che viene premuto. Non è necessario utilizzarlo, tuttavia è consigliato, poiché potresti trovare molto rumore e letture false senza di esso.

Il pulsante è collegato al pin 14 GPIO (General Purpose Input Output). È possibile utilizzare qualsiasi pin GPIO, tuttavia guardare il piedinatura in primo luogo, poiché non sono tutti controllabili dal Pi e variano leggermente tra i modelli.

Ora che il pulsante è connesso, è il momento di testarlo. Crea un nuovo file e salvalo come ' button_test.py '. Aggiungi questo codice, salvalo, quindi eseguilo in Terminale.

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

premere Ctrl + Do per interrompere lo script. Se tutto funziona correttamente dovresti vedere 'BUTTON WORKS!' nel Terminale. Nota come, come il modulo Minecraft, questo test utilizza RPi.GPIO e i moduli temporali. Questi consentono al Pi di accedere ai pin hardware e forniscono utili funzioni di temporizzazione.

Ora finiamo il resto del codice. Crea un nuovo file chiamato ' super_mine.py '. Ecco il codice:

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() restituisce le coordinate correnti dei giocatori, che vengono quindi memorizzate in x, y e z. Il setBlocks() Il metodo dice a Minecraft di riempire tutti i blocchi tra l'inizio e la fine con il blocco seguente. Zero è il block-id per l'aria. Potresti cambiarlo con un altro block-id per riempire un'area in modo solido. Potresti anche cambiare le coordinate a +100 o addirittura +1000 blocchi, tuttavia il Pi potrebbe iniziare a lottare se diventi troppo pazzo. Nota come y + 10 è lo stesso per entrambe le linee. Puoi cambiarlo in y - 10 se vuoi rimuovere i blocchi sottoterra.

Teletrasporto

Un altro semplice utilizzo di questo pulsante potrebbe essere il 'teletrasporto'. L'API Minecraft Pi fornisce un modo per impostare la posizione del giocatore. Il seguente codice 'teletrasporterà' il giocatore in una posizione preimpostata:

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

Nota che il suo metodo accetta tre parametri; x, y e z, quindi puoi impostarli su qualsiasi cosa per teletrasportare istantaneamente il giocatore in quella posizione.

Crea una copia del file super_mine ( File > Salva copia con nome ) e modificarlo sostituendo il if con il seguente:

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

Questo file dovrebbe ora assomigliare a questo:

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

Salvalo come ' teletrasporto.py ' e corri.

Potresti scoprire che il giocatore rimane bloccato all'interno di alcuni blocchi quando lo usi, nel qual caso dovrai regolare le coordinate in uno spazio aperto noto (la parte superiore sinistra dello schermo mostra la tua posizione attuale).

Costruire una casa

Un ultimo compito per questo pulsante è costruire una casa. Proprio come l'esempio di estrazione rapida sopra, questo sostituirà semplicemente i blocchi che circondano il giocatore per creare una casa. Diversi block-id verranno utilizzati per diversi materiali (finestre, pareti, ecc.). Per rendere le cose più facili da codificare, verrà creato un blocco solido e quindi rimosso l'interno (imposta il blocco in aria), questo creerà un guscio vuoto. Potresti aggiungere extra come un letto o una porta, tuttavia il progetto Minecraft Pi è un po' incompleto e, sebbene questi oggetti funzionino quando vengono posizionati dal giocatore, non sono eccezionali quando si utilizza 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 questo come ' casa.py ' e corri. Se tutto va bene, dovresti vedere apparire una piccola casa (potresti aver bisogno di girarti per trovarla). È molto semplice, un'apertura e alcune finestre. In teoria, non c'è limite a quanto grande o complesso si possa costruire un edificio.

Crea un minigioco

Quindi, facciamo un mini-gioco! Questo sarà abbastanza semplice, quando il giocatore calpesta un blocco di sabbia, si trasformerà in lava dopo un periodo di tempo casuale. Questo è un buon gioco da realizzare, poiché puoi progettare i tuoi livelli o modificarli per rendere le cose più difficili. Non avrai bisogno del pulsante per questo esempio.

Crea un nuovo file e salvalo come ' mini_game.py '. Ecco il codice:

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

Questo codice è un buon punto di partenza per il a caso() funzione: random.uniform(0.1, 2.5) genererà un numero casuale compreso tra 0,1 (1/10 di secondo) e 2,5 (2 1/2 di secondo). L'aumento di questi numeri renderà il gioco più semplice.

Provalo! Mettiti su un blocco di sabbia e presto si trasformerà in lava. Questa potrebbe essere la base di un gioco più complesso.

Crea un altro minigioco

La premessa per questo gioco è semplice: non stare in piedi sul pavimento di legno quando il tempo scade. Il giocatore viene teletrasportato in un'arena. Sono costretti a stare fermi fino all'inizio del gioco. Una volta avviato, il pavimento si trasformerà in acqua allo scadere del tempo. Il giocatore deve trovarsi nella zona sicura (blocchi di diamante) per sopravvivere. Ogni livello riduce il timer di un secondo. Dopo ogni livello di successo l'area sicura diventa più grande. Dai un'occhiata al codice qui sotto:

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 questo come ' mini_game_2.py ' e dagli una corsa.

Il Pi 2 ha alcuni problemi di prestazioni durante l'esecuzione di Minecraft. Il grafico di utilizzo dell'unità di elaborazione centrale (CPU) ( angolo in alto a destra ) non mostra mai alcun carico pesante, quindi questo deve essere dovuto a un design scadente e a ottimizzazioni da parte degli sviluppatori. Questi problemi non sono correlati all'esecuzione del codice (in quanto continuano quando Python non è in esecuzione), tuttavia sono aggravati da questo mini gioco. Se il tuo Pi è davvero in difficoltà, potresti voler ridurre le dimensioni dell'arena o overcloccare il tuo Pi.

come visualizzare i tuoi iscritti su youtube

Rilevatore di diamanti

Facciamo un altro circuito. Questo utilizzerà un diodo a emissione di luce (LED) per accendersi quando ci sono diamanti sotto (entro 15 blocchi). Ecco cosa ti serve:

  • 1 x tagliere
  • 1 x LED
  • 1 x resistenza da 220 ohm
  • Cavi di avviamento femmina > maschio
  • Cavi di avviamento maschio > maschio

Ecco il circuito:

Collegare l'anodo (gamba lunga) al pin 14 GPIO. Questo pin si comporta come +5v. Collegare il catodo (gamba corta) a terra.

Ho usato un giocattolo economico e l'ho modificato rimuovendo il coperchio posteriore e l'elettronica, quindi ho posizionato un LED sotto di esso. Potresti facilmente renderlo permanente con la colla a caldo o qualcosa di simile.

Salva questo codice come ' diamanti.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

Quando c'è un blocco di minerale di diamante sotto il giocatore (entro 15 blocchi) la luce lampeggerà.

ThinkGeek Minecraft Light-Up Blue Stone Diamond Ore - Assicurati di tenere lontani i Pigmen ACQUISTA ORA SU AMAZON

Hai fatto qualcosa di interessante con Minecraft Pi? Fammi sapere nei commenti cosa hai fatto o fino a che punto sei arrivato nei giochi.

Ci auguriamo che gli articoli che consigliamo e discutiamo vi piacciano! MUO ha partnership affiliate e sponsorizzate, quindi riceviamo una quota delle entrate da alcuni dei tuoi acquisti. Ciò non influirà sul prezzo che paghi e ci aiuta a offrire i migliori consigli sui prodotti.

Condividere Condividere Tweet E-mail Vale la pena eseguire l'aggiornamento a Windows 11?

Windows è stato ridisegnato. Ma è abbastanza per convincerti a passare da Windows 10 a Windows 11?

Leggi Avanti
Argomenti correlati
  • Fai da te
  • Programmazione
  • Minecraft
  • Lampone Pi
  • Elettronica
  • Pitone
Circa l'autore Joe Coburn(136 articoli pubblicati)

Joe si è laureato in Informatica presso l'Università di Lincoln, nel Regno Unito. È uno sviluppatore di software professionista e, quando non pilota droni o scrive musica, lo si trova spesso a scattare foto o produrre video.

Altro da Joe Coburn

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per consigli tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti