Узнайте Python и электронику с Minecraft Pi Edition

Вы всегда хотели научиться кодировать, но не знали, с чего начать? Узнайте, как управлять Minecraft на Raspberry Pi, используя Python и простую электронику. Вот конечный результат:

Для этого проекта вам понадобится Pi 2 или новее, и хотя большинство из этих задач вы могли бы выполнить через командную строку через Secure Shell (SSH), в этом руководстве основное внимание будет уделено кодированию непосредственно на Pi.

.

Введение в Minecraft Pi

Minecraft-Pi-меню

Minecraft для Raspberry Pi был разработан для обучения и мастеринга (и это бесплатно). Он поставляется с интерфейсом прикладного программирования (API), который позволяет легко общаться с Minecraft. Это великолепно для обучения кодированию на Python, а также для начала работы с электроникой

,

Что такое Python?

Python — это язык программирования. Это интерпретируется, что означает, что когда вы запускаете файл или программу Python, компьютер должен сначала выполнить небольшую работу с файлом. Недостатком является то, что его можно считать медленным по сравнению с компилируемыми языками.

Преимуществами интерпретируемых языков являются скорость кодирования и их удобство. Вам не нужно сообщать компьютеру, какие данные вы хотите сохранить, просто вы хотите что-то сохранить, и компьютер определит, что делать. Конечно, есть исключения, и это несколько упрощенное представление, однако программирование должно быть веселым! Если вы начнете копаться в сложных технических деталях, это может стать немного трудоемким.

Python чувствителен к регистру. Это важно знать, так как Python не будет распознавать объекты, даже если они написаны правильно, если дело обстоит неправильно. «Dosomething ()» не будет работать, если метод на самом деле называется «DoSomething ()». Python также использует отступ. Другие языки программирования могут не заботиться о том, сколько отступов в вашем коде, тогда как Python все равно. Отступы используются, чтобы указать Python, где находится код. Другие языки могут использовать «фигурные скобки» ({}) для группировки кода — Python не использует их. Python использует хеш (#) для комментариев, а комментарии используются, чтобы сообщать другим разработчикам или людям, которые смотрят на код, что делает конкретная часть или зачем она нужна. Python игнорирует что-либо после хэша.

Наконец, есть две основные версии Python — Python 2.7.x и Python 3.x. Есть некоторые различия между этими двумя (каковы различия?). Этот урок будет использовать Python 3.

Начальная настройка

Если ваш Pi уже настроен и работает Raspbian

нет необходимости в начальной настройке.

Открытый терминал (Меню> Аксессуары> Терминал) и выполните эту команду. Всегда рекомендуется регулярно обновлять список репозиториев, при этом будет загружен последний список программ (он не будет загружать сами программы, это поможет Pi узнать, какие программы называются и где их искать).

sudo apt-get update

Теперь обновите Pi (это может занять некоторое время):

sudo apt-get upgrade

Python и Minecraft Pi уже установлены, однако, если Minecraft Pi не установлен по какой-либо причине, его легко установить

:

sudo apt-get install minecraft-pi

Перейдите к документам и создайте новую папку под названием «Minecraft»:

cd Documents/
mkdir Minecraft

Вы можете просмотреть содержимое этой новой папки:

ls

Вот совет — если вы начнете печатать и нажмете клавишу TAB, командная строка попытается автоматически завершить оператор для вас.

Вы можете проверить путь к текущему каталогу, используя pwd, что означает Print Working Directory:

pwd

Запустите Minecraft, перейдя в Меню> Игры> Minecraft Pi. Вам понадобится этот бег, но вы вернетесь к нему позже.

Откройте Python 3 от Меню> Программирование> Python 3 (IDLE). Эта программа позволяет вам запускать команды Python и писать программы.

Теперь вы можете набирать здесь команды Python, но это не очень удобно. Идти к Файл> Новый файл а потом Файл> Сохранить и сохраните это в папке, которую вы создали ранее. (Документы> Майнкрафт). Давайте назовем это «hello_world.py«. Вам не нужно использовать расширение .py, оно будет добавлено автоматически, но это хорошая практика.

Если вы переключитесь обратно в терминал и перейдете в папку Minecraft, вы увидите файл, который вы только что создали:

cd Minecraft/
ls

Вы можете запустить этот файл так:

python hello_world

Обратите внимание, что «python» все строчные. Это должно быть перед именем файла, так как оно сообщает Pi, что следующий файл — это Python, поэтому он должен быть выполнен как таковой.

Вернитесь в редактор Python и введите:

print "Hello, World!"

Сохраните этот файл и запустите его снова — теперь вы должны увидеть «Hello, World!» В командной строке — аккуратно! Команда print просто говорит Python выводить следующий текст в двойных кавычках. Это хорошо, но не очень полезно для Minecraft, давайте скомпонуем это:

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

Теперь, если вы сохраните и запустите этот файл, вы должны увидеть «Hello, World!» В игре Minecraft. Давайте разберем код:

from mcpi.minecraft import Minecraft

Эта строка сообщает Python, что вы хотите использовать код из другого файла. Этот файл mcpi.minecraft был разработан для простого управления Minecraft.

mc = Minecraft.create()

Эта линия создает объект под названием «mc» (Minecraft). Вы должны создать это, чтобы разрешить общение с игрой Minecraft — недостаточно просто включить файл.

mc.postToChat("Hello, World!")

Наконец, эта строка говорит Minecraft написать текст в чат. Попробуйте изменить «Hello, World!» На что-то другое и посмотрите, что произойдет, но не забудьте включить обе двойные кавычки. Если у вас проблемы с программным обеспечением, это некоторые распространенные ошибки Python и Minecraft Pi:

  • AttributeError — это опечатка, например, pint или prnt вместо print
  • NameError: имя «Minecraft» не определено — не забудьте импортировать нужные вам модули
  • NameError: имя «true» не определено — Python чувствителен к регистру, измените на «True»
  • socket.error: [Errno 111] Соединение отклонено — убедитесь, что Minecraft работает

проектов

Теперь, когда вы знакомы с основами Python и Minecraft, давайте сделаем несколько классных проектов. Весь код можно скачать с Github.

Автоматизированный мостостроитель

Minecraft-Pi-Bridge-Builder

Эта программа будет эффективно строить мост через воду. Когда игрок приближается к водоему, программа преобразует несколько блоков в камень. Поскольку Minecraft использует систему координат, очень легко определить местоположение игрока, а также тип блоков вокруг игрока. Minecraft Pi немного ограничен, поэтому невозможно обновить несколько различных блоков в большом количестве. Однако вы можете легко кодировать это поведение самостоятельно.

Создать новый файл (Файл> Новый файл) и сохраните его как «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)

Обратите внимание, как значение y на самом деле смотрит на y — 1. Это уровень пола. Если использовать значение y, скрипт будет искать блоки примерно на уровне колена — он не будет работать очень хорошо! Mc.getBlock () возвращает идентификатор блока для заданных координат. Поскольку x, y и z являются координатами игрока, вы можете сложить или вычесть их, чтобы получить позиции вокруг игрока. Вам не нужно использовать значения x, y и z, вы можете использовать любое число, однако вы можете не знать, как этот конкретный блок относится к игроку — лучше использовать значения относительно игрока. Запустите этот файл из командной строки и посмотрите, что получится.

Вы должны увидеть, что небольшой участок земли превращается в камень, когда игрок достигает водоема. Это не здорово — вы можете идти достаточно быстро, чтобы вызвать проблемы. Вы можете решить эту проблему, преобразовав больший объем воды в землю. Последняя часть метода mc.setBlocks () — это идентификатор блока. Одним из них является идентификатор блока для камня. Вы можете изменить это на дерево, траву или что-нибудь еще. Если бы вы хотели, вы могли бы довольно легко превратить это в сложную конструкцию — возможно, подвесной мост!

Супер Горная Кнопка

Minecraft-Пи-супер-Mine

Этот пример сделает короткую работу майнинга. Он состоит из физической кнопки, которая при нажатии будет добывать 10 блоков в кубе. Давайте начнем с кнопки. Подобно кнопкам на Arduino, вам понадобится небольшое количество электроники, все из которых нужно найти в базовом стартовом наборе.

:

  • 1 х макет
  • 1 х мгновенный выключатель
  • 1 х 220 Ом резистор
  • Женский> мужской кабель
  • Мужской> Мужской кабель

Вот схема:

Pi-Button-соединение

Этот резистор называется «понижающим» резистором. Это помогает убедиться, что то, что Пи думает, это нажатие кнопки, то есть нажатие кнопки. Вам не нужно использовать это, однако это рекомендуется, так как вы можете найти много шума и ложных показаний без него.

Кнопка подключена к контакту 14 входа общего назначения (GPIO). Вы можете использовать любой вывод GPIO, однако сначала посмотрите на распиновку, так как они не все управляемы с Pi и немного отличаются в разных моделях.

Теперь, когда кнопка подключена, пришло время проверить ее. Создайте новый файл и сохраните его как «button_test.py«. Добавьте этот код, сохраните его и запустите в терминале.

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

Нажмите Control + C остановить сценарий Если все работает правильно, вы должны увидеть «КНОПКА РАБОТАЕТ!» В Терминале. Обратите внимание, что, как и в модуле Minecraft, в этом тесте используются RPi.GPIO и временные модули. Они позволяют Pi получать доступ к аппаратным выводам и предоставляют полезные функции синхронизации.

Теперь давайте закончим остальную часть кода. Создать новый файл под названием «super_mine.py«. Вот код:

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 () возвращает текущие координаты игроков, которые затем сохраняются в x, y и z. setBlocks () Метод сообщает Minecraft заполнить все блоки между началом и концом следующим блоком. Ноль — это идентификатор блока для воздуха. Вы можете изменить это на другой идентификатор блока, чтобы полностью заполнить область. Вы также можете изменить координаты на +100 или даже +1000 блоков, однако Пи может начать бороться, если вы слишком взбесились. Обратите внимание, что y + 10 одинаково для обеих строк. Вы можете изменить это на y — 10, если хотите убрать блоки под землей.

