Přeskočit navigaci | Přeskočit na novinky
     

Jste zde: Úvodní stránka » excel » ostatni » Tetris-jak-vytvorit-Excel
Microsoft Excel logo

Tetris - jak vytvořit v Excel

Videokurzy Excel

Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:

Vytvořte si Tetris využitím Excel a VBA.

Práva na oblíbenou hru určitě někdo má, proto zde jde o náhodnou podobnost. Budeme pohybovat 4 kostičkami, jako ukázku toho co Excel umí (velká podobnost s Tetris je náhodná).

Pro tvorbu předpokládám mírně pokročilou znalost Excel, že umíte funkce POSUN (OFFSET), KDYŽ (IF) a smíšené odkazování vám nesmí být neznáme.

Úvodem do Tetris

Vytvořit hru podobnou Tetris není vůbec problém. Pravda dají se najít hotové hry, které někdo vytvořil, ale popis jak od A do Z tuto hru vytvořit a navíc v Excel s využitím VBA jsem nenašel (nepřišel jsme zatím jak hru vytvořit úplně bez využití VBA, proto k rozpohybování hry zatím využijeme i VBA). Proč si teda neprocvičit Excel a hru nevytvořit? Výhodou, že v základu jsou využity jen funkce Excelu (třeba vás pak začne bavit i VBA). Takže pro ruční pohyb obrazců (včetně hlídaní kolizí) vše vytvoříme bez použití VBA (což bude obsahem toho článku). VBA ma makra toho následujicího.

Protože článek je rozshálý rozdělil jsme jej na kapitoly:


Tetris jak funguje

Myslím, že netřeba popisovat. Jedna z nejúspěšnějších her na světě.

Kdyby tak kostky, které se skládají ze 4 čtverečků, padají po obrazovce. Je potřeba je ve čtvercové síti poskládat zprava doleva kdy čtverečky pokryjí celou řadu. Pokud je celý řádek zaplněný tak automaticky zmizí. Hra končí, když se čtverečky dostoupí na horního okraje hrací plochy tím nejde další přidávat.

Logické je, že najednou můžou zmizet maximálně čtyři řádky, čehož lze dosáhnout jen dílkem který se podoba písmenu I. Tomu to tahu se říká TETRIS.

Ve svém důsledku jde o geniálně jednoduchý princip.

Rozměr hrací plochy prý 10 x 20, ale myslím, že je to vcelku jedno, zda bude o sloupec větší nebo řádek menší. Stejně tak jak se budou počítat body (podle různých popisu jsou lépe hodnoceny víceřádková doplnění, asi proto že se docílují hůře). Podobně při rychlejší padání má Tetris vygenerovat více bodů (což v základní funkci není potřeba). Co postihnout netřeba jsou propočty, zda se dá hrát do nekonečna a když "náhodně" budou padat určité kameny, zda je možnost hru nemoci vyhrát a muset ukončit nechám už na vás.

Zde jde spíše o to vyhrát si s Excel a Tetris je jen jako prostředek, nejde o to vytvořit dokonalý klon, těch už existuje mraky.

Ukázka první verze Tetris

TETRIS v Excel

Ukázka druhé verze Tetris

TETRIS v Excel

Trochu teorie co budeme chtít

Základ, že budou padat jednobarevné (barevné) kostičky, které mohu posouvat a otáčet (klikem na tlačítka, případně na kurzorové klávesy). Po dopadu se budou odmazávat řádky, pokud bude zaplněna celá řada. Po spadnutí se "náhodně vybere další typ kostky.

Možná další vylepšení

  • Kostičky budou barevné - ač první test byl jedna barva, ale než jsem se z Ostravy vrátil do Brna, byla i barva - ať žijí zpoždění ;)
  • Počítání skóre
  • Jaká bude další kostička
  • Zrychlování
  • Lepší design
  • ...

