Jogo

 <!DOCTYPE html>

<html lang="pt-br">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Aventura dos Números - Kids Premium</title>


    <!-- ====== BLOCO DE OCULTAÇÃO DO BLOGGER ====== -->

    <style>

        /* Zera todos os elementos do template */

        html, body, #outer-wrapper, #main-wrapper, #sidebar-wrapper, #footer-wrapper,

        .header, .tabs, .sidebar, .footer, .blog-posts, .date-outer, .post-body,

        .content-wrapper, .main-inner, .main-cap, .footer-inner, .header-inner,

        .navbar, .blog-header, .blog-pager, .feed-links, .comments, .sidebar,

        .column-center, .column-right, .column-left,

        .post, .post-footer, .post-header,

        .blog, .blog-posts, .date-header, .entry, .entry-content,

        .widget, .widget-content, .Blog, .blog-wrapper,

        .skip-navigation, .top-bar, .banner, .ad-container {

            all: initial !important;

            margin: 0 !important;

            padding: 0 !important;

            border: 0 !important;

            background: none !important;

            float: none !important;

            display: block !important;

            width: 100% !important;

            max-width: 100% !important;

            min-height: 0 !important;

            overflow: visible !important;

            font: inherit !important;

            color: inherit !important;

            box-sizing: border-box !important;

        }


        /* Remove todos os elementos que possam aparecer (display:none) */

        .header, .footer, .sidebar, .navbar, .blog-pager, .feed-links,

        .comments, .date-outer, .post-footer, .post-header, .widget,

        .widget-content, .blog-header, .tabs, .main-cap, .footer-inner,

        .header-inner, .main-inner, .column, .column-center, .column-right,

        .column-left, .sidebar-wrapper, #sidebar-wrapper, #footer-wrapper,

        #main-wrapper, #header-wrapper, #navbar, .skip-navigation,

        .blog-posts-container, .post-container, .post-outer,

        #outer-wrapper, .content-wrapper, .post-body, .post, .entry,

        .blog-posts, .date-header, .Blog, .blog-wrapper {

            display: none !important;

        }


        /* Faz o body ocupar a tela toda */

        body {

            display: flex !important;

            align-items: center !important;

            justify-content: center !important;

            margin: 0 !important;

            padding: 0 !important;

            min-height: 100vh !important;

            background: #F0F9FF !important;

            font-family: 'Arial Rounded MT Bold', 'Arial', sans-serif !important;

            touch-action: manipulation !important;

            overflow-x: hidden !important;

        }


        /* Garante que o app-container seja o único elemento visível */

        .app-container {

            display: block !important;

            position: relative !important;

            z-index: 9999 !important;

            width: 95% !important;

            max-width: 600px !important;

            margin: 0 auto !important;

            background: white !important;

            padding: 25px !important;

            border-radius: 40px !important;

            box-shadow: 0 15px 30px rgba(0,0,0,0.1) !important;

            text-align: center !important;

        }


        /* Ajuste para telas pequenas */

        @media (max-width: 600px) {

            .app-container {

                width: 100% !important;

                border-radius: 0 !important;

                padding: 20px !important;

            }

        }

    </style>


    <!-- ====== ESTILOS DO JOGO (ORIGINAL) ====== -->

    <style>

        :root { --p: #FF6B6B; --s: #4ECDC4; --a: #FFE66D; --bg: #F0F9FF; }

        .app-container { /* já definido acima, mas mantido para consistência */ }

        .hidden { display: none !important; }

        input { padding: 15px; width: 85%; margin: 8px 0; border-radius: 20px; border: 2px solid #ddd; font-size: 16px; box-sizing: border-box; }

        button { background: var(--p); color: white; border: none; padding: 20px 30px; font-size: 24px; border-radius: 30px; cursor: pointer; transition: 0.2s; width: 90%; font-weight: bold; margin-top: 15px; }

        button:active { transform: scale(0.95); }

        .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 20px; }

        .btn-opcao { height: 90px; width: 100%; font-size: 36px; background: var(--s); border-radius: 25px; border: none; color: white; cursor: pointer; }

        .btn-opcao:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }

        #display-area { font-size: 40px; margin: 25px 0; min-height: 100px; display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; padding: 10px; }

        #display-area span { display: inline-block; transition: all 0.2s; }

        .contando { background: #FFE66D; border-radius: 10px; transform: scale(1.2); box-shadow: 0 0 15px rgba(255, 230, 109, 0.6); }

        #progresso-bar { width: 100%; height: 20px; background: #eee; border-radius: 10px; margin: 15px 0; overflow: hidden; }

        #progresso-fill { height: 100%; background: var(--s); width: 0%; transition: 0.5s; }

        .confete { position:fixed; width:12px; height:12px; pointer-events:none; z-index:9999; border-radius:3px; }

        @keyframes shake {

            0%, 100% { transform: translateX(0); }

            25% { transform: translateX(-10px); }

            50% { transform: translateX(10px); }

            75% { transform: translateX(-6px); }

        }

        .shake { animation: shake 0.35s; }

        @keyframes fadeInScale {

            0% { opacity: 0; transform: scale(0.5); }

            100% { opacity: 1; transform: scale(1); }

        }

        .btn-opcao { animation: fadeInScale 0.25s ease-out; }

    </style>

</head>

<body>


<div class="app-container" id="app">

    <div id="tela-inicial">

        <h1>🌟 Aventura dos Números</h1>

        <input type="number" id="cfg-max" value="10" placeholder="Números até">

        <input type="number" id="cfg-fases" value="5" placeholder="Quantidade de fases">

        <input type="text" id="cfg-premio" value="Bombom" placeholder="Nome do Prêmio">

        <button onclick="iniciarJogo()">COMEÇAR</button>

    </div>


    <div id="tela-jogo" class="hidden">

        <div id="progresso-txt">Fase 1 de X</div>

        <div id="progresso-bar"><div id="progresso-fill"></div></div>

        <h2 id="pergunta-titulo">Quantos objetos aparecem?</h2>

        <div id="display-area"></div>

        <div id="alternativas" class="grid"></div>

    </div>

</div>


<script>

    // ========== CONFIGURAÇÕES ==========

    const audioCtx = new (window.AudioContext || window.webkitAudioContext)();

    let gameData = { max: 10, fases: 5, atual: 0, correta: 0, premio: '' };

    let rodando = true;

    const objs = ['🍎', '🍌', '🍓', '🍊', '🍇', '🍍', '⭐', '🌸', '🌻', '🌈', '☀️', '🐶', '🐱', '🐰', '🐻', '🦁', '🐠', '🚗', '✈️', '⚽', '🧸', '🍦', '🍕'];

    

    const NUMEROS_EXTENSO = [

        'um', 'dois', 'três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove', 'dez',

        'onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis', 'dezessete', 'dezoito', 'dezenove', 'vinte'

    ];


    // ========== AUXILIARES ==========

    function playSound(type) {

        try {

            if (audioCtx.state === "suspended") audioCtx.resume();

            const osc = audioCtx.createOscillator();

            const g = audioCtx.createGain();

            osc.connect(g); g.connect(audioCtx.destination);

            osc.frequency.value = type === 'acerto' ? 600 : 200;

            g.gain.exponentialRampToValueAtTime(0.0001, audioCtx.currentTime + 0.5);

            osc.start(); osc.stop(audioCtx.currentTime + 0.5);

        } catch(e) {}

    }


    function narrar(texto) {

        window.speechSynthesis.cancel();

        const u = new SpeechSynthesisUtterance(texto);

        u.lang = 'pt-BR';

        u.rate = 0.7;

        window.speechSynthesis.speak(u);

    }


    function soltarConfetes(){

        const cores = ["#ff4d4d", "#4dd2ff", "#ffd633", "#66ff66", "#ff66cc", "#9966ff"];

        for(let i = 0; i < 100; i++){

            const c = document.createElement("div");

            c.className = "confete";

            const x = Math.random() * window.innerWidth;

            const y = Math.random() * -200;

            c.style.left = x + "px";

            c.style.top = y + "px";

            c.style.transform = `translateY(0px) rotate(${Math.random() * 360}deg)`;

            c.style.transition = "transform 1.2s linear";

            setTimeout(() => {

                c.style.transform = `translate(${Math.random()*200 - 100}px, 800px) rotate(${Math.random()*720}deg)`;

            }, 10);

            c.style.background = cores[Math.floor(Math.random() * cores.length)];

            document.body.appendChild(c);

            setTimeout(() => c.remove(), 2000);

        }

    }


    function atualizarProgresso() {

        document.getElementById("progresso-fill").style.width = (gameData.atual / gameData.fases) * 100 + "%";

        document.getElementById("progresso-txt").innerHTML = `Fase ${gameData.atual + 1} de ${gameData.fases}`;

    }


    // ========== LÓGICA DO JOGO ==========

    function iniciarJogo() {

        let max = parseInt(document.getElementById('cfg-max').value);

        let fases = parseInt(document.getElementById('cfg-fases').value);

        gameData.max = (max > 0) ? max : 10;

        gameData.fases = (fases > 0) ? fases : 5;

        gameData.premio = document.getElementById('cfg-premio').value || "Parabéns!";

        gameData.atual = 0;

        rodando = true;

        document.getElementById('tela-inicial').classList.add('hidden');

        document.getElementById('tela-jogo').classList.remove('hidden');

        gerarPergunta();

    }


    function gerarOpcoes() {

        let opts = [gameData.correta];

        while(opts.length < 4) {

            let n = Math.floor(Math.random() * gameData.max) + 1;

            if(!opts.includes(n)) opts.push(n);

        }

        opts.sort(() => Math.random() - 0.5);

        return opts;

    }


    function recriarAlternativas() {

        const altDiv = document.getElementById("alternativas");

        altDiv.innerHTML = "";

        const opts = gerarOpcoes();

        opts.forEach(n => {

            const btn = document.createElement("button");

            btn.className = "btn-opcao";

            btn.textContent = n;

            btn.onclick = () => verificarResposta(n);

            btn.style.animation = 'none';

            altDiv.appendChild(btn);

            void btn.offsetHeight;

            btn.style.animation = 'fadeInScale 0.25s ease-out';

        });

    }


    function gerarPergunta() {

        const target = Math.floor(Math.random() * gameData.max) + 1;

        const icon = objs[Math.floor(Math.random() * objs.length)];

        gameData.correta = target;


        const display = document.getElementById('display-area');

        display.innerHTML = '';

        for (let i = 0; i < target; i++) {

            const span = document.createElement('span');

            span.textContent = icon;

            span.style.fontSize = '40px';

            span.dataset.index = i;

            display.appendChild(span);

        }


        recriarAlternativas();

        atualizarProgresso();


        setTimeout(() => {

            narrar("Quantos objetos aparecem?");

        }, 300);

    }


    function aplicarShake(elemento) {

        elemento.style.animation = 'none';

        void elemento.offsetHeight;

        elemento.style.animation = 'shake 0.35s';

        setTimeout(() => { elemento.style.animation = ''; }, 400);

    }


    function iniciarContagemComFrase(callback) {

        narrar("Você errou, vamos contar juntos...");

        setTimeout(() => {

            contarObjetos(callback);

        }, 3500);

    }


    function contarObjetos(callback) {

        const spans = document.querySelectorAll('#display-area span');

        if (spans.length === 0) { callback(); return; }


        spans.forEach(s => s.classList.remove('contando'));


        let index = 0;

        function next() {

            if (index >= spans.length) {

                spans.forEach(s => s.classList.remove('contando'));

                callback();

                return;

            }

            const span = spans[index];

            span.classList.add('contando');

            const num = index + 1;

            const textoNum = (num <= 20) ? NUMEROS_EXTENSO[num - 1] : num.toString();

            narrar(textoNum);

            index++;

            setTimeout(next, 1200);

        }

        setTimeout(next, 300);

    }


    function verificarResposta(n) {

        if (!rodando) return;


        if (n == gameData.correta) {

            rodando = false;

            playSound("acerto");

            soltarConfetes();

            gameData.atual++;

            setTimeout(() => {

                if (gameData.atual >= gameData.fases) {

                    document.getElementById('tela-jogo').innerHTML = `

                        <h1>🎉 VENCEU!</h1>

                        <p>Prêmio: ${gameData.premio}</p>

                        <button onclick="location.reload()">Jogar Novamente</button>

                    `;

                } else {

                    rodando = true;

                    gerarPergunta();

                }

            }, 1000);

        } else {

            rodando = false;

            playSound("erro");

            const container = document.getElementById("alternativas");

            aplicarShake(container);

            document.querySelectorAll('.btn-opcao').forEach(b => b.disabled = true);


            setTimeout(() => {

                iniciarContagemComFrase(() => {

                    recriarAlternativas();

                    document.querySelectorAll('.btn-opcao').forEach(b => b.disabled = false);

                    rodando = true;

                });

            }, 400);

        }

    }

</script>

</body>

</html>

Comentários