Zpět na domů

AI pro webové hry: výuka kódování

Článek popisuje metodu výuky školáků vytváření webových her pomocí AI. Podrobný prompt pro Gemini generuje kompletní kód hry typu Whac-A-Mole na HTML/CSS/JS. Zdůrazňuje se důležitost přípravy: čtení kódu a návrh na papíře.

Vytváříme hru s AI: od promptu po kód
Advertisement 728x90

Umělá inteligence jako nástroj pro tvorbu webových her: zkušenost s výukou školáků

Školáci již zvládli základy HTML a CSS. Před použitím umělé inteligence bylo nutné rozvinout dovednost čtení cizího kódu. Úkol: otevřít soubor s komentáři, změnit hodnotu background-color na určeném řádku, uložit a obnovit stránku v prohlížeči. Tento přístup umožňuje rychle spojit změny v kódu s vizuálním výsledkem, čímž snižuje obavy z cizích zdrojů.

Následně jsme přešli k návrhu na papíře. Zvolili jsme mechaniku hry typu Whac-A-Mole s personalizací: místo standardních objektů fotografie žáků v normálním stavu a s nafouknutými tvářemi při aktivaci.

Logika hry a výběr technologií

Základní prvky mechaniky:

Google AdInline article slot
  • Mřížka 3×3 z buněk (nory).
  • Náhodné objevení aktivního obrázku každých 5 sekund.
  • Zvyšování rychlosti s každým cyklem.
  • Kliknutí na aktivní buňku ji vrátí do normálního stavu.
  • Prohra: všech 9 buněk je aktivních současně – blokování vstupu na 5 sekund, blikání, modální okno s restartem.

Technologie: čisté HTML, CSS, JavaScript v jednom souboru. Výhody pro výuku:

  • Žádná konfigurace prostředí – stačí prohlížeč.
  • Okamžitá zpětná vazba při F5.
  • Úplná přenositelnost: jeden HTML soubor funguje všude.

Pro prototyp jsme použili obrázky koťat: základní a s reakcí (vygenerovány umělou inteligencí podle promptu).

Tvorba efektivního promptu

Umělá inteligence je vnímána jako výkonný nástroj, který vyžaduje podrobný popis. Společně s dětmi jsme sestavili prompt pro Gemini:

Google AdInline article slot

Podrobný popis:

  • Role: zkušený frontendový vývojář.
  • Hra: obdoba Whac-A-Mole s fotografiemi (normální a s tvářemi).
  • Styl: světlé pozadí, vycentrování.
  • Herní pole: bílý panel 3×3 se zaoblenými rohy a stínem.
  • Buňky: 9 obrázků s efektem stisknutí, responzivita pro mobilní zařízení.
  • 18 souborů: photo1_normal.jpg ... photo9_highlighted.jpg.
  • Logika: časovače, zrychlení, konec hry, modální okno s rozostřením.
  • Požadavky: jeden soubor, moderní JavaScript, komentáře, bez zvýraznění na mobilech.

Výsledek: hotový kód hry

Umělá inteligence vydala funkční prototyp během sekund. Po minimálních úpravách vznikl finální produkt. Kód využívá CSS proměnné, Flexbox/Grid, backdrop-filter, moderní přechody a media queries.

