Aplikace C3 Hra Asteroidy

Lekce C3 je ukázkou jednoduché hry, kdy prolétáme kosmickou lodí skupinu asteroidů a vyhýbáme se jim. Po strážce hra končí a nám se ukáže skóre, kolik bodů jsme během hry nasbírali.

název: C3 Hra Asteroidy
kategorie: C středně pokročilí
ref.číslo: C3
projekt:
verze: 01, 2017-07-30
autor: Ivo Obr, Lanškroun


V programu si zopakujeme většinu postupů z lekcí B1 až B10. Nejdříve si definujeme, jak bude hra vypadat na našem displeji 5×5 LED diod. Protože se jedná o jednoduchou hru, kterou můžete pak dále rozvíjet, naprogramujeme jednu loď na čtvrtém řádku (spodním).

Tato loď bude reprezentována blikající diodou, která může nabýt jednu z poloh v ose X od 0  do 4. Pohyb lodi budeme řídit tlačítkem “A” (pohyb vlevo) a tlačítkem “B” (pohyb vpravo).

Asteroidy budou  dva, jeden začíná padat od nultého řádku (úplně nahoře), druhý začíná padat už od druhého řádku (prostřední řádek). Ve kterém sloupci začnou padat bude učeno vygenerovaným náhodným číslem v rozsahu 0 až 4. Vzhledem k jednoduchosti programu mohou oba asteroidy padat ve  stejném sloupci.

Jakmile bude na dolním řádku pozice asteroidu a lodi stejná (srážka), hra končí a na displeji se vypíše skóre hry (počet kroků hry).

A nyní k vlastnímu programu. Ten začneme příkazy :

from microbit import *
import random

Druhý řádek je nutný, neboť budeme používat generátor náhodných čísel. Celý další program je opakování příkazů.

while True:
            display.show(Image.ARROW_W)

Příkaz “display.show” vykreslí šipku směrem západním, tedy k tlačítku “A”. Ukazuje nám, kde máme začít hru. Ve stejném sloupci jako displej je dotaz na stisk tlačítka “A”. Pokud je tlačítko “A” stisknuto, hra se otevře a nastavíme úvodní hodnoty do proměnných.

if button_a.was_pressed():
              display.clear()
              score = 0
              lod_x = 2
              asteroid1_x = random.randint(0, 4)
              asteroid2_x = random.randint(0, 4)
              asteroid1_y = 0
              asteroid2_y = 2
              i = 0
              rychlost = 300
              hra = True
              sleep(600)

lod_x  je souřadnice naší lodě ve vodorovném směru, svisle je vždy na 4
asteroid1_x a asteroid1_y jsou souřadnice prvního asteroidu (stejně tak asteroid2)
i je pomocná proměnná pro blikání lodě
rychlost je počet milisekund prodlení v  jednom kroku hry
hra je logická proměnná nastavená na True, pokud je srážka s asteroidem je nastavena na False

sleep(600)
while hra:
            if button_a.was_pressed() and lod_x != 0:
            lod_x -= 1
            elif button_b.was_pressed() and lod_x != 4:
            lod_x += 1
            img = Image(‘00000:’*5)
            img.set_pixel(lod_x, 4, i*5+4)
            img.set_pixel(asteroid1_x, asteroid1_y, 9)
            img.set_pixel(asteroid2_x, asteroid2_y, 9)
 

Příkaz “while” je ve stejné pozici (sloupci) jako příkazu “sleep”. Příkaz “while” se opakuje tak dlouho, pokud nedojde ke srážce lodi s asteroidem. Pak je proměnná “hra” nastavena na False a hra končí. Testujeme tlačítka “A” a “B”. Pokud není loď v krajních polohách, tak posuneme souřadnici vlevo nebo vpravo o jeden sloupec. Příkaz lod_x += 1 je stejný jako lod_x = lod_x +1 . Jde o zkrácený zápis.

Dále si připravíme objekt obrázku s názvem “img”. V kulaté závorce je použit zápis, kde se ‘00000:’ (řádek na displeji) opakuje 5krát.

S tímto obrázkem můžeme dále pracovat a to tak, že upravíme svícení jednotlivé diody příkazem : [název_obrázku].set_pixel(x-souřadnice, y-souřadnice, jas)

Tímto příkazem si  nastavíme svícení diody lodě. Loď je vždy na  řádku 4. Poslední hodnota i*5+4 je jas diody. Hodnota proměnné “i” se střídá mezi nulou a jedničkou v jednotlivých krocích. Takže jas diody se mění střídavě mezi 5 a 9. Další dva příkazy nastavují svítící diody pro oba asteroidy, jas je nastaven trvale na hodnotu 9 (maximum).

Další příkazy upravují hodnotu proměnné “i” tak, aby se střídaly hodnoty 0 a 1. V prvém průchodu  je hodnota “i” nula a prvým příkazem se zvětší na 1. Příkaz “if” vyhodnotí, že další příkazy se již provádět nebudou. Ve druhém průchodu se hodnota proměnné “i” zvětší o jedna na hodnotu dvě. Příkaz “if” povolí vykonání dalších odsazených příkazů a hned prvý z nich vrátí hodnotu proměnné “i” na nulu.

i += 1
if i == 2:
    i = 0
    asteroid1_y += 1
    if asteroid1_y == 5:
        asteroid1_y = 0
        asteroid1_x = random.randint(0, 4)
     asteroid2_y += 1
     if asteroid2_y == 5:
        asteroid2_y = 0
        asteroid2_x = random.randint(0, 4)
     score += 1

Pokud je hodnota proměnné “i” rovna dvěma (jen na malou chvilku), pak se zvětší hodnota souřadnice “y” asteroidů  o jedničku. Pokud byl už asteroid na řádku 4 a zvětšením dostal hodnotu 5, (což je už mimo rozsah displeje), vrátíme asteroid nahoru na souřadnici “y” s hodnotou nula, ale vypočítáme mu nový náhodný sloupec, ve kterém se bude pohybovat.

Nakonec přičteme jedničku do celkového skóre.

Nyní nám zbývá zjistit, zdali se naše loď nesrazila s nějakým asteroidem. Pokud je asteroid na čtvrtém řádku, porovnáme souřadnice sloupců lodě a asteroidu. pokud je hodnota stejná, došlo ke srážce a hru ukončíme tím, že nastavíme proměnnou “hra” na hodnotu False. Tím se už předchozí příkaz “while hra” již nebude opakovat.

if asteroid1_y == 4:
    if lod_x == asteroid1_x:
        hra = False
if asteroid2_y == 4:
    if lod_x == asteroid2_x:
        hra = False

Blížíme se ke konci, kde nejdříve vykreslíme obrázek “img” na displeji.  Na začátku jsme si nastavili délku trvání prodlevy mezi jednotlivými průchody na 300msec. Aby nebyla hra tak jednoduchá, budeme zrychlovat hru zmenšováním prodlevy až na 101msec.

display.show(img)
rychlost -= 1
if rychlost == 100:
    rychlost = 101
sleep(rychlost)

Pokud hra skončila, vypíšeme skóre příkazem :

display.scroll(str(score))
sleep(2000)

Počkáme dvě vteřiny, abychom výsledek přečetli. Proměnná “score” je numerická, je v ní numerická hodnota. Výraz str(score) nám převede hodnotu na řetězec číslic. Tento řetězec už můžeme vypsat příkazem display.scroll().

Na konci této lekce pak najdete celý program. S programem lze experimentovat, upravovat rychlost, aby asteroidy nebyly ve stejném sloupci a pod.