Nic negarantuji, první verze běhá a třeba někdy bude další ;) Nebo první bude předělaná na základě komentářů na jiný princip. Něco se učím a píšu o tom veřejně.

Jak to provedeme

Cíl máme, teď otázka jak na to? ;)

Poznámka

Řešení je jedno z mnoha možných, vůbec není nejlepší, není neprůstřelné, jde o to si pohrát a mít zábavu s Excelem. Pokud chcete něco profi, musíte se poohlédnout jinde (nejlépe postup v Java, C++, Python atd.). Další čtení jen na vlastní nebezpečí.

Čtete dále? Já vás varoval. ;)

Jak na to

Část Tetris bude pomoci klasických funkcí - posun otáčení (budu kombinovat funkce a VBA, maximum se budu snažit vytvořit s pomocí klasického Excel, ať si člověk může vyhrát i bez znalosti VBA) a automatický pohyb pak bude proveden využitím VBA. Co a jak tedy provedu?

  • Hrací plocha - sešit Excel (vím ve VBA jsou i formuláře a může vypadat elegantněji, ale...). Rozměr plochy cca 10 x 20. Když sloupce zúžím a mám čtverečkovanou síť
  • Obrazce - využijí funkci POSUN (OFFSET) a seznam obrazců v matici 4 X 4 a těch čtverů bude 7 x 4
  • Posun a otáčení - mohu také krásně využít funkci POSUN (OFFSET) - jen přičtu/odečtu řádky sloupce
  • Pro barvy využíjeme podmíněné formátování - podmínkou se odkáži na daný obrazec a přiřadím mu číslo
  • Pro kostičky které už napadaly uložení přes klasické čísla (když už máme barvy do pomocné matice s tímto pomůže VBA)
  • Pro kolizi podmínky - po kolizi se něco provede a to už provede VBA
  • Pro mazání řad - pro dopočet využiji podmínkové funkce SUMIFS a COUNTIFS pro smazání VBA
  • Start hry a padání - tam už bude potřeba VBA makro, ale v testech můžeme použít formulářový prvek
  • Otáčení a posun - VBA pro testy formulářový prvek
  • Nový prvek - náhodný výběr funkce RANDOM (vím není úplně náhodná, ale jde o test)
  • Konec a vynulování hry - VBA smaže hrací plochu

Poznámka

Ve skutečností bude jedna hrací plocha a další tři pomocné. V jedné budou jednobarevné padající kostičky, v druhé padající kostičce dáme barvu, ve třetí budou uloženy právě spadené kostičky. Vím že barva a padající kostička se dá spojit do jedné pomocné hrací plochy, ale jde o to zkoušet postupně.

Samozřejmě pomocné buňky, které pomocí funkcí počítají obrazce i určuji jak je aktivní obrazec posunut, který obrazec je vybrán a jak je otočen, pár pomůcek pro výpočet kolizí.

V případě pokročilejších řešení budou i body, jaký bude další obrazec, aktuální rychlost padání, počet spadených kostek, atd. Tak nějaké prvky na list ještě přibudou.

TETRIS v Excel - návrh

Z důvodu přehlednosti jsou na ukázkách menší hrací plochy.

Další možností

Možná časem doplním další vylepšení, jako počítaní bodů, zrychlování, jaký obrazec bude následovat atd. Případně pokud se v komentářích článku objeví zpětná vazba, rád doplním vylepším (ale negarantuji). Holt jde o ukázku možného řešení, které není 100%, cíl byl si pohrát v Excel, což se mi povedlo. Mám tedy pár námětu pro strýčka příhodu:

  • Počítání bodů - VBA po spadení obrazce a smazání řady bude přičítat body (body, řad, obrazců)
  • Zrychlení padání i umísťování VBA
  • Jaký obrazec bude následovat - pomocná fronta, bude se generovat dopředu a po dopadnuti se vygeneruje následující kostička a předchozí se použije do hry
  • Design - no pokud se budu fakt hodně nudit ;)

Nápad vznikl při cestě do Ostravy holt nebyl k dispozici internet, tak jsme vymyslel jak a provedl. Vím šlo by jinak a mnohem lépe (klidně vytvořte si sami ;) ). Možná někdo jiný má elegantnější řešení, ale to až příště, třeba vylepším nebo udělám jinak nanovo a lépe.

Původně jsem chtěl jen zabyt čas při zpoždění a vyhrát si s funkci POSUN v Excel. Já původni cíl splnil a hrátky s Excel užil ;).

Dost řečí jde se tvořit!

Obrazce které potřebujeme vytvořit

Teoretický úvod máme za sebou, pojďme řešit už prakticky.

Tetris používá obrazce ze čtyř čtvercových kostek. V tomto kroku si z důvodu přehlednosti nadefinujeme každý obrazec a pojmenujeme písmenkem. Budem pak používa v odkazování. Každý obrazec pak má 4 stavy odpovídaví potočení (0°, 90°, 180°, 270°). Proto si vystačíme s matici 4 x 4. kterou zopakujeme 4 x pro každý úhel a 7 x každé písmenu (poskládání 4 kostiček).

Písmena budou: I, L, J, O, T, Z, S.

TETRIS v Excel - obrazce

Pro jednoduchost a další zpracování má každá matice kostiček u řádku i sloupce číslo 1 až 4. Pokud je kostička vyplněna, tak má adresu řádku sloupce. Tím pádem pro všechny kostičky mi stačí osm hodnot, neboli 4 průsečiky.

TETRIS v Excel - obrazce adresa

Když adresu jedné kostičky spojím do buňky, mohu se na ní odkázat v podmíněném formátování a v matici 4x4 se probarví co potřebuji.

TETRIS v Excel - obrazce podminene formatovani

Výběr obrazce a otočení

Teď přidáme výběr Písmena (obrazce) a úhlu (0,90,180,270).

Pro výběr krásně využijeme funkci POSUN (OFFSET). Stačí jen říct který obrazec a jaká úhel:

Obrazec

  • I 1
  • J 2
  • ...
  • S 7

Úhel

  • 0
  • 1 90°
  • 2 180°
  • 3 270°

Do pomocné části vložíme funkci, která nám z matice 7 x 4 vybere příslušné průsečíky.

=POSUN($M$5;$H6+(($E$12-1)*5);I$5+(($J$12)*3)) =OFFSET($M$5;$H6+(($E$12-1)*5);I$5+(($J$12)*3)) TETRIS v Excel - obrazce výběr a otáčení

Pozice pro ostatní písmena (kostičky) si určitě bez problému doplníte sami. Již teď můžete výběrem písmenka a úhlu měnit obrazec v matici 4x 4. Pokud využijete ověření dat. Už se kostičky žačínají "hejbat" ;)

Jak na posouvání

Otáčet a vybírat umíte, teď začneme posouvat (směry vpravo, vlevo a dolů).

Vybírano máte, teď jen obrazec potřebujeme "rozpohybovat". Ono stačí onu matici (4x4) rozšířit třeba na 10 x 20 (nebo chcete-li, můžete mít větší, či menší). Protože každá buňka hracího pole má adresu (řádek a sloupec), to stejné platí pro matici kostiček (pro posun ji jen přičtete/odeštete sloupce a odečtete řádky). Teď jen k adresám přičteme/odečteme sloupce a řádky (o kolik potřebujeme posunout).

Využijeme formulářové prvky (klikáním si můžete měnit řádky a sloupce), kdy hodnoty při testování můžete měnit. Lze i ručně přepsat číslo (jen formulářové prvky jsou lepší). No a kostičky se vám už hýbou ;).

TETRIS v Excel - obrazce výběr a otáčení

Jak na výběr barev

Tak pohyb kostiček nám funguje, co přidat obrazcům barvy? Jak? Jednoduše přidáme druhou matici (vím šlo by polohu a barvy umístit do stejné, ale jde o to postupně ukázat zábavnou formou co jde s Excel tvořit ;) ), která se bude odkazovat na původní jednobarevou, jen původnímu jednobarevnému obrazci přidá číslo kostičky (tedy barvu pro podmíněné formátování). Jednoduchá podmínka, pokud je v požadovaném místě obrazec, přidám v druhé hrací oblasti do buňky číslo, které odpovídá číslu vybraného obrazce (lze i pomocí písmena, klidně vyzkoušejte).

=KDYŽ(NEBO(BE11=$BR$11;BE11=$BR$12;BE11=$BR$13;BE11=$BR$14);$BR$5;"") =IF(OR(BE11=$BR$11;BE11=$BR$12;BE11=$BR$13;BE11=$BR$14);$BR$5;"") TETRIS v Excel - obrazce barvy

Nad hrací plochou je jen podmíněné formátování. Číslům, neboli obrazcům přiřadíte barvy.

TETRIS v Excel - obrazce barvy podminené formátování nad hrací plochou

Tipy pro vás

Klidně umístěte do jedné pomocné hrací plochy. Zkuste využít místo čísla obrazce písmeno.

Jak zafixovat spadlou kostičku

Pokud kostička dopadne, je potřeba ji nějak zafixovat. Není nic jednoduššího než udělat další pomocnou hrací plochu. Kde budou již spadené kostičky. Neboli teď si připravíme podklady pro VBA makro. Makro po dopadu provede umístění spadlé kostičky do pomocné hrací plochy jako čísla.

TETRIS v Excel - obrazce barvy podminené formátování nad hrací plochou

Chápu šlo by řešit elegantněji, ale jde o učení se funkcím a hrát si s Excel (kdo s Excel pracuje, již má Tetris naprogramován určitě daleko lépe). To, že máme jednu hrací (viditelnou) plochu a k tomu tři pomocné mi nevadí:

  • Hrací plocha kterou uvidíte a která i bude řešit i kolize
  • Jednobarevná první vytvořená
  • Pomocná která kostičce přidá barvu
  • Napadané kostičky

Teď je vám jasné, že když k napadaným kostičkám (v pomocné hrací ploše) přidáte kostičku z pomocné hrací plochy, kde je padající kostička dané barvy, máte napadané kostičky a můžete začít spouštět další kostičku. To ale opět vyřeší VBA makro. Než se ale k němu dostaneme musíme funkcemi vyřešit různé kolize, neboli padající kostička může "vrazit" do již napadaných kostiček, což nechcete. Stejně tak nechcete umísťovat kostičku mimo hrací plochu ;) Naposled chcete mazat plné řady (neboli ošetřit i tento případ).

Jak na výpočet kolize padající kostičky

Potřebujeme vypočíst kolizi padající, kdy dochází ke kolizi s existujicími, nebo-li když padající kostička zasáhne do již existujíci struktury pevných kostiček. No a pro další výpočty a odkazování využijeme písmenko K jako "kolize". Nebo P jako problém ;). Stačí použít vzoreček:

=KDYŽ(CJ12="";KDYŽ(NEBO(BE12=$BR$17;BE12=$BR$18;BE12=$BR$19;BE12=$BR$20);$BR$13;""); KDYŽ(A(NEBO(BE12=$BR$17;BE12=$BR$18;BE12=$BR$19;BE12=$BR$20);CJ12<>"");"K";CJ12)) a andličtině =IF(CJ12="";IF(OR(BE12=$BR$17;BE12=$BR$18;BE12=$BR$19;BE12=$BR$20);$BR$13;""); IF(AND(OR(BE12=$BR$17;BE12=$BR$18;BE12=$BR$19;BE12=$BR$20);CJ12<>"");"K";CJ12)) TETRIS v Excel - výpočet kolize padající

Jak na mazání plné řady

Kostičky padají a VBA potřebuje smazat řadu. Jak poznat, že jí máte smazat? Musí obsahovat všechny kostičky. Opět zjistíte funkcí:

=KDYŽ(POČET(BY28:CH28)=10;"smaž";"") =IF(COUNT(BY28:CH28)=10;"smaž";"")

Při práci s VBA bude výhodné kontrolovat i stav kdy dojde ke kolizi, neboli na malou chvílí Excel bude mít ve výpočtu onu možnou kolizi (do plné řady "jakoby" vrazí padající kostička, díky různým zpožděním pak Excel může nevhodně vyhodnoti, proto ošetřím již teď). Proto pro jistotu budeme počítat i s touto možností. Ono kostička I může být naplacato a těch K je pak v jeden okamžik 4.

=KDYŽ(POČET(BY28:CH28)+COUNTIFS(BY28:CH28;"K")=10;"smaž";"") =IF(COUNT(BY28:CH28)+COUNTIFS(BY28:CH28;"K")=10;"smaž";"") TETRIS v Excel - mazání řad

Kontrola krajů a otáčení

Poslední na co se připravíme. Potřebujeme zkontrolovat, ať se nám nepovede kostičkou vyskočit z hracího pole, ať už při otáčení kostičky tak při klikání a posouvání vpravo nebo vlevo.

Neboli si pohlídáme, zda obrazec nemá méně než 4 čtverečky (tím pádem je jasné, že je mimo hrací plochu). Pokud tato možnost je, nemohu povolit skok vlevo vpravo (což využijeme opět ve VBA), případně nemohu povolit otočení, nebo musím otočit a posunout (já nepovolím otočení, ale klidně povolte otočení jen při otočení ještě kostičku posuňte na patřičnou stranu).

=COUNTIFS(CV11:CZ28;">=1") =COUNTIFS(DA11:DE28;">=1") =DG14+DG12 =KDYŽ(A(DG14=0;DG12<4);"Pozor přičti sloupec";"OK") ' podobně pro druhou stranu. =IF(AND(DG14=0;DG12<4);"Pozor přičti sloupec";"OK") TETRIS v Excel - kontrola obrazců v hraci ploše.

Tak máme za sebou klasické výpočty pro hru Tetris. Přes výběr obrazců a za pomocí formulářových prvků už se prvky v hrací plocha dá hejbat (není to paráda? Přitom bez jediného kódu VBA). Teď přidáme jen VBA pro automatický pohyb a budete mít vlastní Tetris.

Jak vypadá příprava pro VBA

Pokud máte hotovo. Máte připraveno pro programování VBA něco podobného.

TETRIS v Excel - příprava pro VBA.

Chápu, že váš design je podstatně lepší, ale mi jde o princip a funkci.

Články

Chcete se dozvědět více o funkcích, které jsem použil při zpracovávání doporučuji:

Microsoft Excel VBA - stahuj logo

Ke stažení

Soubor jak na Tetris ve VBA je v přípravě.

Závěrem aneb v dalším článku

V následujícím článku si tuto hru rozpohybujeme za využití VBA. Zatím si můžete hrát, než sepíši jak pomocí VBA rozpohybovat.

Článek byl aktualizován: 07.03.2019 19:53

Odměna

Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.


Pavel Lasák - autor webu

Pavel Lasák

Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.

   Pavel Lasák LinkedIn Profil    Pavel Lasák Google+ Profil    Pavel Lasák facebook Profil    Pavel Lasák twitter Profil


Komentáře zatím nejsou

Můžete být prvními co zanechají smysluplný komentář.






Excel


Sdílejte

Pomohl Vám návod?
Sdílejte na Facebooku, G+
LinkedIn...

Nové články


Reklama


TOPlist Licence Creative Commons webarchiv rss XML

Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2019 | 1293

Tento web zatím neprošel jazykovou korekturou. Beta verze redakčního systému.