spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Dominika Delejová 18.3.2018
Hodnoť článok:
2 0

Raspberry Pi a hra Minecraft I.: Orientačný beh

Dnes si ukážeme ako v pythone naprogramovať hru s názvom Orientačný beh. Vyskúšame si použitie náhodných čísel, podmienok a cyklov. Tak poďme nato!

Naše programovanie začneme zapnutím samotnej hry. Jedná sa o Minecraft Pi verziu, ktorá je dostupná na Raspberry Pi. Viac sa o tom dočítate v mojom predošlom článku Úvod do Raspberry Pi a hry Minecraft.

Zapneme si konzolu pre Python. Vytvoríme si nový súbor pomocou kláves CTRL + N alebo voľbou v hlavnom menu: File -> New file.
Do otvoreného súboru si začneme písať kód. Po jeho napísaní si ho uložíme stlačením CTRL + S alebo voľbou v hlavnej ponuke File -> Save. Súbor si pomenujeme beh.py.
Po uložení ho bude možné spustiť stlačením klávesy F5 alebo Run –> Run module.

Začiatok

Ideme napísať svoj kód. Pri hre na orientačný beh sa potrebujeme dostať z miesta A do miesta B. Zo štartovacieho bodu sa chceme dostať do cieľa.

Najprv si určením náš cieľový bod. Ten bude naša aktuálna pozícia. Označíme si ho položením kocky, aby sme ho vedeli ľahšie nájsť. Potom sa teleportujeme na náhodné miesto na mape a začneme hľadať cestu naspäť do cieľa.

Program začneme týmto kódom:

# vloženie balíčkov
from mcpi.minecraft import Minecraft
from mcpi import block

mc = Minecraft.create()             # spojenie so svetom
pos = mc.player.getTilePos()        # pozícia hráča

Vložíme si do programu balíčky s funkciami, ktoré budeme používať. Vytvoríme si spojenie so svetom Minecraft a uložíme si pozíciu hráča.

Tú dokážeme získať funkciami getTilePos() a getPos(). Je len na nás, ktorú z nich použijeme. Jediný rozdiel medzi nimi je v tom, že funkcia getTilePos() vráti pozíciu dlaždice, resp. kocky, na ktorej sa hráč nachádza.

Náhodné miesto

Pred tým ako položíme samotný kameň, ktorý určí náš cieľ. Teleportujeme sa preč. Využijeme na to funkciu setTilePos(x, y, z). Tá nás premiestni na miesto s uvedenými súradnicami x, y, z.

Získame tak náš štartovací bod, z ktorého začneme naše hľadanie. Určíme si ho pomocou náhodných čísel. Využijeme balík random, z ktorého použijeme funkciu randrange(). Tá vygeneruje náhodné číslo z uvedeného rozsahu. V tomto prípade ide o rozsah 100 čísiel, takže vygenerované náhodné číslo bude medzi hodnotami 0 - 99.

# vloženie balíčka pre náhodné čísla
import random  

# umiestnenie hráča na náhodnú pozíciu
mc.player.setTilePos(random.randrange(100), random.randrange(100), random.randrange(100))

Cieľový kameň

Pokračovať budeme vytvorením cieľového bloku pomocou funkcie setBlock(). Id bloku je STONE, takže položená kocka bude kameň. Aby sme ju ozvláštnili, pripevníme na ňu ohnivé fakle. Tie budú žiariť na každú svetovú stranu aj do chladnej noci a hráč ju uvidí už z diaľky.

# blok kameňa
mc.setBlock(pos.x, pos.y, pos.z, block.STONE)

# pochodne na kameni
# na vrchu
mc.setBlock(pos.x, pos.y +1, pos.z, block.TORCH)
# na východnej strane
mc.setBlock(pos.x+1, pos.y, pos.z, block.TORCH)
# na západnej strane
mc.setBlock(pos.x-1, pos.y, pos.z, block.TORCH)
# na severnej strane
mc.setBlock(pos.x, pos.y, pos.z-1, block.TORCH)
# na južnej strane
mc.setBlock(pos.x, pos.y, pos.z+1, block.TORCH)

Vo svete Minecraft sa nám objaví takýto kameň, ktorý máme za úlohu nájsť:

Dosiahnutie cieľa

V druhej polovici sa budeme venovať zisťovaniu aktuálnej polohy a nájdeniu cieľa. Do premennej posNow si uložíme novú, aktuálnu pozíciu, na ktorú sme sa teleportovali.

Pokračovať budeme porovnaním súradníc našej novej pozície a cieľovej kocky. Funkciou postToChat() oznámime, či sa už nachádzame v cieli alebo ešte nie - vypíšeme našu aktuálnu pozíciu. Pri jej výpise musíme použiť format() čísla na reťazec.

Ako zabezpečiť, aby sa kontrola pozície opakovala?

Vložíme ju do cyklu, ktorý sa bude vykonávať, pokým nedosiahneme cieľ. Vytvoríme si preto premennú s názvom playGame a nastavíme ju na True. Jej hodnota sa zmení na False až keď dosiahneme cieľ.
Použijeme aj funkciu sleep(), ktorá nám poslúži na spomalenie vypisovania hlášky na obrazovku.

# vloženie balíčka pre čas
from time import sleep

playGame = True                              # hranie hry
while playGame == True:                      # opakovanie kým platí podmienka
    posNow = mc.player.getTilePos()          # nová pozícia

    # podmienka na overenie cieľa
    if pos.x == posNow.x and pos.y == posNow.y and pos.z == posNow.z:
        mc.postToChat("Si v cieli!")
        mc.postToChat("Vyhral si!")
        playGame = False                     # koniec hry
    else:
        # výpis aktuálnej pozície
        mc.postToChat('({:f}, {:f}, {:f})'.format(posNow.x, posNow.y, posNow.z))
    sleep(1)                                 # uspanie programu na 1 sekundu

Pre lepšiu predstavu orientácie sveta Minecraft uvádzam nasledujúci obrázok:

Ako zistiť ako ďaleko sme od cieľa?

Vzdialenosť od cieľa

Skúsme si hru vylepšiť. Budeme pri tom ale musieť použiť trochu matematiky. Vložíme si do programu balíček math.
Najprv si vypočítame rozdiel našej novej pozície a pozície cieľa. Výpočet urobíme pre každú z troch súradníc x, y, z.

V ďalšom kroku rozdiely vynásobíme sebou samými. Potom všetky tieto čiastkové výpočty spočítame a použitím matematickej funkcie sqrt na výpočet odmocniny získame našu vzdialenosť od cieľa. Tú si uložíme do premennej distance.

Teraz namiesto hlášky o výpise našej aktuálnej pozície vypíšeme vzdialenosť od cieľa. Program bude po tomto výpočet vyzerať nasledovne:

# vloženie balíka pre matematické funkcie
from math import sqrt

playGame = True                              # hranie hry
while playGame == True:                      # opakovanie kým platí podmienka
    posNow = mc.player.getTilePos()          # nová pozícia

    # výpočet rozdielu súradníc
    xDiff = pos.x - posNow.x
    yDiff = pos.y - posNow.y
    zDiff = pos.z - posNow.z

    # vynásobenie jednotlivých rozdielov
    xSquare = xDiff * xDiff
    ySquare = yDiff * yDiff
    zSquare = zDiff * zDiff

    total = xSquare + ySquare + zSquare    # spočítanie hodnôt
    distance = sqrt(total)                 # celková vzdialenosť od cieľa

    # podmienka na overenie cieľa
    if pos.x == posNow.x and pos.y == posNow.y and pos.z == posNow.z:
        mc.postToChat("Si v cieli!")
        mc.postToChat("Vyhral si!")
        playGame = False                   # koniec hry
    else:
        mc.postToChat('{:f}'.format(distance))  # výpis vzdialenosti od cieľa
    sleep(1)                                # uspanie programu na 1 sekundu

Hra je hotová! Teraz si ju stačí už len zahrať. Orientáciou pomocou zmenšujúceho sa čísla na obrazovke sa určite dostanete do cieľa. Na konci môžete kocku rozbiť a získať si z nej pochodne.

Podarilo sa Vám si hru zahrať?

Do samotnej hry si môžete pridať aj časový limit alebo počítadlo času. Skúste vyzvať na súťaž svojich kamarátov a skúste, kto z vás bude skôr v cieli. Vlastnej kreativite sa hranice nekladú. Dôležité je, aby bolo pre Vás písanie kódu zábavou.

Úvodná časť: Úvod do Raspberry Pi a hry Minecraft.
Nasledujúca časť: Raspberry Pi a hra Minecraft II.: Staviam - staviaš - staviame
Kód je dostupný na stiahnutie: beh.zip.
Zdroj: https://www.raspberrypi.org/magpi-issues/Beginners_Book_v1.pdf

Hodnoť článok:
2 0

0 komentárov k článku:

Komentovať môžu iba prihlásení

Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)

Prihlás sa tu, ak už máš profil na Zajtra.sk:


Zabudol som heslo

Zajtra.sk > Programovanie > Seriály > Raspberry Pi a hra Minecraft I.: Orientačný beh


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama