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)
