Metaprompt: Funkční hra Tetris v prohlížeči Chrome
Tento metaprompt popisuje kompletní implementaci hry Tetris v prohlížeči, s důrazem na HTML strukturu, CSS stylování (včetně Tailwind CSS) a JavaScriptovou herní logiku. Cílem je vytvořit plně funkční a responzivní hru.
1. Základní požadavky
- Jazyky: HTML5, CSS3 (s Tailwind CSS), JavaScript (ES6+).
- Platforma: Webový prohlížeč (optimalizováno pro Chrome).
- Responzivita: Plně responzivní design pro desktopová i mobilní zařízení.
- Interakce: Ovládání pomocí klávesnice a dotykových tlačítek na obrazovce.
2. HTML Struktura (index.html)
Vytvořte standardní HTML5 dokument s následujícími klíčovými prvky:
<!DOCTYPE html>a základní struktura:<html>,<head>,<body>.- Meta tagy:
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
- Titulek:
<title>Tetris</title> - Import fontu: Google Fonts – ‚Inter‘ (váhy 400, 700).
- Import Tailwind CSS: CDN odkaz
<script src="https://cdn.tailwindcss.com"></script>. - Vlastní CSS styly: Vložené přímo do
<style>tagu v<head>. - Hlavní kontejner hry:
divs třídougame-container.- Bude obsahovat všechny herní prvky.
- Informační panel:
divs třídouinfo-panel.divpro skóre:Skóre: <span id="score">0</span>divpro úroveň:Úroveň: <span id="level">1</span>
- Canvas pro hru:
<canvas id="tetrisCanvas" width="300" height="600"></canvas>- Důležité:
widthaheightbudou dynamicky upraveny JavaScriptem pro responzivitu.
- Důležité:
- Ovládací tlačítka:
divs třídoucontrols.- Tlačítka (
<button>) pro pohyb doleva (id="leftBtn"), otočení (id="rotateBtn"), pohyb doprava (id="rightBtn"). - Tlačítko pro rychlý pád (
id="downBtn") s třídouwidepro roztažení přes celou šířku.
- Tlačítka (
- Overlay pro konec hry:
divs třídougame-over-overlaya počátečnímdisplay: none;.- Nadpis
<h2>KONEC HRY!</h2> - Zobrazení konečného skóre:
<p>Vaše skóre: <span id="finalScore">0</span></p> - Tlačítko pro restart:
<button class="start-button" id="restartBtn">Hrát znovu</button>
- Nadpis
- JavaScript kód: Vložený přímo do
<script>tagu na konci<body>.
3. CSS Stylování (Tailwind a vlastní)
Použijte kombinaci Tailwind CSS tříd a vlastních CSS pravidel pro dosažení moderního a responzivního vzhledu.
body:font-family: 'Inter', sans-serif;background-color: #1a202c;(tmavé pozadí)color: #e2e8f0;(světlý text)- Flexbox pro centrování obsahu (
display: flex,flex-direction: column,justify-content: center,align-items: center,min-height: 100vh). margin: 0; padding: 20px; box-sizing: border-box; overflow: hidden;
.game-container:- Flexbox pro vnitřní uspořádání (
display: flex,flex-direction: column,gap: 20px). background-color: #2d3748;(o něco světlejší tmavé pozadí)padding: 20px; border-radius: 15px; box-shadow: 0 10px 20px rgba(0, 0, 0, 0.5);max-width: 90%; width: 400px; align-items: center;(responzivní šířka)
- Flexbox pro vnitřní uspořádání (
canvas:background-color: #000; border: 5px solid #4a5568; border-radius: 8px;display: block; touch-action: none;(pro dotykové ovládání)width: 100%; max-width: 300px; aspect-ratio: 1/2;(responzivní a udržuje poměr stran)
.info-panel:display: flex; flex-direction: column; gap: 10px; width: 100%; text-align: center;
.score-display,.level-display:font-size: 1.2em; font-weight: bold; color: #a0aec0;
.controls:display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; width: 100%; margin-top: 15px;
.control-button:background-color: #4299e1; color: white; padding: 12px 0; border: none; border-radius: 8px;font-size: 1.1em; font-weight: bold; cursor: pointer;transition: background-color 0.2s, transform 0.1s; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); text-align: center;- Stavy
:hovera:activepro vizuální zpětnou vazbu.
.control-button.wide:grid-column: span 3;.game-over-overlay:position: absolute; top: 0; left: 0; width: 100%; height: 100%;background-color: rgba(0, 0, 0, 0.7);- Flexbox pro centrování obsahu (
display: flex,flex-direction: column,justify-content: center,align-items: center). z-index: 1000; border-radius: 15px; text-align: center;- Styly pro
h2apuvnitř overlay.
.start-button:background-color: #48bb78; color: white; padding: 15px 30px; border: none; border-radius: 10px;font-size: 1.5em; font-weight: bold; cursor: pointer;transition: background-color 0.2s, transform 0.1s; box-shadow: 0 5px 10px rgba(0, 0, 0, 0.4);- Stavy
:hovera:active.
- Responzivní úpravy (
@media (max-width: 600px)):game-containeracanvasúpravy šířky a odsazení.- Menší velikost fontu a padding pro tlačítka a text v overlay.
4. JavaScript Logika
Implementujte herní logiku uvnitř <script> tagu.
- Získání DOM elementů:
canvas,ctx,scoreDisplay,levelDisplay,gameOverOverlay,finalScoreDisplay,restartBtn. - Konstanty hry:
COLS = 10;(počet sloupců hrací plochy)ROWS = 20;(počet řádků hrací plochy)let BLOCK_SIZE;(velikost jednoho bloku, bude dynamicky vypočítána)
- Herní stavové proměnné:
board = [];(2D pole pro hrací plochu)currentPiece;(aktuálně padající kus)nextPiece;(není vizuálně implementováno, ale může být pro budoucí rozšíření)score = 0; level = 1; dropInterval = 1000; lastDropTime = 0; gameOver = false; animationFrameId;
- Definice Tetrominoes:
- Pole objektů
TETROMINOES, každý sshape(2D pole 1 a 0) acolor(hex kód). Zahrňte všechny standardní tvary (I, O, T, S, Z, L, J).
- Pole objektů
- Funkce:
initBoard(): Inicializujeboardnaplněním nulami (prázdné buňky).createPiece():- Náhodně vybere jeden z
TETROMINOES. - Vrátí objekt s
shape,color,x(horizontálně vycentrováno) ay(na začátku 0).
- Náhodně vybere jeden z
drawBlock(x, y, color):- Vykreslí jeden čtvercový blok na canvasu na daných souřadnicích s danou barvou.
- Použije
ctx.fillStyle,ctx.fillRect,ctx.strokeStyle,ctx.strokeRect.
draw():- Vymaže celý canvas (
ctx.clearRect). - Vykreslí všechny usazené bloky z
board. - Vykreslí
currentPiecena jeho aktuální pozici.
- Vymaže celý canvas (
checkCollision(x, y, pieceShape):- Zkontroluje, zda daný tvar kusu na pozici
(x, y)koliduje s hranicemi hrací plochy nebo s již usazenými bloky naboard. - Vrátí
truepři kolizi,falsejinak.
- Zkontroluje, zda daný tvar kusu na pozici
mergePiece():- Spojí
currentPiecesboardtak, že buňky obsazené kusem se vyplní jeho barvou.
- Spojí
clearLines():- Iteruje odspodu hrací plochy.
- Pokud je řádek plný (všechny buňky nejsou 0), odstraní ho z
boarda přidá nový prázdný řádek na začátekboard. - Aktualizuje
scorea voláupdateLevel().
updateLevel():- Zvýší
levelna základěscore(např. každých 500 bodů). - S každou novou úrovní sníží
dropInterval(zvýší rychlost padání).
- Zvýší
dropPiece():- Pokusí se posunout
currentPieceo jeden řádek dolů. - Pokud dojde ke kolizi,
mergePiece(),clearLines(), vytvoří novýcurrentPiece. - Pokud nový
currentPieceokamžitě koliduje, zavoláendGame(). - Zavolá
draw().
- Pokusí se posunout
moveLeft(),moveRight(),rotatePiece():- Implementují pohyb a rotaci kusu.
rotatePiece()by měla obsahovat jednoduchou logiku „wall kick“ pro posun kusu, pokud se po rotaci dotýká stěny.- Vždy volají
draw()po úspěšném pohybu/rotaci.
gameLoop(currentTime):- Hlavní herní smyčka využívající
requestAnimationFrame. - Vypočítá
deltaTimea pokud je větší neždropInterval, zavoládropPiece()a aktualizujelastDropTime.
- Hlavní herní smyčka využívající
endGame():- Nastaví
gameOver = true. - Zobrazí
gameOverOverlaya aktualizujefinalScoreDisplay. - Zruší
animationFrameId(cancelAnimationFrame).
- Nastaví
startGame():- Resetuje všechny herní proměnné na počáteční hodnoty.
- Skryje
gameOverOverlay. - Zavolá
initBoard(),createPiece(). - Nastaví
lastDropTimenaperformance.now(). - Zavolá
draw()a spustígameLoop().
- Event Listenery:
document.addEventListener('keydown', ...): Pro ovládání klávesnicí (ArrowLeft, ArrowRight, ArrowDown, ArrowUp, Space).document.getElementById(...).addEventListener('click', ...): Pro dotyková tlačítka.restartBtn.addEventListener('click', startGame);window.onload:- Nastaví
canvas.widthacanvas.heightdynamicky na základě šířky rodičovského elementu (max 300px), udržuje poměr stran 1:2. - Přepočítá
BLOCK_SIZE. - Zavolá
startGame().
- Nastaví
window.addEventListener('resize', ...):- Při změně velikosti okna znovu nastaví rozměry canvasu a přepočítá
BLOCK_SIZE. - Zavolá
draw()pro překreslení.
- Při změně velikosti okna znovu nastaví rozměry canvasu a přepočítá
5. Herní Mechaniky
- Padání kusů: Automatické padání kusů v pravidelných intervalech.
- Detekce kolizí: Zajištění, že kusy nepřekročí hranice hrací plochy a neprojdou skrz usazené bloky.
- Mazání řádků: Detekce a odstranění plných řádků, posun zbývajících bloků dolů.
- Bodování: Přidělování bodů za vymazané řádky.
- Progres úrovně: Zvyšování úrovně a rychlosti padání s rostoucím skóre.
- Konec hry: Hra končí, když nový kus nemůže být umístěn na hrací plochu.
- Rotace s „wall kick“: Možnost rotace kusu a jednoduchá logika pro posun kusu, pokud by se po rotaci dostal mimo hranice.