<!DOCTYPE html>
<html lang="cs">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Koťátka!</title>
    <style>
        /* Proměnné pro snadnou úpravu velikostí a barev na jednom místě */
        :root {
            --bg-color: #f0f2f5;   /* Světlé šedé pozadí */
            --grid-gap: 15px;      /* Vzdálenost mezi kartami */
            --cell-size: 180px;    /* Základní velikost čtverce s fotografií */
            --text-color: #333;    /* Tmavě šedá barva pro text */
        }

        /* Hlavní nastavení obrazovky */
        body {
            margin: 0;
            padding: 0;
            display: flex;          /* Použití Flexboxu pro zarovnání */
            justify-content: center; /* Vycentrování horizontálně */
            align-items: center;     /* Vycentrování vertikálně */
            min-height: 100vh;      /* Výška rovna oknu prohlížeče */
            background-color: var(--bg-color);
            font-family: 'Segoe UI', Tahoma, sans-serif;
            overflow: hidden;       /* Zakázání posouvání */
            user-select: none;      /* Zakázání výběru při rychlých kliknutích */
            -webkit-tap-highlight-color: transparent; /* Odstranění modrého zvýraznění při dotyku na mobilu */
        }

        /* Hlavní kontejner pro instrukce a hru */
        .main-wrapper {
            display: flex;
            flex-direction: column; /* Naskládání textu a mřížky vertikálně */
            align-items: center;    /* Vycentrování horizontálně */
        }

        /* Styly pro textové instrukce */
        .instructions {
            text-align: center;     /* Vycentrování textu */
            color: var(--text-color);
            font-size: 1.8rem;
            line-height: 1.4;       /* Řádkování pro dva řádky */
            margin-bottom: 25px;    /* Odstup od textu k hernímu poli */
            font-weight: 500;
        }

        /* Kontejner herní mřížky 3x3 */
        .game-container {
            display: grid;
            grid-template-columns: repeat(3, 1fr); /* 3 stejné sloupce */
            grid-template-rows: repeat(3, 1fr);    /* 3 stejné řádky */
            gap: var(--grid-gap);
            padding: 20px;
            background: white;       /* Bílé pozadí pod mřížkou */
            border-radius: 24px;     /* Zaoblení hlavní desky */
            box-shadow: 0 10px 40px rgba(0,0,0,0.08); /* Jemný stín pro objem */
            position: relative;
        }

        /* Stav zablokování: zakázání kliknutí při konci hry */
        .game-container.disabled {
            pointer-events: none;    /* Ignorování vstupů myši/dotyku */
        }

        /* Obal pro každou fotografii */
        .cell {
            width: var(--cell-size);
            height: var(--cell-size);
            overflow: hidden;        /* Oříznutí okrajů fotografie */
            border-radius: 16px;     /* Zaoblení rohů fotografie */
            cursor: pointer;
            transition: transform 0.1s ease; /* Plynulá animace při kliknutí */
            background: #f9f9f9;     /* Barva pozadí při načítání */
        }

        /* Efekt kliknutí: karta se mírně zmenší */
        .cell:active {
            transform: scale(0.96);
        }

        /* Skutečný obrázek uvnitř buňky */
        .cell img {
            width: 100%;
            height: 100%;
            object-fit: cover;       /* Vyplnění čtverce bez zkreslení */
            display: block;
        }

        /* Modální okno na celou obrazovku */
        #modal {
            display: none;           /* Skryto ve výchozím nastavení */
            position: fixed;         /* Upevněno nad veškerým obsahem */
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(255, 255, 255, 0.01); /* Průhledné pozadí */
            backdrop-filter: blur(15px);          /* Hlavní efekt: rozostření pozadí */
            -webkit-backdrop-filter: blur(15px);  /* Podpora rozostření v Safari */
            justify-content: center; /* Vycentrování obsahu horizontálně */
            align-items: center;     /* Vycentrování obsahu vertikálně */
            z-index: 100;            /* Přenesení do popředí */
        }

        /* Bílá karta uvnitř modálního okna */
        .modal-content {
            background: white;
            padding: 50px;
            border-radius: 30px;
            text-align: center;
            box-shadow: 0 15px 60px rgba(0,0,0,0.15); /* Hluboký stín pro důraz */
            border: 1px solid rgba(255,255,255,0.3);
        }

        .modal-content h2 {
            margin: 0 0 30px 0;
            font-size: 28px;
            color: #222;
        }

        /* Tlačítko restartu */
        .modal-content button {
            background: #222;        /* Tmavé stylové tlačítko */
            color: white;
            border: none;
            padding: 16px 50px;
            font-size: 18px;
            border-radius: 14px;
            cursor: pointer;
            transition: all 0.2s ease;
        }

        .modal-content button:hover {
            background: #000;
            transform: translateY(-2px); /* Efekt vznášení při najetí myší */
            box-shadow: 0 5px 15px rgba(0,0,0,0.2);
        }

        /* Přizpůsobení pro mobilní zařízení */
        @media (max-width: 650px) {
            :root {
                --cell-size: 28vw;   /* Velikost závisí na šířce obrazovky */
            }
        }
    </style>
