Diy

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

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

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

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

Новое в Minecraft? Не волнуйтесь — вот наше Руководство для начинающих Minecraft Руководство для начинающих

Введение в 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!» В командной строке — аккуратно! Команда печати просто говорит 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 блоков, однако Пи может начать бороться, если вы слишком взбесились. Обратите внимание, что у + 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 () : random.uniform (0,1, 2,5) будет генерировать случайное число в диапазоне от 0,1 (1/10-я секунда) до 2,5 (2 1/2 секунда). Увеличение этих чисел сделает игру проще.

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

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

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 блоков), индикатор будет мигать.

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

Похожие посты
Diy

Вещи, которые вы должны иметь в виду, прежде чем брать ноутбук или смартфон в службу технической поддержки

Diy

Как использовать Arduino для съемки красивой скоростной фотографии

DiyLinux

Пять великолепных расширений Raspberry Pi, которые делают его еще более полезным

Diy

Первые шаги с Arduino: пристальный взгляд на печатную плату и структуру программы