Começar com o Minecraft
O Minecraft é um jogo de mundo aberto onde existe uma versão gratuita para Raspberry Pi que inclui uma interface de programação. Isto significa que podes escrever comandos e programas em código Python para construir coisas no jogo automáticamente. É um modo muito bom para aprenderes Python!
Objetivos
Ao percorreres este desafio vais aprender:
- Como aceder ao Minecraft e a criar um novo mundo
- Como usar o ambiente de desenvolvimento do Python para ligar ao Minecraft
- Como controlar o mundo do Minecraft com a API do Python
- Como usar variáveis para guardar IDs para diferentes tipos de blocos
- Experimentar com a colocação de diferentes tipos de blocos com atributos especiais
Duração da atividade: 90 minutos
.
Material
Nome | Quantidade | Preço |
---|---|---|
Raspberry Pi | 1 | 35€ |
Correr o Minecraft
Para correr o Minecraft, abre-o a partir do menu no ambiente de trabalho, ou escreve minecraft-pi
no terminal.
Quando o Minecraft Pi estiver carregado, clica em Start Game
(Iniciar Jogo), seguido de Create New
(Criar Novo).
Encontras-te agora num jogo do Minecraft! Podes caminhar, e construir coisas!
Usa o rato para olhares à tua volta e usa a teclas seguintes no teu teclado:
Tecla | Ação |
---|---|
W | Para a frente |
A | Para a esquerda |
S | Para trás |
D | Para a direita |
E | Inventário |
Espaço | Saltar |
Duplo Espaço (Rápido) | Voar/Cair |
Esc | Pausa/Menu de Jogo |
Tab | Soltar a Seta do Rato |
Podes selecionar um item do painel rápido com: a roda do rato, usar os número no teu teclado, ou a tecla E
e selecionar algo do teu inventário.
Podes ainda fazer um duplo Espaço
para voar. Irás parar de voar quando soltares a tecla Espaço e se fizeres novamente duplo Espaço
cais em direção ao chão.
Com a espada na mão, podes clicar nos blocos à tua frente para os remover (ou para escavar). Com um bloco na tua mão, podes usar o clique direito
do rato para colocar esse bloco à tua frente, ou o clique esquerdo
do rato para o remover.
Usar a Interface de Programação em Python
Com o Minecraft a correr, e o mundo criado, clica em Tab
para que possas mover o rato para fora da janela do Minecraft. Abre o Python 3
a partir do menu de aplicacões no ambiente de trabalho e coloca as janelas lado a lado.
Podes escrever comandos diretamente na janela do Python ou criar um ficheiro para que possas guardar e correr o teu código numa outra vez.
Se quiseres criar um ficheiro, vai a File > New File
(Novo Ficheiro) e File > Save
(Guardar). Guarda numa pasta à tua escolha.
Começa por importar a biblioteca do Minecraft, o que irá criar uma ligação do Python ao jogo, podes testá-la com a mensagem Olá Mundo
no ecrâ.
from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.postToChat("Olá Mundo")
Se estiveres a a escrever diretamente na janela do Python carrega no Enter
no final de cada linha.
Se estiveres a guardar num ficheiro, guarda com CTR + S
e corre com F5
. Quando o teu código correr irás ver uma mensagem na janela do jogo.
Encontrar a tua localização
Para encontrares a tua localização, escreve:
pos = mc.player.getPos()
pos
contém a tua localização. Podes aceder a cada componente das coordenadas com pos.x
,pos.y
e pos.z
.
Alternativamente, podes guardar as compoenentes em variáveis separadas tirando partido da técnica de desempacotagem do Python:
x, y, z = mc.player.getPos()
Agora x
,y
e z
contêm cada parte da posição das tuas coordenadas. x
e z
são as direções de caminhada (para trás/frente e esquerda/direita) e o y
é cima/baixo.
Nota que getPos()
devolve a localização do jogador naquela altura e se mexeres a posição tens que chamar novamente a função ou usar a localização guardada.
Teletransportar
Podes também especificar uma localização para te teletransportares para ela.
x, y, z = mc.player.getPos()
mc.player.setPos(x, y+100, z)
Isto fará com que o jogador se teletransporte para 100 espaços no ar. O que significa que irás teletransportar-te para o meio do céu e começarás a cair para onde começaste.
Tenta teletransportar-te para outro local!
Definir blocos
Podes colocar um bloco num sítio específico com mc.setBlock()
:
x, y, z = mc.player.getPos()
mc.setBlock(x+1, y, z, 1)
Agora uma pedra vai aparecer ao teu lado, ou mesmo à tua frente (roda a vista com o rato para o encontares)!
Os argumentos passados para set block
são x
, y
, z
e id
. O (x,y,z)
corresponde à tua posição no mundo (nós especificamos um bloco de distância a partir de onde se encontra o jogador com x+1
) e o id
corresponde ao tipo de bloco que quisemos colocar, neste caso 1
é pedra.
Outros blocos que podes experimentar:
Air: 0
Grass: 2
Dirt: 3
Agora com o bloco em vista, tenta altera-lo para algo diferente:
mc.setBlock(x+1, y, z, 2)
Deverás ver o bloco cinzento mudar mesmo à tua frente!
Constantes dos Blocos
Podes usar as constantes de blocos imbutidas, se souberes o nome delas.
Vais precisar de outra linha de import
primeiro.
from mcpi import block
Agora podes escrever o seguinte para criares um bloco de pedra (STONE
):
mc.setBlock(x+3, y, z, block.STONE.id)
Os IDs (identificadores) são bastante fáceis de adivinhar, usa letras maiúsculas sempre, ficam aqui alguns exemplos:
IDs | Tradução |
---|---|
WOOD_PLANKS | Madeira |
WATER_STATIONARY | Água |
GOLD_ORE | Minério de Ouro |
GOLD_BLOCK | Bloco de Ouro |
DIAMOND_BLOCK | Bloco de Diamante |
NETHER_REACTOR_CORE | Núcleo do Neather Reactor |
Blocos como variáveis
Se souberes o ID de um bloco pode ser útil defini-lo como variável. Podes usar o nome ou número inteiro do id.
# Nome -> DIRT
dirt = block.DIRT.id
mc.setBlock(x, y, z, dirt)
# OU
# Id -> 3
dirt = 3
mc.setBlock(x, y, z, dirt)
Blocos especiais
Existem alguns blocos que possuem propriedades extra, como a lã (wool
) que tem uma propriedade extra onde podes especificar a cor.
Para usares este parâmetro edita o teu setBlock
do seguinte modo:
wool = 35
mc.setBlock(x, y, z, wool, 1)
Aqui o quarto parâmetro 1
define a cor como laranja. Sem o quarto parâmetro assume o valor pré-definido (0
) que é branco. Mais algumas cores:
ID | Cor |
---|---|
0 | Branco |
1 | Laranja |
2 | Magenta |
3 | Azul claro |
4 | Amarelo |
Experimenta mais alguns número para veres as cores do bloco alterarem-se!
Outros blocos que também possuem propriedades extra são: a madeira (wood
), a erva (tall grass
), a chama (torch
). Podes consultar mais na API do Minecraft.
Definir blocos múltiplos
Tal como defines um único bloco com o setBlock
, também podes definir vários de uma só vez com o setBlocks
:
# Isto vai criar um bloco de 10x10x10 de pedra
stone = 1
x, y, z = mc.player.getPos()
mc.setBlocks(x+1, y+1, z+1, x+11, y+11, z+11, stone)
Podes criar volumes maiores com o setBlocks
mas poderá demorar mais tempo a ser gerado.
Deixar cair blocos enquanto andas
Agora que já sabes criar blocos, vamos usar a nossa localização em movimento para ir deixando um rasto de blocos enquanto caminhamos.
from mcpi.minecraft import Minecraft
from time import sleep
mc = Minecraft.create()
# O código seguinte irá deixar uma flor atrás do jogador enquanto caminhas
flower = 38
while True:
x, y, z = mc.player.getPos()
mc.setBlock(x, y, z, flower)
sleep(0.1)
Agora caminha um pouco e vira-te para trás para veres as flores no teu caminho.
Como usamos um ciclo while True
(enquanto Verdadeiro) este ciclo nunca irá terminar.
Para o parar pressiona CTRL + C
na janela do Python para interromper.
Experimenta voar e vê as flores que deixas no céu.
E se quiséssemos que apenas deixar cair flores quando estivéssemos a andar em erva? Podemos usar o getBlock
para descobrir que tipo de bloco é.
# A posição em que o jogador se encontra (x,y,z)
x, y, z = mc.player.getPos()
# O identificador do bloco
this_block = mc.getBlock(x, y, z)
# Imprime o Id do bloco
print(this_block)
Isto diz a localização do bloco que o jogador está, se for 0
é porque o jogador encontra-se no ar.
Como queremos saber em que bloco estamos mesmo a pisar, subtraímos 1
ao valor do y
e usamos o getBlock()
para determinar que tipo de bloco estamos a pisar mesmo.
# A posição em que o jogador se encontra (x,y,z)
x, y, z = mc.player.getPos()
# O identificador do bloco
this_block = mc.getBlock(x, y-1, z)
# Imprime o Id do bloco
print(this_block)
Isto diz a localização do bloco que o jogador está a pisar. Podes testar isto se criares um ciclo que vai imprimindo o ID do bloco enquanto vais caminhando.
while True:
x, y, z = mc.player.getPos()
block_beneath = mc.getBlock(x, y-1, z)
print(block_beneath)
Podemos usar um condicional if
para escolher se plantamos, ou não, uma flor.
grass = 2
flower = 38
while True:
x, y, z = mc.player.getPos() # player position (x, y, z)
block_beneath = mc.getBlock(x, y-1, z) # block ID
# Se o bloco que estás a pisar é erva
if block_beneath == grass:
# Então cria uma flor
mc.setBlock(x, y, z, flower)
sleep(0.1)
Talvez de seguida podemos alterar o cubo que estamos a pisar em erva, se já não for erva.
# Se o bloco que estás a pisar é erva
if block_beneath == grass:
# Então cria uma flor
mc.setBlock(x, y, z, flower)
# Caso contrário
else:
# Transforma o bloco em erva
mc.setBlock(x, y-1, z, grass)
Agora podemos andar e se estivermos a pisar erva, deixamos uma flor. Se o próximo bloco não for erva, ele vai ser transformado em erva. Quando nos virarmos e voltarmos a esse bloco, vamos deixar lá uma flor.
Brincar com blocos de TNT
Outro bloco interessante é o TNT! Para criarmos um bloco de TNT usamos:
tnt = 46
mc.setBlock(x, y, z, tnt)
No entanto este bloco de TNT é algo aborrecido. Tenta definir data
como 1
:
tnt = 46
mc.setBlock(x, y, z, tnt, 1)
Agora usa a tua espada e faz clique esquerdo
no bloco de TNT: ele vai ficar ativo e explodir numa questão de segundos!
Agora tenta construir um bloco gigante de TNT!
tnt = 46
mc.setBlocks(x+1, y+1, z+1, x+11, y+11, z+11, tnt, 1)
Agora vais ver um bloco gigante de TNT. Vai lá e ativa um dos blocos, não te esqueças de fujir e apreciar o espetáculo! Pode ser um pouco lento por termos muita informação para processar.
Diversão com lava a fluir
Um bloco que é bastante divertido de brincar é a lava que flui.
from mcpi.minecraft import Minecraft
mc = Minecraft.create()
x, y, z = mc.player.getPos()
lava = 10
mc.setBlock(x+3, y+3, z, lava)
Encontra o bloco que acabaste de criar e deverás ver lava a fluir do bloco para o chão.
A parte interessante da lava é que quando arrefece torna-se pedra. Move-te para outra localização do mundo e experimenta o seguinte:
from mcpi.minecraft import Minecraft
from time import sleep
mc = Minecraft.create()
x, y, z = mc.player.getPos()
lava = 10
water = 8
air = 0
mc.setBlock(x+3, y+3, z, lava)
sleep(20)
mc.setBlock(x+3,y+5, z, water)
sleep(4)
mc.setBlock(x+3, y+5, z, air)
Podes ajustar o sleep
(esperar) para deixar mais, ou menos, lava fluir.
E agora?
Há muita coisa que podes explorar no Minecraft ainda por cima agora já sabes usar o Python para criares os teus mundos mais depressa!
Podes criar um jogo em rede com os teus colegas, de modo a poderem todos ver-se no mesmo mundo. Basta para isso que se liguem todos os Raspberry Pis na mesma rede.
Para saberes mais sobre as opções de programação do Minecraft podes consultar stuffaboutcode.com.
Referências: