Naučte se Python a elektroniku s edicí Minecraft Pi

Naučte se Python a elektroniku s edicí Minecraft Pi

Vždy jste se chtěli naučit kódovat, ale nevěděli jste, kde začít? Naučte se ovládat Minecraft na Raspberry Pi pomocí Pythonu a jednoduché elektroniky. Zde je konečný výsledek:





Pro tento projekt budete potřebovat Pi 2 nebo novější, a přestože většinu těchto úkolů můžete dokončit pomocí příkazového řádku přes Secure Shell (SSH), tento tutoriál se zaměří na kódování přímo na Pi.





Jste v Minecraftu nováčkem? Nebojte se - tady je náš Průvodce pro začátečníky v Minecraftu .





Úvod do Minecraftu Pi

Minecraft pro Raspberry Pi byl vyvinut pro učení a vrtání (a je zdarma). Dodává se s rozhraním API (Application Programming Interface), které umožňuje kódu snadno komunikovat s Minecraft. Je skvělé naučit se kódovat v Pythonu a začít s elektronikou.

Co je Python?

Krajta je programovací jazyk. to je vykládáno , což znamená, že když spustíte soubor nebo program Python, počítač musí nejprve udělat trochu práce se souborem. Nevýhodou je, že jej lze ve srovnání s kompilovanými jazyky považovat za pomalý [Broken URL Removed].



Výhodou interpretovaných jazyků je rychlost kódování a jejich přívětivost. Nemusíte to říkat počítači co data, která chcete uložit, jen to, že chcete něco uložit, a počítač zjistí, co dělat. Existují samozřejmě výjimky, a to je poněkud zjednodušený pohled, nicméně programování by mělo být zábavné! Pokud začnete kopat do složitých technických detailů, může to být trochu pracné.

Python rozlišuje velká a malá písmena. To je důležité vědět, protože Python nerozpoznává objekty i když jsou napsány správně pokud je případ špatný. „Dosomething ()“ nebude fungovat, pokud se metoda skutečně nazývá „DoSomething ()“. Python také používá odsazení . Jiným programovacím jazykům může být jedno, kolik odsazení má váš kód, zatímco v Pythonu dělá péče. Odrážky se používají k určení Pythonu, kam kód patří. Jiné jazyky mohou ke seskupování kódu používat 'Curly Braces' ({}) - Python je nepoužívá. Python používá pro komentáře hash (#) a komentáře se používají k tomu, aby ostatním vývojářům nebo lidem při pohledu na kód řekly, co konkrétní část dělá nebo proč je to potřeba. Python po hašování cokoli ignoruje.





Nakonec existují dvě hlavní verze Pythonu - Python 2.7.x a Python 3.x. Mezi těmito dvěma existují určité rozdíly ( jaké jsou rozdíly? ). Tento tutoriál bude používat Python 3.

Počáteční nastavení

Poskytnutí vašeho Pi je již nastavení a spuštění Raspbian , není třeba mnoho úvodního nastavení.





Otevřený terminál ( Nabídka> Příslušenství> Terminál ) a spusťte tento příkaz. Vždy je vhodné udržovat seznam úložiště aktuální, a tím se stáhne nejnovější seznam programů (nebude stahovat samotné programy, to pomůže Pi vědět, jaké programy se nazývají a kde je najít).

sudo apt-get update

Nyní aktualizujte Pi (může to chvíli trvat):

sudo apt-get upgrade

Python a Minecraft Pi jsou již nainstalovány, ale pokud není Minecraft Pi z jakéhokoli důvodu nainstalován, instalace je jednoduchá:

sudo apt-get install minecraft-pi

Přejděte k dokumentům a vytvořte novou složku s názvem „Minecraft“:

cd Documents/
mkdir Minecraft

Můžete zobrazit obsah této nové složky:

ls

Zde je tip - pokud začnete psát a stisknete klávesu TAB, příkazový řádek se pokusí automaticky dokončit příkaz za vás.

Cestu k aktuálnímu adresáři můžete prozkoumat pomocí pwd, což je zkratka pro Print Working Directory:

pwd

Spusťte Minecraft tím, že přejdete na Nabídka> Hry> Minecraft Pi . Tento běh budete potřebovat, ale vrátíte se k němu později.

Otevřete Python 3 z Nabídka> Programování> Python 3 (IDLE) . Tento program poskytuje způsob, jak spouštět příkazy Pythonu a psát programy.

Nyní byste zde mohli psát příkazy Pythonu, ale to není příliš praktické. Jít do Soubor> Nový soubor a pak Soubor> Uložit a uložte jej do složky, kterou jste vytvořili dříve. ( Dokumenty> Minecraft ). Říkejme tomu ' ahoj_world.py '. Příponu .py nemusíte používat, bude přidána automaticky, ale je to dobrá praxe.

Pokud přepnete zpět na terminál a přejdete do složky Minecraft, měli byste vidět soubor, který jste právě vytvořili:

cd Minecraft/
ls

Tento soubor můžete spustit takto:

python hello_world

Všimněte si, že 'python' je malý. To musí být před názvem souboru, protože říká Pi, že následující soubor je Python, takže by měl být spuštěn jako takový.

Přepněte zpět do editoru Pythonu a zadejte:

print 'Hello, World!'

Uložte tento soubor a spusťte jej znovu - nyní byste měli vidět 'Hello, World!' objeví se na příkazovém řádku - úhledně! Příkaz print jednoduše řekne Pythonu, aby vydal následující text v uvozovkách. To je dobré, ale ne příliš užitečné pro Minecraft, pojďme to propojit:

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

Pokud tento soubor uložíte a spustíte, mělo by se zobrazit „Hello, World!“ se objeví ve hře Minecraft. Pojďme rozebrat kód:

from mcpi.minecraft import Minecraft

Tento řádek říká Pythonu, že chcete použít kód z jiného souboru. Tento soubor mcpi.minecraft byl vyvinut, aby umožňoval snadné ovládání Minecraftu.

mc = Minecraft.create()

Tato čára vytvoří objekt nazvaný 'mc' (Minecraft). Musíte to vytvořit, abyste mohli komunikovat se hrou Minecraft - nestačí pouze zahrnout soubor.

mc.postToChat('Hello, World!')

Nakonec tento řádek říká Minecraftu, aby do chatu napsal nějaký text. Zkuste změnit „Hello, World!“ na něco jiného a uvidíte, co se stane, ale nezapomeňte zahrnout oba uvozovky. Pokud máte problémy se softwarem, jedná se o běžné chyby Pythonu a Minecraftu Pi:

  • AttributeError - jedná se o překlep, například pint nebo prnt místo tisku
  • NameError: název 'Minecraft' není definován - nezapomeňte importovat potřebné moduly
  • NameError: název 'true' není definován - Python rozlišuje velká a malá písmena, změňte na 'True'
  • socket.error: [Errno 111] Připojení odmítnuto - ujistěte se, že je spuštěn Minecraft

Projekty

Nyní, když znáte základy Pythonu a Minecraftu, vytvořme pár skvělých projektů. Veškerý kód lze stáhnout z Github.

Automatický stavitel mostů

Tento program efektivně postaví most přes vodu. Když se hráč přiblíží k vodní ploše, program převede několik bloků na kámen. Protože Minecraft používá souřadnicový systém, je velmi snadné zjistit polohu hráče spolu s typem bloků kolem hráče. Minecraft Pi je mírně omezený, takže není možné hromadně aktualizovat více různých bloků. Toto chování však můžete snadno kódovat sami.

Vytvořit nový soubor ( Soubor> Nový soubor ) a uložte jej jako ' 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)

Všimněte si, jak se hodnota y ve skutečnosti dívá na y - 1. Toto je úroveň podlahy. Pokud by byla použita hodnota y, skript by hledal bloky zhruba na úrovni kolen - nefungovalo by to moc dobře! Mc.getBlock () vrací id bloku pro dané souřadnice. Protože x, y a z jsou souřadnice hráče, můžete je přidat nebo odečíst, abyste získali pozice kolem hráče. Nemusíte používat hodnoty x, y a z, můžete použít libovolné číslo, ale možná nevíte, jak se konkrétní blok vztahuje k hráči - je lepší použít hodnoty relativně k hráči. Spusťte tento soubor z příkazového řádku a uvidíte, co se stane.

Měli byste vidět, že malá plocha země se změní na kámen, jakmile hráč dosáhne vodní plochy. Není to skvělé - jste schopni chodit dostatečně rychle, abyste způsobili problém. Můžete to vyřešit přeměnou většího objemu vody na pevninu. Poslední částí metody mc.setBlocks () je ID bloku. Jedním z nich je ID bloku kamene. Můžete to změnit na dřevo, trávu nebo cokoli jiného. Pokud byste chtěli, můžete to docela snadno převést na složitý design - možná visutý most!

Tlačítko Super Mining

Tento příklad vám usnadní těžbu. Skládá se z fyzického tlačítka, které po stisknutí vytěží 10 bloků krychlových. Začněme tlačítkem. Podobně jako tlačítka na Arduinu budete potřebovat malé množství elektroniky, kterou byste měli najít v základní startovací sadě:

  • 1 x prkénko
  • 1 x momentální spínač
  • 1 x 220 ohmový odpor
  • Samice> samčí startovací kabely
  • Samec> Samčí startovací kabely

Zde je obvod:

Připojení pomocí tlačítka Pi

Tento odpor se nazývá „stahovací“ odpor. Pomáhá zajistit, aby to, co si Pi myslí, bylo stisknuté tlačítko, ve skutečnosti bylo stisknuté tlačítko. Nemusíte to používat, ale je to doporučeno, protože bez něj můžete najít spoustu šumu a falešných údajů.

Tlačítko je připojeno ke kolíku 14 General Purpose Input Output (GPIO) 14. Můžete použít jakýkoli pin GPIO, podívejte se však na pinout zaprvé, protože nejsou všechny ovladatelné z Pi a mezi modely se mírně liší.

Nyní, když je tlačítko připojeno, je čas jej otestovat. Vytvořte nový soubor a uložte jej jako ' button_test.py '. Přidejte tento kód, uložte jej a poté spusťte v Terminálu.

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

lis Ovládání + C. zastavit skript. Pokud vše funguje správně, měli byste vidět „BUTTON WORKS!“ v Terminálu. Všimněte si, že stejně jako modul Minecraft tento test používá moduly RPi.GPIO a čas. Ty umožňují Pi přístup k hardwarovým pinům a poskytují užitečné funkce časování.

Nyní dokončíme zbytek kódu. Vytvořit nový soubor s názvem ' super_mine.py '. Zde je kód:

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 () vrací hráčům aktuální souřadnice, které jsou pak uloženy v x, y a z. The setBlocks () metoda říká Minecraftu, aby vyplnil všechny bloky mezi začátkem a koncem následujícím blokem. Nula je blokové ID pro vzduch. Můžete to změnit na jiné ID bloku pro plné vyplnění oblasti. Můžete také změnit souřadnice na +100 nebo dokonce +1000 bloků, ale Pi může začít bojovat, pokud se příliš zblázníte. Všimněte si, jak y + 10 je stejné pro oba řádky. Pokud jste chtěli odstranit bloky pod zemí, můžete to změnit na y - 10.

Teleportování

Dalším jednoduchým použitím tohoto tlačítka by mohlo být „teleportování“. Minecraft Pi Api poskytuje způsob, jak nastavit pozici hráče. Následující kód „teleportuje“ hráče na přednastavené místo:

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

Všimněte si, že jeho metoda přijímá tři parametry; x, y a z - takže je můžete nastavit na cokoli, abyste hráče okamžitě teleportovali na dané místo.

Vytvořte kopii souboru super_mine ( Soubor> Uložit Kopírovat jako ) a upravte jej nahrazením if následujícím:

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

Tento soubor by nyní měl vypadat takto:

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

Uložit jako ' teleport.py “a běžte.

Při tomto použití můžete zjistit, že se hráč zasekl v některých blocích. V takovém případě budete muset souřadnice upravit na známé volné místo (v levé horní části obrazovky se zobrazuje vaše aktuální poloha).

Postavit dům

Posledním úkolem tohoto tlačítka je postavit dům. Podobně jako výše uvedený příklad rychlé těžby, toto jednoduše nahradí bloky obklopující hráče, aby vytvořil dům. Pro různé materiály (okna, stěny atd.) Budou použita různá ID bloků. Aby bylo kódování jednodušší, vytvoří se pevný blok a poté se odstraní vnitřek (nastaví blok na vzduch), čímž se vytvoří dutá skořepina. Můžete přidat doplňky, jako je postel nebo dveře, ale projekt Minecraft Pi je trochu neúplný, a přestože tyto objekty fungují, když jsou umístěny hráčem, nejsou při používání Pythonu brilantní.

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

Uložit jako ' house.py “a běžte. Všechno je v pořádku, měli byste vidět malý dům (možná se budete muset otočit, abyste ho našli). Je to velmi jednoduché, otevírání a některá okna. Teoreticky neexistuje žádný limit na to, jak velkou nebo složitou budovu byste mohli postavit.

Vytvořte minihru

Dále vytvořme minihru! To bude docela jednoduché, když hráč stoupne na blok písku, po náhodném čase se změní na lávu. Je to dobrá hra, protože si můžete navrhnout své vlastní úrovně nebo je upravit, aby byly věci těžší. V tomto příkladu tlačítko nebudete potřebovat.

Vytvořte nový soubor a uložte jej jako ' mini_game.py '. Zde je kód:

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

Tento kód je dobrým startérem náhodný() funkce: random.uniform (0,1, 2,5) vygeneruje náhodné číslo mezi 0,1 (1/10 sekundy) a 2,5 (2 1/2 sekundy). Zvýšení těchto čísel usnadní hru.

Vyzkoušej to! Postavte se na blok písku a brzy se změní v lávu. To by mohl být základ složitější hry.

Vytvořte další minihru

Předpoklad této hry je jednoduchý - nestůjte na dřevěné podlaze, když čas vyprší. Hráč se teleportuje do 'arény'. Jsou nuceni stát na místě, dokud hra nezačne. Po spuštění se podlaha změní na vodu, jakmile vyprší časovač. Aby hráč přežil, musí stát v bezpečné zóně (diamantové bloky). Každá úroveň snižuje časovač o jednu sekundu. Po každé úspěšné úrovni se bezpečná oblast zvětší. Podívejte se na níže uvedený kód:

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

Uložit jako ' mini_game_2.py “a zkuste to.

Pi 2 má při spuštění Minecraftu nějaké problémy s výkonem. Graf využití centrální procesorové jednotky (CPU) ( pravý horní roh ) nikdy nevykazuje žádné velké zatížení, takže to musí být způsobeno špatným designem a optimalizacemi vývojářů. Tyto problémy nesouvisí se spuštěným kódem (protože pokračují, když není spuštěn Python), ale jsou ještě umocněny touto mini hrou. Pokud se váš Pi opravdu potýká, možná budete chtít zmenšit velikost arény nebo přetaktovat svůj Pi.

windows stop code unountable boot volume

Diamantový detektor

Udělejme další okruh. To bude používat světelnou diodu (LED) k rozsvícení, pokud jsou pod ním diamanty (do 15 bloků). Zde je to, co potřebujete:

  • 1 x prkénko
  • 1 x LED
  • 1 x 220 ohmový odpor
  • Samice> samčí startovací kabely
  • Samec> Samčí startovací kabely

Zde je obvod:

Připojte anodu (dlouhá noha) ke kolíku GPIO 14. Tento kolík funguje jako +5v. Připojte katodu (krátkou nohu) k zemi.

Použil jsem levnou rudou hračku a upravil ji odstraněním zadního krytu a elektroniky, poté jsem pod ni umístil LED. Mohli byste to snadno udělat pomocí horkého lepidla nebo něčeho podobného.

Uložit tento kód jako ' 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

Když je pod hráčem (do 15 bloků) blok diamantové rudy, kontrolka začne blikat.

ThinkGeek Minecraft Light -Up Blue Stone Diamond Ore - určitě udržíte Pigmen pryč KOUPIT HNED NA AMAZONU

Udělali jste něco skvělého s Minecraft Pi? Dejte mi vědět v komentářích, co jste vyrobili nebo jak daleko jste to ve hrách dotáhli.

Doufáme, že se vám budou líbit položky, které doporučujeme a diskutujeme! Společnost MUO má partnerská a sponzorovaná partnerství, takže dostáváme část příjmů z některých vašich nákupů. To neovlivní cenu, kterou zaplatíte, a pomůže nám to nabídnout nejlepší doporučení produktů.

Podíl Podíl tweet E-mailem Vyplatí se upgradovat na Windows 11?

Windows byl přepracován. Stačí to ale k tomu, abyste vás přesvědčili o přechodu z Windows 10 na Windows 11?

Číst dále
Související témata
  • DIY
  • Programování
  • Minecraft
  • Raspberry Pi
  • Elektronika
  • Krajta
O autorovi Joe Coburn(136 publikovaných článků)

Joe je absolventem informatiky na University of Lincoln, UK. Je profesionálním vývojářem softwaru, a když neletí drony nebo nepíše hudbu, často ho lze zastihnout při fotografování nebo produkci videí.

Více od Joe Coburn

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru
Kategorie Diy