Изучите Python и электронику с Minecraft Pi Edition

Изучите Python и электронику с Minecraft Pi Edition

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





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





Впервые в Minecraft? Не волнуйтесь - вот наша Руководство для начинающих Minecraft .





Введение в Minecraft Pi

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

Что такое Python?

Python это язык программирования. это интерпретированный , что означает, что когда вы запускаете файл или программу Python, компьютер должен сначала немного поработать с файлом. Недостатком является то, что его можно считать медленным по сравнению с компилируемыми языками [Broken URL Removed].



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

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





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

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

Предоставление вашего Пи уже установка и запуск 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, что означает рабочий каталог печати:

pwd

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

Откройте 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!' появиться в командной строке - аккуратно! Команда печати просто указывает 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 использует систему координат, очень легко получить местоположение игрока, а также тип блоков вокруг игрока. 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 () - это идентификатор блока. Один - это идентификатор блока для камня. Вы можете изменить это на дерево, траву или что-нибудь еще. Если бы вы захотели, вы могли бы довольно легко преобразовать это в сложную конструкцию - может быть, в подвесной мост!

Кнопка супер майнинга

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

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

Вот схема:

Pi-кнопка-подключение

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

Кнопка подключена к контакту 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

Нажмите Ctrl + C чтобы остановить сценарий. Если все работает правильно, вы должны увидеть «КНОПКА РАБОТАЕТ!» в Терминале. Обратите внимание, как в этом тесте, как и в модуле Minecraft, используются модули RPi.GPIO и time. Это позволяет 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 блоков, однако Pi может начать бороться, если вы слишком сойдете с ума. Обратите внимание, что y + 10 одинаково для обеих линий. Вы можете изменить это на y - 10, если хотите убрать блоки под землей.

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

Еще одно простое использование этой кнопки - «телепортироваться». 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 немного неполон, и хотя эти объекты работают при размещении игроком, они не являются блестящими при использовании 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 'и беги. Если все в порядке, вы должны увидеть небольшой домик (возможно, вам придется повернуться, чтобы найти его). Все очень просто, проем и несколько окон. Теоретически нет предела тому, насколько большое или сложное здание вы можете построить.

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

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

Создайте новый файл и сохраните его как ' 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.uniform (0,1, 2,5) будет генерировать случайное число от 0,1 (1/10 секунды) до 2,5 (2 1/2 секунды). Увеличение этих чисел облегчит игру.

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

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

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

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 не запущен), однако они усугубляются этой мини-игрой. Если ваш Pi действительно борется, вы можете уменьшить размер арены или разогнать свой Pi.

что значит подключение без интернета

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

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

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

Вот схема:

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

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

Сохраните этот код как ' 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 Blue Stone Diamond Ore - обязательно держите подальше от свиней КУПИТЬ СЕЙЧАС НА AMAZON

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

Мы надеемся, что вам понравятся предметы, которые мы рекомендуем и обсуждаем! MUO имеет партнерские и спонсируемые партнерства, поэтому мы получаем долю дохода от некоторых ваших покупок. Это не повлияет на цену, которую вы платите, и поможет нам предложить лучшие рекомендации по продуктам.

Делиться Делиться Твитнуть Эл. адрес Стоит ли переходить на Windows 11?

Окна были переработаны. Но достаточно ли этого, чтобы убедить вас перейти с Windows 10 на Windows 11?

Читать далее
Похожие темы
  • Сделай сам
  • Программирование
  • Шахтерское ремесло
  • Raspberry Pi
  • Электроника
  • Python
Об авторе Джо Кобурн(136 опубликованных статей)

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

Ещё от Joe Coburn

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!

Нажмите здесь, чтобы подписаться