Apreneu Python i electrònica amb Minecraft Pi Edition

Apreneu Python i electrònica amb Minecraft Pi Edition

Sempre heu volgut aprendre a codificar però no sabíeu per on començar? Apreneu a controlar Minecraft al Raspberry Pi mitjançant Python i alguns components electrònics senzills. Aquí teniu el resultat final:





Necessitareu un Pi 2 o més recent per a aquest projecte i, tot i que podeu completar la majoria d’aquestes tasques mitjançant la línia d’ordres a través de Secure Shell (SSH), aquest tutorial se centrarà en codificar directament al Pi.





Ets nou a Minecraft? No us preocupeu, aquí teniu el nostre Guia per a principiants de Minecraft .





Introducció a Minecraft Pi

Minecraft per al Raspberry Pi ha estat desenvolupat per aprendre i jugar (i és gratuït). Inclou una interfície de programació d'aplicacions (API) que proporciona una manera de parlar fàcilment amb Minecraft. És genial per aprendre a codificar a Python, així com per començar a utilitzar electrònica.

Què és Python?

Python és un llenguatge de programació. És interpretat , el que significa que quan s'executa un fitxer o programa Python, l'ordinador ha de fer primer una mica de feina al fitxer. Els inconvenients són que es pot considerar lent si es compara amb els idiomes compilats [URL trencat eliminat].



Els avantatges dels llenguatges interpretats són la rapidesa de la codificació i la seva facilitat. No cal que ho digueu a l’ordinador què les dades que voleu emmagatzemar, només que voleu emmagatzemar alguna cosa i l’ordinador esbrinarà què fer. Hi ha excepcions, per descomptat, i aquesta és una visió una mica simplificada, tot i que la programació hauria de ser divertida. Si comenceu a aprofundir en els complexos detalls tècnics, pot resultar una mica laboriós.

Python distingeix entre majúscules i minúscules. És important saber-ho, ja que Python no reconeixerà objectes fins i tot si s’escriuen correctament si el cas és erroni. 'Dosomething ()' no funcionarà si el mètode realment s'anomena 'DoSomething ()'. Python també utilitza sagnat . És possible que a altres llenguatges de programació no els importi quants sagnats tingui el vostre codi, mentre que Python fa cura. Els sagnats s’utilitzen per indicar a Python on pertany el codi. Altres idiomes poden utilitzar 'Paréntesis' ({}) per agrupar el codi; Python no els fa servir. Python utilitza un hash (#) per fer comentaris, i els comentaris s'utilitzen per dir a altres desenvolupadors o persones que estiguin mirant el codi què fa una part en concret o per què és necessària. Python ignora qualsevol cosa després d'un hash.





Finalment, hi ha dues versions principals de Python: Python 2.7.x i Python 3.x. Hi ha algunes diferències entre els dos ( quines diferències hi ha? ). Aquest tutorial utilitzarà Python 3.

Configuració inicial

Proporcionar el vostre Pi ja ho és configuració i execució de Raspbian , no cal molta configuració inicial.





Terminal obert ( Menú> Accessoris> Terminal ) i executeu aquesta ordre. Sempre és una bona pràctica mantenir la llista de dipòsits actualitzada, i això descarregarà la llista de programes més recent (no descarregarà els programes per si mateixos, això ajuda el Pi a saber quins programes es diuen i on trobar-los).

sudo apt-get update

Actualitzeu el Pi (això pot trigar una estona):

sudo apt-get upgrade

Python i Minecraft Pi ja estan instal·lats, però si Minecraft Pi no s’instal·la per cap motiu, és fàcil d’instal·lar:

sudo apt-get install minecraft-pi

Aneu a documents i creeu una carpeta nova anomenada 'Minecraft':

cd Documents/
mkdir Minecraft

Podeu veure el contingut d’aquesta nova carpeta:

ls

Aquí teniu un consell: si comenceu a escriure i premeu la tecla TAB, la línia d'ordres intentarà completar automàticament la declaració.

Podeu examinar el camí al directori actual mitjançant pwd, que significa Imprimir directori de treball:

pwd

Inicieu Minecraft anant a Menú> Jocs> Minecraft Pi . Necessitareu aquest funcionament, però hi tornareu més endavant.

Obriu Python 3 des de Menú> Programació> Python 3 (IDLE) . Aquest programa us proporciona una manera d’executar ordres de Python i d’escriure programes.

Ara podeu escriure aquí les vostres ordres de Python, però això no és molt pràctic. Anar a Fitxer> Fitxer nou i llavors Fitxer> Desa i deseu-lo a la carpeta que heu creat anteriorment. ( Documents> Minecraft ). Anem a dir-ho ' hello_world.py '. No cal que utilitzeu l'extensió .py, aquesta s'afegirà automàticament, però és una bona pràctica.

Si torneu al terminal i aneu a la carpeta Minecraft, hauríeu de veure el fitxer que acabeu de crear:

cd Minecraft/
ls

Podeu executar aquest fitxer així:

python hello_world

Fixeu-vos en què 'python' és en minúscula. Això ha de ser anterior al nom del fitxer, ja que indica al Pi que el fitxer següent és Python, de manera que s'hauria d'executar com a tal.

Torneu a l'editor de Python i escriviu:

print 'Hello, World!'

Deseu aquest fitxer i torneu-lo a executar; ara hauríeu de veure 'Hola, món!' apareixerà a la línia d'ordres - ordenat! L'ordre print simplement indica a Python que emeti el text següent entre cometes dobles. Això és bo, però no és massa útil per a Minecraft, enllacem-ho:

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

Ara, si deseu i executeu aquest fitxer, hauríeu de veure 'Hola, món!' apareixeran al joc Minecraft. Desglossem el codi:

from mcpi.minecraft import Minecraft

Aquesta línia indica a Python que voleu utilitzar el codi d’un altre fitxer. Aquest fitxer mcpi.minecraft va ser desenvolupat per permetre un control fàcil de Minecraft.

mc = Minecraft.create()

Aquesta línia crea un objecte anomenat 'mc' (Minecraft). Heu de crear això per permetre la comunicació amb el joc Minecraft: no n'hi ha prou amb incloure el fitxer.

mc.postToChat('Hello, World!')

Finalment, aquesta línia indica a Minecraft que escrigui text al xat. Proveu de canviar 'Hola, món!' a una altra cosa i veure què passa, però recordeu d’incloure les cometes dobles. Si teniu problemes de programari, aquests són alguns errors habituals de Python i Minecraft Pi:

  • AttributeError: es tracta d’un error tipogràfic, com ara pint o prnt en lloc d’imprimir
  • NameError: el nom 'Minecraft' no està definit; recordeu-vos d'importar els mòduls que necessiteu
  • NameError: el nom 'true' no està definit - Python distingeix entre majúscules i minúscules, canvieu a 'True'
  • socket.error: [Errno 111] Connexió rebutjada: assegureu-vos que Minecraft s'estigui executant

Projectes

Ara que ja coneixeu els conceptes bàsics de Python i Minecraft, fem alguns projectes interessants. Tots els codecan es poden descarregar de Github.

Constructor de ponts automatitzat

Aquest programa construirà efectivament un pont sobre l’aigua. Quan el jugador s’acosti a una massa d’aigua, el programa convertirà diversos blocs en pedra. Com que Minecraft utilitza un sistema de coordenades, és molt fàcil obtenir la ubicació del jugador, juntament amb el tipus de blocs al voltant del jugador. Minecraft Pi és lleugerament limitat, de manera que no és possible actualitzar diversos blocs de manera massiva. Tanmateix, podeu codificar fàcilment aquest comportament.

Crea un fitxer nou ( Fitxer> Fitxer nou ) i deseu-lo com a ' 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)

Fixeu-vos en com el valor y es veu realment en y - 1. Aquest és el nivell del sòl. Si s’utilitzés el valor de y, el guió cercaria blocs aproximadament al nivell del genoll, no funcionaria molt bé. Mc.getBlock () retorna l'identificador d'un bloc per a les coordenades donades. Com que x, y i z són les coordenades del jugador, podeu afegir-les o restar-les per obtenir posicions al voltant del jugador. No cal que utilitzeu els valors x, y i z, podeu utilitzar qualsevol número, però és possible que no sàpiga com es relaciona aquest bloc amb el jugador; és millor utilitzar valors relatius al jugador. Executeu aquest fitxer des de la línia d'ordres i vegeu què passa.

Hauríeu de veure que una petita zona de terra es converteix en pedra un cop el jugador arriba a una massa d’aigua. No és fantàstic: sou capaços de caminar prou ràpid com per provocar un problema. Podeu resoldre-ho convertint a terra un volum d’aigua més gran. La part final del mètode mc.setBlocks () és l’identificador de bloc. Un és l’identificador de bloc de la pedra. Podeu canviar-ho per fusta, herba o qualsevol cosa. Si ho volguéssiu, podríeu convertir-lo fàcilment en un disseny complex, potser un pont penjant.

Botó Super Mining

Aquest exemple farà un treball curt de la mineria. Consisteix en un botó físic que, quan es prem, extraurà 10 blocs en cubs. Comencem pel botó. De manera similar als botons de l’Arduino, necessitareu una petita quantitat d’electrònica, que s’hauria de trobar en un kit d’inici bàsic:

  • 1 x Taula de pa
  • 1 interruptor momentani
  • 1 x 220 ohm resistència
  • Cables de salt femella> mascle
  • Cables de salt masculins> Masculins

Aquí teniu el circuit:

Connexió de botons Pi

Aquesta resistència s’anomena resistència “pull down”. Ajuda a assegurar que el que el Pi creu que és el botó que es prem, és realment el botó que es prem. No cal que utilitzeu això, tot i que és recomanable, ja que podeu trobar-hi molts sorolls i lectures falses.

El botó està connectat al pin 14. General Purpose Input Output Output (GPIO). Podeu utilitzar qualsevol pin GPIO, tot i que mireu el pinout primer, ja que no tots es poden controlar des del Pi i varien lleugerament entre models.

Ara que el botó està connectat, és hora de provar-lo. Creeu un fitxer nou i deseu-lo com a ' button_test.py '. Afegiu aquest codi, deseu-lo i executeu-lo a 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

Premeu Control + C per aturar el guió. Si tot funciona correctament, hauríeu de veure 'BUTTON WORKS!' a la Terminal. Fixeu-vos en com, com el mòdul Minecraft, aquesta prova utilitza els mòduls RPi.GPIO i time. Aquests permeten al Pi accedir als pins de maquinari i proporcionar funcions de temps útils.

Ara deixem la resta del codi. Crea un fitxer nou anomenat ' super_mine.py '. Aquí teniu el codi:

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 () retorna les coordenades actuals dels reproductors, que després s'emmagatzemen en x, y i z. El setBlocks () El mètode indica a Minecraft que ompli tots els blocs entre l'inici i el final amb el següent bloc. Zero és l’identificador de bloc de l’aire. Podeu canviar-ho per un altre identificador de bloc per omplir de forma sòlida una àrea. També podeu canviar les coordenades a +100 o fins i tot a +1000 blocs, però el Pi pot començar a lluitar si us torneu massa bojos. Fixeu-vos en què y + 10 és el mateix per a les dues línies. Podeu canviar-ho per y-10 si voleu eliminar blocs sota terra.

Teletransportar-se

Un altre ús senzill d'aquest botó podria ser 'teletransportar-se'. El Minecraft Pi Api proporciona una manera d’establir la posició del jugador. El codi següent 'teletransportarà' el jugador a una ubicació predeterminada:

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

Tingueu en compte que el seu mètode accepta tres paràmetres; x, y i z, de manera que podeu configurar-los en qualsevol cosa per teletransportar instantàniament el reproductor a aquesta ubicació.

Creeu una còpia del fitxer super_mine ( Fitxer> Desa la còpia com a ) i modifiqueu-lo substituint el fitxer if pel següent:

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

Aquest fitxer ara hauria de ser així:

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

Deseu-lo com a ' teleport.py 'i córrer.

És possible que trobeu que el reproductor s’enganxa dins d’uns blocs en utilitzar-lo, en aquest cas haureu d’ajustar les coordenades a un espai obert conegut (la part superior esquerra de la pantalla mostra la vostra ubicació actual).

Construir una casa

