Aprenda Python e Eletrônica com Minecraft Pi Edition

Aprenda Python e Eletrônica com Minecraft Pi Edition

Você sempre quis aprender a programar, mas não sabia por onde começar? Aprenda a controlar o Minecraft no Raspberry Pi usando Python e alguns eletrônicos simples. Aqui está o resultado final:





Você precisará de um Pi 2 ou mais recente para este projeto e, embora possa concluir a maioria dessas tarefas por meio da linha de comando no Secure Shell (SSH), este tutorial se concentrará na codificação diretamente no Pi.





Novo no Minecraft? Não se preocupe - aqui está o nosso Guia do Minecraft para iniciantes .





Introdução ao Minecraft Pi

O Minecraft para o Raspberry Pi foi desenvolvido para aprender e mexer (e é gratuito). Ele vem com uma Interface de Programação de Aplicativo (API) que fornece uma maneira de o código se comunicar facilmente com o Minecraft. É brilhante para aprender a codificar em Python, bem como para começar com a eletrônica.

O que é Python?

Pitão é uma linguagem de programação. Isto é interpretado , o que significa que quando você executa um arquivo ou programa Python, o computador precisa fazer um pequeno trabalho no arquivo primeiro. As desvantagens são que ele pode ser considerado lento quando comparado às linguagens compiladas [Broken URL Removed].



Os benefícios das linguagens interpretadas são a velocidade da codificação e sua facilidade de uso. Você não precisa dizer ao computador o que dados que deseja armazenar, apenas que deseja armazenar algo e o computador descobrirá o que fazer. Existem exceções, é claro, e esta é uma visão um tanto simplificada; no entanto, programar deve ser divertido! Se você começar a cavar nos detalhes técnicos complexos, pode se tornar um pouco trabalhoso.