телепортации

Minecraft-Pi-телепортации

Другим простым использованием этой кнопки может быть «телепортирование». Minecraft Pi Api предоставляет способ установить положение игрока. Следующий код «телепортирует» игрока в заданное место:

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

Обратите внимание, что его метод принимает три параметра; x, y и z — так что вы можете установить их на что угодно, чтобы мгновенно телепортировать игрока в это место.

Создать копию файла super_mine (Файл> Сохранить копию как) и измените его, заменив if следующим:

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

Этот файл должен теперь выглядеть так:

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

Сохранить какteleport.pyИ беги.

Вы можете обнаружить, что игрок застревает в некоторых блоках при использовании этого, и в этом случае вам нужно будет настроить координаты на известное открытое пространство (в левом верхнем углу экрана отображается ваше текущее местоположение).

Построить дом

Minecraft-Pi-House

Последнее задание для этой кнопки — построить дом. Как и в примере с быстрым майнингом, он просто заменит блоки, окружающие игрока, чтобы построить дом. Различные идентификаторы блоков будут использоваться для разных материалов (окна, стены и т. Д.). Чтобы упростить кодирование, будет создан сплошной блок, а затем внутренняя часть удалена (установите блок на воздух), это создаст полую оболочку. Вы можете добавить дополнения, такие как кровать или дверь, однако проект Minecraft Pi немного неполон, и хотя эти объекты работают, когда размещаются игроком, они не являются блестящими при использовании 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

Сохранить это как «house.pyИ беги. Все хорошо, вы должны увидеть небольшой дом (возможно, вам придется повернуться, чтобы найти его). Это очень просто, открытие и несколько окон. Теоретически, нет предела тому, насколько большое или сложное здание вы можете построить.

Сделать мини-игру

Minecraft-Pi-Лава-Game

Далее давайте сделаем мини-игру! Это будет довольно просто, когда игрок наступит на кусок песка, через некоторое время он превратится в лаву. Это хорошая игра, так как вы можете создавать свои собственные уровни или изменять их, чтобы усложнить задачу. Вам не понадобится кнопка для этого примера.

Создайте новый файл и сохраните его как «mini_game.py«. Вот код:

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

Этот код является хорошим началом случайным образом () функция: random.uiform (0.1, 2.5) сгенерирует случайное число от 0,1 (1/10 секунды) до 2,5 (2,5 секунды). Увеличение этих чисел сделает игру проще.

Попробуйте! Встаньте на кусок песка, и он вскоре превратится в лаву. Это может стать основой более сложной игры.

Сделайте еще одну мини-игру

Minecraft-Pi-Mini-Game

Суть этой игры проста — не стоять на деревянном полу, когда закончится время. Игрок телепортируется на «арену». Они вынуждены стоять на месте до начала игры. После запуска пол превратится в воду, когда закончится таймер. Игрок должен стоять в безопасной зоне (алмазные блоки), чтобы выжить. Каждый уровень уменьшает таймер на одну секунду. После каждого успешного уровня безопасная зона увеличивается. Проверьте код ниже:

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

Сохранить это как «mini_game_2.pyИ беги.

У Pi 2 есть некоторые проблемы с производительностью во время работы Minecraft. График использования центрального процессора (ЦП) (в правом верхнем углу) никогда не показывает большой нагрузки, так что это должно быть связано с плохим дизайном и оптимизацией со стороны разработчиков. Эти проблемы не связаны с запуском кода (поскольку они продолжаются, когда Python не запущен), однако они усугубляются этой мини-игрой. Если ваш пи действительно борется, вы можете уменьшить размер арены или разогнать пи

,

Алмазный детектор

Minecraft-Pi-Diamonds

Давайте сделаем еще одну схему. Это будет использовать светоизлучающий диод (LED), чтобы загораться, когда под ним есть алмазы (в пределах 15 блоков). Вот что вам нужно:

  • 1 х макет
  • 1 х светодиодный
  • 1 х 220 Ом резистор
  • Женский> мужской кабель
  • Мужской> Мужской кабель

Вот схема:

Pi-LED-соединение

Подключите анод (длинную ножку) к контакту 14 GPIO. Этот контакт работает как + 5В. Подключите катод (короткую ногу) к земле.

Я использовал дешевую рудную игрушку и модифицировал ее, сняв заднюю крышку и электронику, а затем поместил под нее светодиод. Вы можете легко сделать этот перманент горячим клеем или чем-то подобным.

Minecraft-Руда-игрушка

Сохранить этот код как «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

Когда под игроком находится блок алмазной руды (в пределах 15 блоков), индикатор будет мигать.



ThinkGeek Minecraft Light-Up Голубая каменная алмазная руда - обязательно держите подальше пигмен


ThinkGeek Minecraft Light-Up Голубая каменная алмазная руда - обязательно держите подальше пигмен
Купить сейчас на Amazon $ 29,48

Вы сделали что-нибудь классное с Minecraft Pi? Дайте мне знать в комментариях, что вы сделали или как далеко вы сделали это в играх.

Ссылка на основную публикацию
Adblock
detector