Možná že někteří z vás znáte hru, kdy zajíc pouští vejce zleva a zprava a vlk je chytá do košíku. V této lekci si zkusíme naprogramovat tuto hru tak, jak nám displej micro:bit dovolí.
název: C5 Hra chytání vajec
kategorie: C středně pokročilí
ref.číslo: C5
projekt:
verze: 01, 2017-08-28
autor: Ivo Obr, Lanškroun
Ze sloupců 0, 1, 2, 3 a 4 si zvolíme sloupce 1 a 3, ve kterých budou padat vejce z nultého řádku až do čtvrtého. Jas padajících vajec bude nastaven na 5. Košík se může pohybovat v souřadnicích [1,4]-[2,4]-[3,4] a to levým “A” tlačítkem doleva a pravým “B” tlačítkem doprava. Jas košíku bude 9 a bude blikat. Účelem hry je mít košík ve sloupci, když vejce dojde na čtvrtý řádek (dolů). Pokud vejce zachytíme do košíku, máme bod, pokud nezachytíme, vejce se rozbije a je chyba. Rozbité vejce ze sloupce levého je znázorněno v nultém sloupci a čtvrtém řádku, z pravého sloupce pak ve čtvrtém sloupci také ve čtvrtém řádku. V každém sloupci lze rozbít jen jedno vejce. Hra končí, když se rozbije další vejce v levém nebo pravém sloupci. Výsledek je ukázán na konci hry.
Aby to nebylo jednoduché, hra se postupem doby zrychluje. Je naprogramováno, že se nespustí vejce v levém a pravém sloupci zároveň. Hra začíná stiskem tlačítka “A”.
Doporučuji nejdříve si projít lekce C3_Asteroidy a C4_Asteroidy_objektově, bude se Vám snadněji pracovat. Hra je napsaná tak, aby jste si ji mohli dále rozvíjet (další vejce ve druhém sloupci, větší počet rozbitých vajec, dvě vejce v jednom sloupci a pod.)
Popis:
Na začátku hry se vygenerují dva objekty – vejce v levém sloupci a vejce v pravém sloupci:
vejceL1 = Vejce(1)
vejceP1 = Vejce(3)
Vejce ve stavu “nula” je vejce aktivní, je znázorňováno na displeji a každým každým krokem hry “padá” o jeden řádek dolů.
if self.stav == 0:
# posun vejce o jeden radek dolu
self.y = self.y + 1
# je mozno generovat dalsi vejce do stavu 0
gener = True
Vejce ve stavu “jedna” je vejce neaktivní, není znázorňováno na displeji, v každém kroku je pokus o jeho aktivaci. Aktivace je provedena tehdy (ze stavu “jedna” do stavu “nula”), když je hodnota proměnné “gener” je True a padne náhodné číslo 0 z možných [0, 1, 2, 3]. Pokud je v kroku hry generováno vejce v nultém řádku, pak další vejce lze generovat až po jeho posunu na další řádek (v jednom řádku by neměla být obě vejce).
elif ((random.randint(0, 3) == 0) and gener):
self.stav = 0
gener = False
A košík:
kosik_x = 2
Jeden KROK hry má šest cyklů příkazu “While” číslovaných v proměnné “i” :
i=0 – možný pohyb košíku, zrychluje se hra
i=1 – možný pohyb košíku
i=2 – možný pohyb košíku, pohyb levého vejce nebo generování vejce
i=3 – možný pohyb košíku,
i=4 – možný pohyb košíku,
i=5 – možný pohyb košíku, pohyb pravého vejce nebo generování vejce
Košíkem pohybujeme vpravo a vlevo:
if button_a.was_pressed() and kosik_x != 1:
kosik_x -= 1
elif button_b.was_pressed() and kosik_x != 3:
kosik_x += 1
Košík zakreslíme do obrázku “img” příkazem :
img.set_pixel(kosik_x, 4, 9 – (2 * (i % 2)))
(i % 2) je zbytek po dělení dvěma, protože “i” se mění v každém cyklu od nuly do pěti, zbytky se pohybují stále střídavě nula a jedna. Výraz (2 * (i % 2)) se pak pohybuje střídavě nula a dvě a tato hodna se odečítá od jasu 9 košíku. Takže LED dioda, představující košík bliká s jasem střídavě 9 a 7. Souřadnice X košíku je “kosik_x”, souřadnice Y je stabilně 4.
Hra končí, když jsou dvě chyby v levém nebo pravém sloupci:
if ((vejceL1.chyba > 1) or (vejceP1.chyba > 1)):
hra = False
Zkuste si hru dále rozvíjet, je tu mnoho možností. A nakonec celý program, který je částečně komentován. :
# autor : Ivo Obr # srpen 2017 from microbit import * import random # deklarace tridy vejce, parametry jsou: # sloupec x ve kterem vejce pada class Vejce(): def __init__(self, sx): # souřadnice X ve ktere vejce pada self.x = sx self.y = 0 # stav 0 - vejce je videt a pada # stav 1 - vejce neni videt self.stav = 1 # pocet chyb - vejce nebylo chyceno self.chyba = 0 def krok(self): # nastaveni jednoduchych promennych jako globalni global skore global kosik_x global gener if self.stav == 0: # posun vejce o jeden radek dolu self.y = self.y + 1 # je mozno generovat dalsi vejce do stavu 0 gener = True # vejce je na spodnim radku if (self.y == 4): self.stav = 1 self.y = 0 # pokud chyceno do kosiku zvysuji skore if (kosik_x == self.x): skore = skore + 1 # jinak nactu chybu if (kosik_x != self.x): self.chyba += 1 # kdyz je stav 1 a mohu generovat tak mam 1/4 pravdepodobnosti elif ((random.randint(0, 3) == 0) and gener): self.stav = 0 gener = False while True: display.show(Image.ARROW_W) if button_a.was_pressed(): display.clear() kosik_x = 2 skore = 0 gener = True # generuji dve vejce - leve a prave # leve v 1.sloupci, prave ve 3.sloupci vejceL1 = Vejce(1) vejceP1 = Vejce(3) chyba = 0 i = 0 # nastavim rychlost cyklu rychlost = 180 hra = True sleep(600) while hra: if button_a.was_pressed() and kosik_x != 1: kosik_x -= 1 elif button_b.was_pressed() and kosik_x != 3: kosik_x += 1 img = Image('00000:'*5) img.set_pixel(kosik_x, 4, 9 - (2 * (i % 2))) i += 1 if i == 2: vejceL1.krok() if i == 5: vejceP1.krok() if i == 6: i = 0 # zrychluji hru rychlost -= 1 # vetsi rychlost uz ne if rychlost == 50: rychlost = 51 if (vejceL1.chyba == 1): img.set_pixel(0, 4, 3) if (vejceP1.chyba == 1): img.set_pixel(4, 4, 3) if ((vejceL1.chyba > 1) or (vejceP1.chyba > 1)): hra = False if (vejceL1.stav == 0): img.set_pixel(vejceL1.x, vejceL1.y, 5) if (vejceP1.stav == 0): img.set_pixel(vejceP1.x, vejceP1.y, 5) display.show(img) sleep(rychlost) display.scroll(str(skore)) sleep(2000)