Python diferencia maiúsculas de minúsculas. É importante saber isso, pois o Python não reconhece objetos mesmo se eles estiverem escritos corretamente se o caso estiver errado. 'Dosomething ()' não funcionará se o método for realmente denominado 'DoSomething ()'. Python também usa indentação . Outras linguagens de programação podem não se importar com quantos recuos seu código tem, enquanto Python faz Cuidado. Indentações são usadas para dizer ao Python onde o código pertence. Outras linguagens podem usar 'Curly Braces' ({}) para agrupar o código - Python não os usa. Python usa um hash (#) para comentários, e os comentários são usados ​​para dizer a outros desenvolvedores ou pessoas que estão olhando para o código o que uma determinada parte faz ou por que ela é necessária. Python ignora qualquer coisa após um hash.





Finalmente, existem duas versões principais do Python - Python 2.7.x e Python 3.x. Existem algumas diferenças entre os dois ( Quais são as diferenças? ) Este tutorial usará Python 3.

Configuração inicial

Fornecer seu Pi já é configurar e executar o Raspbian , não há muita configuração inicial necessária.





Terminal aberto ( Menu> Acessórios> Terminal ) e execute este comando. É sempre uma boa prática manter a lista de repositórios atualizada, e isso irá baixar a lista mais recente de programas (não irá baixar os programas em si, isso ajuda o Pi a saber quais programas são chamados e onde encontrá-los).

sudo apt-get update

Agora atualize o Pi (isso pode demorar um pouco):

sudo apt-get upgrade

Python e Minecraft Pi já estão instalados, no entanto, se o Minecraft Pi não estiver instalado por qualquer motivo, é simples de instalar:

sudo apt-get install minecraft-pi

Navegue até os documentos e crie uma nova pasta chamada 'Minecraft':

cd Documents/
mkdir Minecraft

Você pode ver o conteúdo desta nova pasta:

ls

Aqui está uma dica - se você começar a digitar e pressionar a tecla TAB, a linha de comando tentará preencher automaticamente a instrução para você.

Você pode examinar o caminho para o diretório atual usando pwd, que significa Print Working Directory:

pwd

Inicie o Minecraft indo para Menu> Jogos> Minecraft Pi . Você precisará disso em execução, mas voltará a ele mais tarde.

Abra o Python 3 em Menu> Programação> Python 3 (IDLE) . Este programa fornece uma maneira de executar comandos Python e escrever programas.

Agora você pode digitar seus comandos Python aqui, mas isso não é muito prático. Vamos para Arquivo> Novo Arquivo e então Arquivo> Salvar e salve-o na pasta que você criou anteriormente. ( Documentos> Minecraft ) Vamos chamá-lo ' hello_world.py '. Você não precisa usar a extensão .py, ela será adicionada automaticamente, mas é uma boa prática.

Se você voltar para o terminal e navegar até a pasta do Minecraft, deverá ver o arquivo que acabou de criar:

cd Minecraft/
ls

Você pode executar este arquivo assim:

python hello_world

Observe como 'python' está todo em minúsculas. Isso deve ser antes do nome do arquivo, pois informa ao Pi que o arquivo a seguir é Python, portanto, deve ser executado como tal.

Volte para o editor Python e digite:

print 'Hello, World!'

Salve este arquivo e execute-o novamente - agora você deve ver 'Hello, World!' aparecer na linha de comando - legal! O comando print simplesmente diz ao Python para produzir o seguinte texto entre aspas duplas. Isso é bom, mas não muito útil para o Minecraft, vamos vinculá-lo:

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

Agora, se você salvar e executar esse arquivo, verá 'Hello, World!' aparecem no jogo Minecraft. Vamos analisar o código:

from mcpi.minecraft import Minecraft

Esta linha diz ao Python que você deseja usar o código de outro arquivo. Este arquivo mcpi.minecraft foi desenvolvido para permitir fácil controle do Minecraft.

mc = Minecraft.create()

Esta linha cria um objeto chamado 'mc' (Minecraft). Você tem que criar isso para permitir a comunicação com o jogo Minecraft - não é suficiente apenas incluir o arquivo.

mc.postToChat('Hello, World!')

Finalmente, esta linha diz ao Minecraft para escrever algum texto no chat. Tente mudar 'Hello, World!' para outra coisa e veja o que acontece, mas lembre-se de incluir as aspas duplas. Se você está tendo problemas de software, estes são alguns erros comuns do Python e do Minecraft Pi:

  • AttributeError - é um erro de digitação, como pint ou prnt em vez de imprimir
  • NameError: o nome 'Minecraft' não está definido - lembre-se de importar os módulos que você precisa
  • NameError: o nome 'true' não está definido - Python diferencia maiúsculas de minúsculas, mude para 'True'
  • socket.error: [Errno 111] Conexão recusada - certifique-se de que o Minecraft esteja rodando

Projetos

Agora que você conhece os fundamentos do Python e do Minecraft, vamos fazer alguns projetos interessantes. Todos os codecs podem ser baixados do Github.

Construtor de ponte automatizado

Este programa irá efetivamente construir uma ponte sobre a água. Quando o jogador se aproxima de um corpo d'água, o programa converte vários blocos em pedra. Como o Minecraft usa um sistema de coordenadas, é muito fácil obter a localização do jogador, junto com os tipos de blocos ao redor do jogador. O Minecraft Pi é ligeiramente limitado, por isso não é possível atualizar vários blocos diferentes em massa. Você mesmo pode codificar facilmente esse comportamento.

Crie um novo arquivo ( Arquivo> Novo Arquivo ) e salve-o como ' 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)

Observe como o valor de y está realmente olhando para y - 1. Este é o nível do piso. Se o valor de y fosse usado, o script procuraria blocos mais ou menos no nível do joelho - não funcionaria muito bem! Mc.getBlock () retorna o id de um bloco para as coordenadas fornecidas. Como x, y e z são as coordenadas do jogador, você pode adicionar ou subtrair delas para obter posições em torno do jogador. Você não precisa usar os valores x, y e z, você pode usar qualquer número, no entanto, você pode não saber como aquele bloco específico se relaciona com o jogador - é melhor usar valores relativos ao jogador. Execute este arquivo a partir da linha de comando e veja o que acontece.

Você deve ver que uma pequena área de solo se transforma em pedra quando o jogador atinge um corpo de água. Não é ótimo - você consegue andar rápido o suficiente para causar um problema. Você pode resolver isso convertendo um volume maior de água em terra. A parte final do método mc.setBlocks () é o id do bloco. Um é o id do bloco para pedra. Você pode mudar isso para madeira, grama ou qualquer coisa. Se você quiser, pode facilmente convertê-lo em um projeto complexo - talvez uma ponte pênsil!

Botão Super Mining

Este exemplo simplificará o trabalho de mineração. Consiste em um botão físico que, quando pressionado, vai extrair 10 blocos ao cubo. Vamos começar com o botão. Semelhante aos botões do Arduino, você precisará de uma pequena quantidade de eletrônicos, os quais devem ser encontrados em um kit básico de iniciação:

  • 1 x tábua de pão
  • 1 x interruptor momentâneo
  • 1 x resistor de 220 ohms
  • Cabos de salto femininos> masculinos
  • Macho> Cabos de salto machos

Aqui está o circuito:

Conexão do botão Pi

Este resistor é chamado de resistor 'pull down'. Isso ajuda a garantir que o que o Pi pensa é o botão sendo pressionado, realmente é o botão sendo pressionado. Você não precisa usar isso, no entanto, é recomendado, pois você pode encontrar muito ruído e leituras falsas sem ele.

O botão está conectado ao pino de saída de entrada de propósito geral (GPIO) 14. Você pode usar qualquer pino GPIO, no entanto, olhe para o pinagem primeiro, porque nem todos são controláveis ​​a partir do Pi e variam ligeiramente entre os modelos.

Agora que o botão está conectado, é hora de testá-lo. Crie um novo arquivo e salve-o como ' button_test.py '. Adicione este código, salve-o e execute-o no 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

pressione Control + C para parar o script. Se tudo estiver funcionando corretamente, você deverá ver 'BUTTON WORKS!' no Terminal. Observe como, como o módulo Minecraft, este teste está usando o RPi.GPIO e os módulos de tempo. Isso permite que o Pi acesse os pinos de hardware e fornece funções de temporização úteis.

Agora vamos terminar o resto do código. Crie um novo arquivo chamado ' super_mine.py '. Aqui está o código:

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 as coordenadas atuais do jogador, que são armazenadas em x, y e z. o setBlocks () método diz ao Minecraft para preencher todos os blocos entre o início e o fim com o bloco seguinte. Zero é o id do bloco para o ar. Você pode alterar isso para outro id de bloco para preencher uma área sólida. Você também pode alterar as coordenadas para +100 ou até +1000 blocos, no entanto, o Pi pode começar a ter problemas se você ficar muito louco. Observe como y + 10 é o mesmo para ambas as linhas. Você pode alterar isso para y-10 se quiser remover blocos subterrâneos.

Teletransporte

Outro uso simples para este botão pode ser 'teletransportar'. O Minecraft Pi Api fornece uma maneira de definir a posição do jogador. O código a seguir irá 'teletransportar' o jogador para um local predefinido:

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

Observe que seu método aceita três parâmetros; x, y e z - então você pode definir qualquer coisa para teletransportar instantaneamente o jogador para aquele local.

Crie uma cópia do arquivo super_mine ( Arquivo> Salvar cópia como ) e modifique-o substituindo o if pelo seguinte:

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

Este arquivo agora deve ter a seguinte aparência:

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

Salvar como ' teleport.py ' e corra.

Você pode descobrir que o jogador fica preso dentro de alguns blocos ao usar isso, caso em que você precisará ajustar as coordenadas para um espaço aberto conhecido (o canto superior esquerdo da tela mostra sua localização atual).

Construir uma casa

Uma última tarefa para este botão é construir uma casa. Muito parecido com o exemplo de mineração rápida acima, isso simplesmente substituirá os blocos ao redor do jogador para fazer uma casa. Ids de bloco diferentes serão usados ​​para materiais diferentes (janela, paredes, etc.). Para tornar as coisas mais fáceis de codificar, um bloco sólido será criado e, em seguida, o interior removido (coloque o bloco no ar), isso criará uma casca oca. Você poderia adicionar extras como uma cama ou porta, no entanto, o projeto do Minecraft Pi está um pouco incompleto e, embora esses objetos funcionem quando colocados pelo jogador, eles não são brilhantes ao usar 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

Salvar como ' house.py ' e corra. Se tudo correr bem, você deverá ver uma pequena casa aparecer (talvez seja necessário dar meia volta para encontrá-la). É muito simples, uma abertura e algumas janelas. Em teoria, não há limite para o tamanho de um edifício que você pode construir.

Faça um mini-jogo

A seguir, vamos fazer um minijogo! Isso será muito simples, quando o jogador pisar em um bloco de areia, ele se transformará em lava após um período de tempo aleatório. Este é um bom jogo para fazer, já que você pode criar seus próprios níveis ou modificá-los para tornar as coisas mais difíceis. Você não precisará do botão para este exemplo.

Crie um novo arquivo e salve-o como ' mini_game.py '. Aqui está o código:

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

Este código é um bom começo no aleatória() função: random.uniform (0,1, 2,5) irá gerar um número aleatório entre 0,1 (1/10 de segundo) e 2,5 (2 1/2 segundos). Aumentar esses números tornará o jogo mais fácil.

Experimente! Fique em cima de um bloco de areia e ele logo se transformará em lava. Essa pode ser a base de um jogo mais complexo.

Faça um outro mini-jogo

A premissa para este jogo é simples - não fique de pé no chão de madeira quando o tempo acabar. O jogador é teletransportado para uma 'arena'. Eles são forçados a ficar parados até que o jogo comece. Uma vez iniciado, o chão se transformará em água assim que o tempo acabar. O jogador deve estar na zona de segurança (blocos de diamante) para sobreviver. Cada nível reduz o cronômetro em um segundo. Após cada nível bem-sucedido, a área segura fica maior. Confira o código abaixo:

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

Salvar como ' mini_game_2.py 'e dê uma corrida.

O Pi 2 tem alguns problemas de desempenho durante a execução do Minecraft. O gráfico de uso da Unidade Central de Processamento (CPU) ( canto superior direito ) nunca mostra nenhuma carga pesada, então isso deve ser resultado de um design e otimizações pobres por parte dos desenvolvedores. Esses problemas não estão relacionados ao código em execução (já que continuam quando o Python não está em execução), no entanto, são agravados por este minijogo. Se o seu Pi estiver realmente com problemas, você pode reduzir o tamanho da arena ou fazer um overclock do seu Pi.

sites de streaming grátis sem inscrição

Detector de Diamante

Vamos fazer outro circuito. Isso usará um diodo emissor de luz (LED) para acender quando houver diamantes embaixo (dentro de 15 blocos). Aqui está o que você precisa:

  • 1 x tábua de pão
  • 1 x LED
  • 1 x resistor de 220 ohms
  • Cabos de salto femininos> masculinos
  • Macho> Cabos de salto machos

Aqui está o circuito:

Conecte o ânodo (perna longa) ao pino GPIO 14. Este pino atua como + 5v. Conecte o cátodo (perna curta) ao aterramento.

Usei um brinquedo de minério barato e o modifiquei removendo a tampa traseira e os componentes eletrônicos, então coloquei um LED embaixo dele. Você poderia facilmente tornar isso permanente com cola quente ou algo semelhante.

Salve este código como ' 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

Quando houver um bloco de minério de diamante embaixo do jogador (dentro de 15 blocos), a luz piscará.

Minecraft ThinkGeek Minecraft Light-Up Blue Stone Diamond Ore - Certifique-se de manter os Pigmen longe COMPRE AGORA NA AMAZON

Você fez algo legal com o Minecraft Pi? Deixe-me saber nos comentários o que você fez ou quão longe você fez nos jogos.

Esperamos que goste dos itens que recomendamos e discutimos! A MUO tem afiliados e parcerias patrocinadas, por isso recebemos uma parte da receita de algumas de suas compras. Isso não afetará o preço que você paga e nos ajuda a oferecer as melhores recomendações de produtos.

Compartilhado Compartilhado Tweet O email Vale a pena atualizar para o Windows 11?

O Windows foi redesenhado. Mas isso é suficiente para convencê-lo a mudar do Windows 10 para o Windows 11?

Leia a seguir
Tópicos relacionados
  • faça você mesmo
  • Programação
  • Minecraft
  • Raspberry Pi
  • Eletrônicos
  • Pitão
Sobre o autor Joe Coburn(136 artigos publicados)

Joe é graduado em Ciência da Computação pela University of Lincoln, no Reino Unido. Ele é um desenvolvedor de software profissional e, quando não está pilotando drones ou escrevendo música, pode ser encontrado tirando fotos ou produzindo vídeos.

Mais de Joe Coburn

Assine a nossa newsletter

Junte-se ao nosso boletim informativo para dicas de tecnologia, análises, e-books grátis e ofertas exclusivas!

Clique aqui para se inscrever