Научете 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 файл или програма, компютърът първо трябва да свърши малка работа с файла. Недостатъците са, че той може да се счита за бавен в сравнение с компилираните езици [Прекъснат прекъснат URL].



Предимствата на интерпретираните езици са бързината на кодиране и тяхната дружелюбност. Не е нужно да казвате на компютъра Какво данни, които искате да съхранявате, само че искате да съхранявате нещо и компютърът ще разбере какво да прави. Има изключения, разбира се, и това е донякъде опростен изглед, но програмирането трябва да е забавно! Ако започнете да копаете в сложните технически подробности, това може да стане малко трудоемко.

Python е чувствителен към регистър. Това е важно да се знае, тъй като Python няма да разпознава обекти дори да са написани правилно ако случаят е грешен. „Dosomething ()“ няма да работи, ако методът всъщност се нарича „DoSomething ()“. Python също използва отстъп . Други езици за програмиране може да не се интересуват колко отстъпки има вашият код, докато Python прави грижи. Отстъпите се използват, за да кажат на Python къде принадлежи кодът. Други езици могат да използват „Curly Braces“ ({}) за групиране на код - 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 тук, но това не е много практично. Отидете на Файл> Нов файл и тогава Файл> Запазване и запишете това в папката, която сте създали по -рано. ( Документи> Minecraft ). Нека го наречем ' hello_world.py '. Не е необходимо да използвате разширението .py, това ще бъде добавено автоматично, но това е добра практика.

Ако преминете обратно към терминала и отидете в папката Minecraft, трябва да видите файла, който току -що създадохте:

cd Minecraft/
ls

Можете да стартирате този файл по следния начин:

python hello_world

Забележете как 'python' е с малки букви. Това трябва да е преди името на файла, тъй като казва на Pi, че следният файл е Python, така че трябва да се изпълни като такъв.

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

print 'Hello, World!'

Запазете този файл и го стартирайте отново - сега трябва да видите „Здравей, Свят!“ се появяват в командния ред - чист! Командата за печат просто казва на Python да изведе следния текст в двойни кавички. Това е добре, но не е много полезно за Minecraft, нека го свържем:

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

Сега, ако запишете и стартирате този файл, трябва да видите „Здравей, Свят!“ се появяват в играта Minecraft. Нека разбием кода:

from mcpi.minecraft import Minecraft

Този ред казва на Python, че искате да използвате код от друг файл. Този файл mcpi.minecraft е разработен, за да позволи лесно управление на Minecraft.

mc = Minecraft.create()

Този ред създава обект, наречен „mc“ (Minecraft). Трябва да създадете това, за да позволите комуникация с играта Minecraft - не е достатъчно само да включите файла.

mc.postToChat('Hello, World!')

И накрая, този ред казва на Minecraft да напише текст в чата. Опитайте да промените „Здравей, свят!“ към нещо друго и вижте какво ще се случи, но не забравяйте да включите и двете двойни кавички. Ако имате софтуерни проблеми, това са някои често срещани грешки на 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 () е идентификаторът на блока. Единият е идентификатор на блока за камък. Можете да промените това на дърво, трева или нещо друго. Ако искате, лесно бихте могли да го преобразите в сложен дизайн - може би висящ мост!

Бутон Super Mining

Този пример ще направи кратка работа на добив. Състои се от физически бутон, който при натискане ще копае 10 блока. Нека започнем с бутона. Подобно на бутоните на Arduino, ще ви трябва малко количество електроника, всички от които трябва да се намерят в основен стартов комплект:

  • 1 x Платка
  • 1 х моментен превключвател
  • 1 x 220 ома резистор
  • Женски> мъжки кабели за прескачане
  • Мъжки> Мъжки кабели за прескачане

Ето схемата:

Pi-Button-Connection

Този резистор се нарича 'резистор за изтегляне'. Това помага да се гарантира, че това, което Pi мисли, че бутонът е натиснат, наистина е бутонът е натиснат. Не е нужно да използвате това, но се препоръчва, тъй като може да откриете много шум и фалшиви показания без него.

Бутонът е свързан към щифт 14. Общоцелев входен изход (GPIO) 14. Можете да използвате всеки GPIO щифт, но погледнете pinout първо, тъй като не всички те могат да се контролират от 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. The setBlocks () метод казва на Minecraft да запълни всички блокове между началото и края със следния блок. Нулата е блок-идентификатор за въздух. Можете да промените това на друг идентификатор на блок, за да запълните област. Можете също да промените координатите на +100 или дори +1000 блока, но Pi може да започне да се бори, ако полудеете твърде много. Забележете как y + 10 е едно и също за двете линии. Можете да промените това на y - 10, ако искате да премахнете блокове под земята.

Телепортиране

Друга проста употреба на този бутон може да бъде „телепортиране“. Minecraft Pi Api предоставя начин да зададете позицията на играча. Следният код ще 'телепортира' плейъра на предварително зададено място:

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

Обърнете внимание, че неговият метод приема три параметъра; x, y и z - за да можете да ги настроите на всичко, за да телепортирате моментално плейъра до това място.

Създайте копие на файла super_mine ( File> Save Copy As ) и го променете, като замените 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. Графика за използване на централния процесор (CPU) ( горния десен ъгъл ) никога не показва голямо натоварване, така че това трябва да се дължи на лош дизайн и оптимизации от страна на разработчиците. Тези проблеми не са свързани с изпълнението на кода (тъй като продължават, когато Python не работи), но се усложняват от тази мини игра. Ако вашият Pi наистина се затруднява, може да искате да намалите размера на арената или да овърклокнете Pi.

кое приложение за доставка плаща най -много

Диамантен детектор

Нека направим друга верига. Това ще използва светодиод (LED), за да светне, когато отдолу има диаманти (в рамките на 15 блока). Ето какво ви трябва:

  • 1 x Платка
  • 1 x LED
  • 1 x 220 ома резистор
  • Женски> мъжки кабели за прескачане
  • Мъжки> Мъжки кабели за прескачане

Ето схемата:

Свържете анода (дълъг крак) към GPIO Pin 14. Този щифт действа като +5v. Свържете катода (къс крак) към земята.

Използвах евтина играчка от руда и я модифицирах, като премахнах задния капак и електрониката, след което поставих светодиод под нея. Можете лесно да направите това постоянно с горещо лепило или нещо подобно.

Запазете този код като „ 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 е преработен. Но достатъчно ли е това, за да ви убеди да преминете от Windows 10 към Windows 11?

Прочетете Напред
Свързани теми
  • Направи си сам
  • Програмиране
  • Minecraft
  • Малина Пи
  • Електроника
  • Python
За автора Джо Кобърн(136 статии са публикувани)

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

Още от Джо Кобърн

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате