Aplikace C5 – Hra chytání vajec

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)

 

 

Scroll to Top