</head>
<body>
    <div class="main-wrapper">
        <div class="instructions">Klikni na koťátka s nafouknutými tvářemi!</div>
        <div class="game-container" id="gameContainer">
            <!-- 9 buněk bude vygenerováno JavaScriptem -->
        </div>
    </div>

    <div id="modal">
        <div class="modal-content">
            <h2>😿 Všechna koťátka mají nafouknuté tváře!</h2>
            <p>Zkusíš to znovu?</p>
            <button onclick="resetGame()">Ano!</button>
        </div>
    </div>

    <script>
        // Proměnné stavu hry
        let gameActive = true;
        let activeCell = null;
        let intervalId = null;
        let speed = 5000; // Počátečních 5 sekund
        let highlightedCount = 0;
        const cells = [];
        const totalCells = 9;

        // Obrázky: nahraďte svými photo_normal.jpg a photo_highlighted.jpg
        const images = {
            1: { normal: 'photo1_normal.jpg', highlighted: 'photo1_highlighted.jpg' },
            2: { normal: 'photo2_normal.jpg', highlighted: 'photo2_highlighted.jpg' },
            // ... až do 9
        };

        // Inicializace hry
        function initGame() {
            const container = document.getElementById('gameContainer');
            container.innerHTML = '';
            cells.length = 0;
            highlightedCount = 0;

            for (let i = 1; i <= totalCells; i++) {
                const cell = document.createElement('div');
                cell.className = 'cell';
                cell.dataset.index = i;
                const img = document.createElement('img');
                img.src = images[i].normal;
                img.alt = `Koťátko ${i}`;
                cell.appendChild(img);
                cell.addEventListener('click', handleClick);
                container.appendChild(cell);
                cells.push(cell);
            }

            startGameLoop();
        }

        // Herní smyčka: aktivace náhodné buňky
        function startGameLoop() {
            if (intervalId) clearInterval(intervalId);
            intervalId = setInterval(() => {
                if (!gameActive || highlightedCount >= totalCells) return;
                
                const availableCells = cells.filter(cell => !cell.classList.contains('highlighted'));
                if (availableCells.length === 0) return;
                
                const randomCell = availableCells[Math.floor(Math.random() * availableCells.length)];
                activateCell(randomCell);
            }, speed);
        }

        // Aktivace buňky (nafouknutí tváří)
        function activateCell(cell) {
            cell.classList.add('highlighted');
            const img = cell.querySelector('img');
            img.src = images[parseInt(cell.dataset.index)].highlighted;
            highlightedCount++;
            
            if (highlightedCount >= totalCells) {
                gameOver();
            }
        }

        // Zpracování kliknutí: reset buňky
        function handleClick(e) {
            const cell = e.currentTarget;
            if (!cell.classList.contains('highlighted') || !gameActive) return;
            
            cell.classList.remove('highlighted');
            const img = cell.querySelector('img');
            img.src = images[parseInt(cell.dataset.index)].normal;
            highlightedCount--;
        }

        // Sekvence konce hry
        function gameOver() {
            gameActive = false;
            clearInterval(intervalId);
            
            const container = document.getElementById('gameContainer');
            container.classList.add('disabled');
            
            // Blikání všech buněk
            const blinkInterval = setInterval(() => {
                cells.forEach(cell => {
                    const img = cell.querySelector('img');
                    const index = parseInt(cell.dataset.index);
                    img.src = cell.classList.contains('blinking') ? 
                        images[index].normal : images[index].highlighted;
                    cell.classList.toggle('blinking');
                });
            }, 500);
            
            setTimeout(() => {
                clearInterval(blinkInterval);
                document.getElementById('modal').style.display = 'flex';
            }, 5000);
        }

        // Restart hry
        function resetGame() {
            document.getElementById('modal').style.display = 'none';
            document.getElementById('gameContainer').classList.remove('disabled');
            speed = Math.max(1000, speed - 500); // Zvýšení obtížnosti
            gameActive = true;
            initGame();
        }

        // Spuštění hry při načtení
        window.addEventListener('load', initGame);
    </script>
</body>
</html>

Co je důležité

  • Podrobný prompt urychluje generování: Určení role, stylu, mechaniky a požadavků na kód dává funkční prototyp během sekund.
  • Čtení kódu před umělou inteligencí: Základní dovednost analýzy snižuje bariéru pro experimenty.
  • Návrh na papíře: Vizualizace logiky před kódováním zjednodušuje úkol pro umělou inteligenci.
  • Jeden soubor pro vše: Ideální pro výuku a šíření.
  • Responzivita a efekty: CSS Grid, proměnné, backdrop-filter zajišťují moderní uživatelský zážitek.

— Editorial Team

Google AdInline article slot
Advertisement 728x90

Číst dál