Una última tasca d’aquest botó és construir una casa. Igual que l'exemple de mineria ràpida anterior, això simplement substituirà els blocs que envolten el jugador per fer una casa. S’utilitzaran diferents identificadors de blocs per a diferents materials (finestra, parets, etc.). Per facilitar la codificació de les coses, es crearà un bloc sòlid i, a continuació, es traurà l'interior (establiu el bloc a l'aire), es crearà una closca buida. Podeu afegir extres com un llit o una porta, però el projecte Minecraft Pi és una mica incomplet i, tot i que aquests objectes funcionen quan el reproductor els col·loca, no són brillants quan s’utilitza 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

Desa això com a ' house.py 'i córrer. Tot bé, hauríeu de veure aparèixer una petita casa (és possible que hagueu de girar per trobar-la). És molt senzill, amb una obertura i algunes finestres. En teoria, no hi ha límit quant a la mida o la complexitat d’un edifici que podríeu construir.

Fes un mini joc

A continuació, fem un mini-joc. Això serà molt senzill, quan el jugador trepitgi un bloc de sorra es convertirà en lava després d’un temps aleatori. Aquest és un bon joc per fer, ja que podeu dissenyar els vostres propis nivells o modificar-los per fer les coses més difícils. No necessitareu el botó per a aquest exemple.

Creeu un fitxer nou i deseu-lo com a ' mini_game.py '. Aquí teniu el codi:

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

Aquest codi és un bon principi per a random () funció: random.uniform (0,1, 2,5) generarà un nombre aleatori entre 0,1 (1/10 de segon) i 2,5 (2 1/2 segons). Augmentar aquestes xifres facilitarà el joc.

Intenta-ho! Poseu-vos sobre un bloc de sorra i, en breu, es convertirà en lava. Aquesta podria ser la base d’un joc més complex.

Feu un altre mini joc

La premissa d’aquest joc és senzilla: no us poseu al terra de fusta quan s’acabi el temps. El jugador es teletransporta a una 'arena'. Es veuen obligats a estar quiets fins que comenci el joc. Un cop començat, el terra es convertirà en aigua un cop s’acabi el temporitzador. El jugador ha d’estar dret a la zona segura (blocs de diamants) per sobreviure. Cada nivell redueix el temporitzador en un segon. Després de cada nivell d’èxit, l’àrea segura es fa més gran. Consulteu el codi següent:

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

Desa això com a ' mini_game_2.py 'i donar-li una volta.

El Pi 2 té alguns problemes de rendiment mentre s’executa Minecraft. El gràfic d’ús de la unitat central de processament (CPU) ( cantonada superior dreta ) mai mostra cap càrrega elevada, de manera que això ha de ser degut a un mal disseny i optimitzacions dels desenvolupadors. Aquests problemes no estan relacionats amb el codi d’execució (ja que continuen quan Python no s’executa), tot i així, s’incrementa amb aquest mini joc. Si el vostre Pi realment està tenint problemes, és possible que vulgueu reduir la mida de l’arena o fer un overclock del Pi.

millors aplicacions de cites per a adults joves

Detector de diamants

Fem un altre circuit. S'utilitzarà un díode emissor de llum (LED) per il·luminar-se quan hi hagi diamants a sota (dins de 15 blocs). Això és el que necessiteu:

  • 1 x Taula de pa
  • 1 x LED
  • 1 x 220 ohm resistència
  • Cables de salt femella> mascle
  • Cables de salt masculins> Masculins

Aquí teniu el circuit:

Connecteu l’ànode (cama llarga) al pin 14. GPIO. Aquest pin actua com + 5v. Connecteu el càtode (cama curta) a terra.

He utilitzat una joguina barata de mineral i l'he modificat traient la tapa posterior i l'electrònica, i després he posat un LED a sota. Es podria fer fàcilment permanent amb cola calenta o alguna cosa similar.

Deseu aquest codi com a ' 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

Quan hi ha un bloc de mineral de diamant a sota del jugador (dins de 15 blocs) la llum parpellejarà.

Mineral de diamant de pedra blava il·luminada ThinkGeek Minecraft: segur que mantindràs a Pigmen COMPRA ARA A AMAZON

Heu creat alguna cosa divertida amb Minecraft Pi? Feu-me saber als comentaris què heu fet o fins a quin punt heu arribat als jocs.

Esperem que us agradin els articles que recomanem i comentem. MUO té associacions afiliades i patrocinades, de manera que rebem una part dels ingressos d'algunes de les vostres compres. Això no afectarà el preu que pagueu i ens ajudarà a oferir les millors recomanacions de productes.

Compartir Compartir Tweet Correu electrònic Val la pena actualitzar-lo a Windows 11?

Windows s’ha redissenyat. Però, n’hi ha prou per convèncer-vos de canviar de Windows 10 a Windows 11?

Llegiu a continuació
Temes relacionats
  • Bricolatge
  • Programació
  • Minecraft
  • Raspberry Pi
  • Electrònica
  • Python
Sobre l'autor Joe Coburn(136 articles publicats)

Joe és llicenciat en Informàtica per la Universitat de Lincoln, Regne Unit. És un desenvolupador de programari professional i, quan no fa drons voladors ni escriu música, sovint se’l pot trobar fent fotos o produint vídeos.

Més de Joe Coburn

Subscriu-te al nostre butlletí

Uniu-vos al nostre butlletí per obtenir consells tècnics, ressenyes, llibres electrònics gratuïts i ofertes exclusives.

Feu clic aquí per subscriure-us