{"id":2140,"date":"2025-03-24T21:59:18","date_gmt":"2025-03-24T21:59:18","guid":{"rendered":"https:\/\/senorwok.com\/?page_id=2140"},"modified":"2025-03-24T22:00:20","modified_gmt":"2025-03-24T22:00:20","slug":"juego-senor-wok","status":"publish","type":"page","link":"https:\/\/senorwok.com\/index.php\/juego-senor-wok\/","title":{"rendered":"Juego se\u00f1or wok"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2140\" class=\"elementor elementor-2140\">\n\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3efbf12 e-flex e-con-boxed e-con e-parent\" data-id=\"3efbf12\" data-element_type=\"container\" data-settings=\"{&quot;content_width&quot;:&quot;boxed&quot;}\" data-core-v316-plus=\"true\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-209d797 elementor-widget elementor-widget-html\" data-id=\"209d797\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>P\u00e1jaro Volador Pro<\/title>\r\n    <style>\r\n        :root {\r\n            --color-primary: #FFD700;\r\n            --color-secondary: #2E8B57;\r\n            --color-background: #87CEEB;\r\n            --color-text: #333;\r\n            --color-accent: #FF4500;\r\n        }\r\n        \r\n        body {\r\n            font-family: 'Arial Rounded MT Bold', 'Arial', sans-serif;\r\n            display: flex;\r\n            margin: 0;\r\n            padding: 0;\r\n            background-color: var(--color-background);\r\n            overflow: hidden;\r\n        }\r\n        \r\n        #game-container {\r\n            position: relative;\r\n            width: 800px;\r\n            height: 600px;\r\n            border: 3px solid #000;\r\n            border-radius: 10px;\r\n            overflow: hidden;\r\n            background: linear-gradient(to bottom, var(--color-background) 0%, #E0F7FA 100%);\r\n            box-shadow: 0 0 20px rgba(0,0,0,0.3);\r\n        }\r\n        \r\n        #bird {\r\n            position: absolute;\r\n            width: 40px;\r\n            height: 30px;\r\n            background-color: var(--color-primary);\r\n            border-radius: 50% 50% 50% 50% \/ 60% 60% 40% 40%;\r\n            top: 300px;\r\n            left: 100px;\r\n            z-index: 10;\r\n            transition: transform 0.1s;\r\n            box-shadow: 2px 2px 5px rgba(0,0,0,0.3);\r\n        }\r\n        \r\n        .obstacle {\r\n            position: absolute;\r\n            width: 60px;\r\n            background-color: var(--color-secondary);\r\n            border: 2px solid #006400;\r\n            box-shadow: inset 0 0 10px rgba(0,0,0,0.2);\r\n            z-index: 5;\r\n        }\r\n        \r\n        #game-info {\r\n            position: absolute;\r\n            top: 10px;\r\n            left: 10px;\r\n            background-color: rgba(255, 255, 255, 0.8);\r\n            padding: 8px 15px;\r\n            border-radius: 20px;\r\n            font-weight: bold;\r\n            box-shadow: 0 0 10px rgba(0,0,0,0.2);\r\n            z-index: 20;\r\n        }\r\n        \r\n        #start-screen, #game-over, #qr-generator, #qr-login {\r\n            position: absolute;\r\n            top: 0;\r\n            left: 0;\r\n            width: 100%;\r\n            height: 100%;\r\n            background-color: rgba(0, 0, 0, 0.85);\r\n            display: flex;\r\n            flex-direction: column;\r\n            justify-content: center;\r\n            align-items: center;\r\n            color: white;\r\n            z-index: 100;\r\n            backdrop-filter: blur(5px);\r\n        }\r\n        \r\n        button {\r\n            padding: 12px 25px;\r\n            font-size: 18px;\r\n            margin-top: 15px;\r\n            cursor: pointer;\r\n            background-color: var(--color-accent);\r\n            color: white;\r\n            border: none;\r\n            border-radius: 30px;\r\n            transition: all 0.3s;\r\n            font-weight: bold;\r\n            box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n        }\r\n        \r\n        button:hover {\r\n            background-color: #FF5722;\r\n            transform: translateY(-2px);\r\n            box-shadow: 0 6px 8px rgba(0,0,0,0.15);\r\n        }\r\n        \r\n        button:active {\r\n            transform: translateY(1px);\r\n        }\r\n        \r\n        input {\r\n            padding: 10px 15px;\r\n            font-size: 16px;\r\n            margin-bottom: 15px;\r\n            width: 250px;\r\n            border: none;\r\n            border-radius: 30px;\r\n            text-align: center;\r\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\r\n        }\r\n        \r\n        #leaderboard {\r\n            margin-top: 30px;\r\n            background-color: rgba(255,255,255,0.1);\r\n            padding: 15px;\r\n            border-radius: 15px;\r\n            width: 80%;\r\n            max-height: 200px;\r\n            overflow-y: auto;\r\n        }\r\n        \r\n        .player-score {\r\n            padding: 8px;\r\n            border-bottom: 1px solid rgba(255,255,255,0.2);\r\n            transition: background-color 0.3s;\r\n        }\r\n        \r\n        .player-score:hover {\r\n            background-color: rgba(255,255,255,0.1);\r\n        }\r\n        \r\n        .highlight {\r\n            font-weight: bold;\r\n            color: var(--color-primary);\r\n            background-color: rgba(255,215,0,0.1);\r\n        }\r\n        \r\n        #score-board {\r\n            width: 280px;\r\n            padding: 20px;\r\n            background-color: #f8f8f8;\r\n            border-left: 1px solid #ddd;\r\n            overflow-y: auto;\r\n            box-shadow: -5px 0 15px rgba(0,0,0,0.1);\r\n        }\r\n        \r\n        #scanner-container {\r\n            position: fixed;\r\n            top: 0;\r\n            left: 0;\r\n            width: 100%;\r\n            height: 100%;\r\n            background-color: rgba(0,0,0,0.9);\r\n            display: none;\r\n            justify-content: center;\r\n            align-items: center;\r\n            z-index: 1000;\r\n            flex-direction: column;\r\n        }\r\n        \r\n        #scanner-video {\r\n            max-width: 90%;\r\n            max-height: 70%;\r\n            border-radius: 10px;\r\n            margin-bottom: 20px;\r\n        }\r\n        \r\n        #close-scanner {\r\n            color: white;\r\n            font-size: 30px;\r\n            cursor: pointer;\r\n            background-color: var(--color-accent);\r\n            width: 50px;\r\n            height: 50px;\r\n            display: flex;\r\n            justify-content: center;\r\n            align-items: center;\r\n            border-radius: 50%;\r\n            margin-top: 20px;\r\n        }\r\n        \r\n        .particle {\r\n            position: absolute;\r\n            background-color: var(--color-primary);\r\n            border-radius: 50%;\r\n            pointer-events: none;\r\n            z-index: 15;\r\n        }\r\n        \r\n        .power-up {\r\n            position: absolute;\r\n            width: 30px;\r\n            height: 30px;\r\n            background-color: #FF4500;\r\n            border-radius: 50%;\r\n            z-index: 8;\r\n            animation: pulse 1.5s infinite;\r\n        }\r\n        \r\n        @keyframes pulse {\r\n            0% { transform: scale(1); }\r\n            50% { transform: scale(1.2); }\r\n            100% { transform: scale(1); }\r\n        }\r\n        \r\n        #weather {\r\n            position: absolute;\r\n            top: 0;\r\n            left: 0;\r\n            width: 100%;\r\n            height: 100%;\r\n            pointer-events: none;\r\n            z-index: 1;\r\n        }\r\n        \r\n        .rain {\r\n            position: absolute;\r\n            width: 2px;\r\n            height: 15px;\r\n            background-color: rgba(255,255,255,0.6);\r\n            animation: rain linear infinite;\r\n        }\r\n        \r\n        @keyframes rain {\r\n            to { transform: translateY(600px); }\r\n        }\r\n        \r\n        #theme-toggle {\r\n            position: absolute;\r\n            top: 20px;\r\n            right: 20px;\r\n            background: none;\r\n            border: none;\r\n            font-size: 24px;\r\n            cursor: pointer;\r\n            z-index: 200;\r\n            color: white;\r\n        }\r\n        \r\n        .night-mode {\r\n            --color-primary: #FFA500;\r\n            --color-secondary: #1E5631;\r\n            --color-background: #0F2027;\r\n            --color-text: #FFF;\r\n            --color-accent: #FF8C00;\r\n            filter: brightness(0.8) contrast(1.2);\r\n        }\r\n        \r\n        #bird.wings-up {\r\n            transform: rotate(-15deg);\r\n        }\r\n        \r\n        #bird.wings-down {\r\n            transform: rotate(15deg);\r\n        }\r\n        \r\n        @keyframes shake {\r\n            0%, 100% { transform: translateX(0); }\r\n            25% { transform: translateX(-5px); }\r\n            75% { transform: translateX(5px); }\r\n        }\r\n        \r\n        .shake {\r\n            animation: shake 0.2s linear 3;\r\n        }\r\n    <\/style>\r\n    <script src=\"https:\/\/cdn.rawgit.com\/davidshimjs\/qrcodejs\/gh-pages\/qrcode.min.js\"><\/script>\r\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/jsqr@1.4.0\/dist\/jsQR.min.js\"><\/script>\r\n<\/head>\r\n<body>\r\n    <button id=\"theme-toggle\">\ud83c\udf13<\/button>\r\n    \r\n    <div id=\"game-container\">\r\n        <div id=\"weather\"><\/div>\r\n        <div id=\"bird\"><\/div>\r\n        <div id=\"game-info\">\r\n            <div>\u23f1\ufe0f <span id=\"time\">0<\/span>s<\/div>\r\n            <div>\u2b50 <span id=\"score\">0<\/span><\/div>\r\n            <div>\ud83d\ude80 <span id=\"level\">1<\/span><\/div>\r\n            <div>\ud83d\udc8e <span id=\"gems\">0<\/span><\/div>\r\n        <\/div>\r\n        \r\n        <div id=\"start-screen\">\r\n            <h1 style=\"font-size: 3em; text-shadow: 0 0 10px var(--color-primary);\">P\u00e1jaro Volador PRO<\/h1>\r\n            <input type=\"text\" id=\"player-name\" placeholder=\"Ingresa tu nombre\" required>\r\n            <div style=\"display: flex; align-items: center; margin-bottom: 15px;\">\r\n                <input type=\"text\" id=\"game-code\" placeholder=\"C\u00f3digo de acceso\" required>\r\n                <span class=\"camera-icon\" id=\"open-scanner\" style=\"font-size: 28px; margin-left: 10px; cursor: pointer;\">\ud83d\udcf7<\/span>\r\n            <\/div>\r\n            <button id=\"start-button\">\ud83d\ude80 Comenzar<\/button>\r\n            <button id=\"qr-generator-button\">\ud83d\udd11 Generador de C\u00f3digos<\/button>\r\n            <div id=\"leaderboard\">\r\n                <h3>\ud83c\udfc6 Top 10 Jugadores<\/h3>\r\n                <div id=\"top-players\"><\/div>\r\n            <\/div>\r\n        <\/div>\r\n        \r\n        <div id=\"qr-generator\" style=\"display: none;\">\r\n            <h1>\ud83d\udd10 Generador de C\u00f3digos<\/h1>\r\n            <input type=\"text\" id=\"admin-user\" placeholder=\"Usuario\" required>\r\n            <input type=\"password\" id=\"admin-password\" placeholder=\"Contrase\u00f1a\" required>\r\n            <button id=\"login-admin\">\ud83d\udd13 Ingresar<\/button>\r\n            <button id=\"back-to-game\">\u21a9\ufe0f Volver al juego<\/button>\r\n        <\/div>\r\n        \r\n        <div id=\"qr-login\" style=\"display: none;\">\r\n            <h1>\u2728 Generar C\u00f3digos<\/h1>\r\n            <button id=\"generate-codes\">\ud83c\udfb0 Generar 50 C\u00f3digos<\/button>\r\n            <div id=\"generated-codes\" style=\"background: rgba(255,255,255,0.1); padding: 15px; border-radius: 10px; max-height: 200px; overflow-y: auto; margin: 15px 0; width: 80%;\"><\/div>\r\n            <button id=\"download-pdf\">\ud83d\udcc4 Descargar PDF<\/button>\r\n            <button id=\"back-to-game-2\">\u21a9\ufe0f Volver al juego<\/button>\r\n        <\/div>\r\n        \r\n        <div id=\"game-over\" style=\"display: none;\">\r\n            <h1 style=\"color: var(--color-accent);\">\ud83d\udc80 Game Over<\/h1>\r\n            <div id=\"final-score\" style=\"font-size: 1.5em;\">\u2b50 Puntuaci\u00f3n: 0<\/div>\r\n            <div id=\"gems-earned\" style=\"font-size: 1.2em; margin: 10px 0;\">\ud83d\udc8e Gemas obtenidas: 0<\/div>\r\n            <button id=\"restart-button\">\ud83d\udd04 Jugar de nuevo<\/button>\r\n            <button id=\"return-to-menu\">\ud83c\udfe0 Men\u00fa principal<\/button>\r\n        <\/div>\r\n    <\/div>\r\n    \r\n    <div id=\"score-board\">\r\n        <h2>\ud83d\udcca Puntuaciones<\/h2>\r\n        <div id=\"current-player\"><\/div>\r\n        <div id=\"all-players\"><\/div>\r\n    <\/div>\r\n    \r\n    <div id=\"scanner-container\">\r\n        <video id=\"scanner-video\" playsinline><\/video>\r\n        <div id=\"close-scanner\">\u2715<\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n        \/\/ Variables del juego\r\n        const bird = document.getElementById('bird');\r\n        const gameContainer = document.getElementById('game-container');\r\n        const gameInfo = document.getElementById('game-info');\r\n        const timeDisplay = document.getElementById('time');\r\n        const scoreDisplay = document.getElementById('score');\r\n        const levelDisplay = document.getElementById('level');\r\n        const gemsDisplay = document.getElementById('gems');\r\n        const startScreen = document.getElementById('start-screen');\r\n        const gameOverScreen = document.getElementById('game-over');\r\n        const startButton = document.getElementById('start-button');\r\n        const restartButton = document.getElementById('restart-button');\r\n        const returnToMenuButton = document.getElementById('return-to-menu');\r\n        const playerNameInput = document.getElementById('player-name');\r\n        const gameCodeInput = document.getElementById('game-code');\r\n        const finalScoreDisplay = document.getElementById('final-score');\r\n        const gemsEarnedDisplay = document.getElementById('gems-earned');\r\n        const topPlayersList = document.getElementById('top-players');\r\n        const currentPlayerDisplay = document.getElementById('current-player');\r\n        const allPlayersDisplay = document.getElementById('all-players');\r\n        const qrGeneratorButton = document.getElementById('qr-generator-button');\r\n        const qrGeneratorScreen = document.getElementById('qr-generator');\r\n        const qrLoginScreen = document.getElementById('qr-login');\r\n        const adminUserInput = document.getElementById('admin-user');\r\n        const adminPasswordInput = document.getElementById('admin-password');\r\n        const loginAdminButton = document.getElementById('login-admin');\r\n        const backToGameButton = document.getElementById('back-to-game');\r\n        const backToGameButton2 = document.getElementById('back-to-game-2');\r\n        const generateCodesButton = document.getElementById('generate-codes');\r\n        const generatedCodesDiv = document.getElementById('generated-codes');\r\n        const downloadPdfButton = document.getElementById('download-pdf');\r\n        const openScannerButton = document.getElementById('open-scanner');\r\n        const scannerContainer = document.getElementById('scanner-container');\r\n        const scannerVideo = document.getElementById('scanner-video');\r\n        const closeScannerButton = document.getElementById('close-scanner');\r\n        const themeToggleButton = document.getElementById('theme-toggle');\r\n        const weatherContainer = document.getElementById('weather');\r\n        \r\n        let gameRunning = false;\r\n        let birdY = 300;\r\n        let birdVelocity = 0;\r\n        let gravity = 0.5;\r\n        let jumpForce = -10;\r\n        let obstacles = [];\r\n        let powerUps = [];\r\n        let score = 0;\r\n        let gems = 0;\r\n        let level = 1;\r\n        let time = 0;\r\n        let gameSpeed = 5;\r\n        let obstacleInterval = 1500;\r\n        let powerUpInterval = 10000;\r\n        let lastObstacleTime = 0;\r\n        let lastPowerUpTime = 0;\r\n        let gameTimeInterval;\r\n        let gameLoopId;\r\n        let playerName = '';\r\n        let generatedCodes = [];\r\n        let scannerStream = null;\r\n        let isNightMode = false;\r\n        let wingState = 'up';\r\n        \r\n        \/\/ Datos de jugadores y c\u00f3digos\r\n        let players = JSON.parse(localStorage.getItem('birdGamePlayers')) || [];\r\n        let accessCodes = JSON.parse(localStorage.getItem('birdGameAccessCodes')) || [];\r\n        \r\n        \/\/ Inicializar el juego\r\n        initGame();\r\n        \r\n        function initGame() {\r\n            updateLeaderboard();\r\n            setupEventListeners();\r\n            createWeatherEffect('sunny');\r\n        }\r\n        \r\n        function setupEventListeners() {\r\n            startButton.addEventListener('click', startGame);\r\n            restartButton.addEventListener('click', restartGame);\r\n            returnToMenuButton.addEventListener('click', returnToMenu);\r\n            qrGeneratorButton.addEventListener('click', showQrGenerator);\r\n            loginAdminButton.addEventListener('click', loginAdmin);\r\n            backToGameButton.addEventListener('click', backToGame);\r\n            backToGameButton2.addEventListener('click', backToGame);\r\n            generateCodesButton.addEventListener('click', generateCodes);\r\n            downloadPdfButton.addEventListener('click', downloadPdf);\r\n            openScannerButton.addEventListener('click', openScanner);\r\n            closeScannerButton.addEventListener('click', closeScanner);\r\n            themeToggleButton.addEventListener('click', toggleTheme);\r\n            document.addEventListener('keydown', handleKeyPress);\r\n            gameContainer.addEventListener('click', handleJump);\r\n        }\r\n        \r\n        \/\/ ================= FUNCIONES DEL JUEGO ================= \/\/\r\n        \r\n        function showQrGenerator() {\r\n            startScreen.style.display = 'none';\r\n            qrGeneratorScreen.style.display = 'flex';\r\n        }\r\n        \r\n        function backToGame() {\r\n            qrGeneratorScreen.style.display = 'none';\r\n            qrLoginScreen.style.display = 'none';\r\n            startScreen.style.display = 'flex';\r\n        }\r\n        \r\n        function loginAdmin() {\r\n            const username = adminUserInput.value.trim();\r\n            const password = adminPasswordInput.value.trim();\r\n            \r\n            if (username === 'admin' && password === '12mario12') {\r\n                qrGeneratorScreen.style.display = 'none';\r\n                qrLoginScreen.style.display = 'flex';\r\n                adminUserInput.value = '';\r\n                adminPasswordInput.value = '';\r\n            } else {\r\n                alert('Usuario o contrase\u00f1a incorrectos');\r\n            }\r\n        }\r\n        \r\n        function generateCodes() {\r\n            generatedCodes = [];\r\n            generatedCodesDiv.innerHTML = '';\r\n            \r\n            for (let i = 0; i < 50; i++) {\r\n                const code = generateRandomCode();\r\n                generatedCodes.push(code);\r\n                \r\n                const codeElement = document.createElement('div');\r\n                codeElement.textContent = `${i + 1}. ${code}`;\r\n                generatedCodesDiv.appendChild(codeElement);\r\n            }\r\n            \r\n            accessCodes = accessCodes.concat(generatedCodes.map(code => {\r\n                return { code: code, used: false };\r\n            }));\r\n            localStorage.setItem('birdGameAccessCodes', JSON.stringify(accessCodes));\r\n        }\r\n        \r\n        function generateRandomCode() {\r\n            const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\r\n            let result = '';\r\n            for (let i = 0; i < 8; i++) {\r\n                result += chars.charAt(Math.floor(Math.random() * chars.length));\r\n            }\r\n            return result;\r\n        }\r\n        \r\n        function downloadPdf() {\r\n            if (generatedCodes.length === 0) {\r\n                alert('Primero genera los c\u00f3digos');\r\n                return;\r\n            }\r\n            \r\n            const { jsPDF } = window.jspdf;\r\n            const doc = new jsPDF();\r\n            \r\n            doc.text('C\u00f3digos de acceso para P\u00e1jaro Volador PRO', 10, 10);\r\n            doc.text('Fecha de generaci\u00f3n: ' + new Date().toLocaleDateString(), 10, 20);\r\n            \r\n            let y = 30;\r\n            generatedCodes.forEach((code, index) => {\r\n                if (y > 280) {\r\n                    doc.addPage();\r\n                    y = 10;\r\n                }\r\n                doc.text(`${index + 1}. ${code}`, 10, y);\r\n                y += 10;\r\n            });\r\n            \r\n            doc.save('codigos_pajaro_volador_pro.pdf');\r\n        }\r\n        \r\n        function openScanner() {\r\n            scannerContainer.style.display = 'flex';\r\n            startScanner();\r\n        }\r\n        \r\n        function closeScanner() {\r\n            scannerContainer.style.display = 'none';\r\n            stopScanner();\r\n        }\r\n        \r\n        function startScanner() {\r\n            navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' } })\r\n                .then(function(stream) {\r\n                    scannerStream = stream;\r\n                    scannerVideo.srcObject = stream;\r\n                    scannerVideo.play();\r\n                    scanQRCode();\r\n                })\r\n                .catch(function(err) {\r\n                    console.error('Error al acceder a la c\u00e1mara:', err);\r\n                    alert('No se pudo acceder a la c\u00e1mara');\r\n                });\r\n        }\r\n        \r\n        function stopScanner() {\r\n            if (scannerStream) {\r\n                scannerStream.getTracks().forEach(track => track.stop());\r\n                scannerStream = null;\r\n            }\r\n        }\r\n        \r\n        function scanQRCode() {\r\n            const canvas = document.createElement('canvas');\r\n            const context = canvas.getContext('2d');\r\n            \r\n            function tick() {\r\n                if (scannerVideo.readyState === scannerVideo.HAVE_ENOUGH_DATA) {\r\n                    canvas.width = scannerVideo.videoWidth;\r\n                    canvas.height = scannerVideo.videoHeight;\r\n                    context.drawImage(scannerVideo, 0, 0, canvas.width, canvas.height);\r\n                    \r\n                    const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n                    const code = jsQR(imageData.data, imageData.width, imageData.height, {\r\n                        inversionAttempts: 'dontInvert',\r\n                    });\r\n                    \r\n                    if (code) {\r\n                        gameCodeInput.value = code.data;\r\n                        closeScanner();\r\n                    }\r\n                }\r\n                \r\n                if (scannerContainer.style.display === 'flex') {\r\n                    requestAnimationFrame(tick);\r\n                }\r\n            }\r\n            \r\n            tick();\r\n        }\r\n        \r\n        function handleKeyPress(e) {\r\n            if (e.code === 'Space' && gameRunning) {\r\n                jump();\r\n            }\r\n        }\r\n        \r\n        function handleJump() {\r\n            if (gameRunning) {\r\n                jump();\r\n            }\r\n        }\r\n        \r\n        function jump() {\r\n            birdVelocity = jumpForce;\r\n            createParticles(100, birdY + 15, 5);\r\n        }\r\n        \r\n        function startGame() {\r\n            playerName = playerNameInput.value.trim();\r\n            const gameCode = gameCodeInput.value.trim();\r\n            \r\n            if (!playerName) {\r\n                alert('Por favor ingresa tu nombre');\r\n                return;\r\n            }\r\n            \r\n            if (!gameCode) {\r\n                alert('Por favor ingresa un c\u00f3digo de acceso');\r\n                return;\r\n            }\r\n            \r\n            const codeIndex = accessCodes.findIndex(c => c.code === gameCode && !c.used);\r\n            if (codeIndex === -1) {\r\n                alert('C\u00f3digo inv\u00e1lido o ya utilizado');\r\n                return;\r\n            }\r\n            \r\n            accessCodes[codeIndex].used = true;\r\n            localStorage.setItem('birdGameAccessCodes', JSON.stringify(accessCodes));\r\n            \r\n            let player = players.find(p => p.name.toLowerCase() === playerName.toLowerCase());\r\n            if (!player) {\r\n                player = { name: playerName, score: 0, lastScore: 0, gems: 0 };\r\n                players.push(player);\r\n            }\r\n            \r\n            updateCurrentPlayerDisplay(player);\r\n            resetGame();\r\n            startScreen.style.display = 'none';\r\n            \r\n            gameRunning = true;\r\n            birdY = 300;\r\n            birdVelocity = 0;\r\n            bird.style.top = birdY + 'px';\r\n            \r\n            time = 0;\r\n            gameTimeInterval = setInterval(() => {\r\n                time++;\r\n                timeDisplay.textContent = time;\r\n                \r\n                if (time % 10 === 0) {\r\n                    level++;\r\n                    levelDisplay.textContent = level;\r\n                    gameSpeed += 0.2;\r\n                    if (obstacleInterval > 800) {\r\n                        obstacleInterval -= 50;\r\n                    }\r\n                    \r\n                    if (time % 30 === 0) {\r\n                        createWeatherEffect(Math.random() > 0.5 ? 'rain' : 'sunny');\r\n                    }\r\n                }\r\n            }, 1000);\r\n            \r\n            gameLoopId = requestAnimationFrame(gameLoop);\r\n        }\r\n        \r\n        function resetGame() {\r\n            obstacles.forEach(obstacle => {\r\n                if (obstacle.element && obstacle.element.parentNode) {\r\n                    gameContainer.removeChild(obstacle.element);\r\n                }\r\n            });\r\n            obstacles = [];\r\n            \r\n            powerUps.forEach(powerUp => {\r\n                if (powerUp.element && powerUp.element.parentNode) {\r\n                    gameContainer.removeChild(powerUp.element);\r\n                }\r\n            });\r\n            powerUps = [];\r\n            \r\n            score = 0;\r\n            gems = 0;\r\n            level = 1;\r\n            gameSpeed = 5;\r\n            obstacleInterval = 1500;\r\n            powerUpInterval = 10000;\r\n            lastObstacleTime = 0;\r\n            lastPowerUpTime = 0;\r\n            \r\n            scoreDisplay.textContent = score;\r\n            gemsDisplay.textContent = gems;\r\n            levelDisplay.textContent = level;\r\n            timeDisplay.textContent = '0';\r\n        }\r\n        \r\n        function gameLoop(timestamp) {\r\n            if (!gameRunning) return;\r\n            \r\n            birdVelocity += gravity;\r\n            birdY += birdVelocity;\r\n            bird.style.top = birdY + 'px';\r\n            \r\n            if (birdY <= 0) {\r\n                birdY = 0;\r\n                birdVelocity = 0;\r\n                gameOver();\r\n            }\r\n            \r\n            if (birdY >= gameContainer.offsetHeight - bird.offsetHeight) {\r\n                birdY = gameContainer.offsetHeight - bird.offsetHeight;\r\n                gameOver();\r\n            }\r\n            \r\n            if (timestamp - lastObstacleTime > obstacleInterval) {\r\n                createObstacle();\r\n                lastObstacleTime = timestamp;\r\n            }\r\n            \r\n            if (timestamp - lastPowerUpTime > powerUpInterval) {\r\n                createPowerUp();\r\n                lastPowerUpTime = timestamp;\r\n            }\r\n            \r\n            for (let i = obstacles.length - 1; i >= 0; i--) {\r\n                const obstacle = obstacles[i];\r\n                obstacle.x -= gameSpeed;\r\n                obstacle.element.style.left = obstacle.x + 'px';\r\n                \r\n                if (!obstacle.passed && obstacle.x + obstacle.width < 100) {\r\n                    obstacle.passed = true;\r\n                    score++;\r\n                    scoreDisplay.textContent = score;\r\n                    createParticles(obstacle.x + obstacle.width, birdY, 3, '#2E8B57');\r\n                }\r\n                \r\n                if (checkCollision(bird, obstacle.element)) {\r\n                    gameOver();\r\n                    break;\r\n                }\r\n                \r\n                if (obstacle.x + obstacle.width < 0) {\r\n                    gameContainer.removeChild(obstacle.element);\r\n                    obstacles.splice(i, 1);\r\n                }\r\n            }\r\n            \r\n            for (let i = powerUps.length - 1; i >= 0; i--) {\r\n                const powerUp = powerUps[i];\r\n                powerUp.x -= gameSpeed;\r\n                powerUp.element.style.left = powerUp.x + 'px';\r\n                \r\n                if (checkCollision(bird, powerUp.element)) {\r\n                    collectPowerUp(powerUp);\r\n                    powerUps.splice(i, 1);\r\n                    continue;\r\n                }\r\n                \r\n                if (powerUp.x + powerUp.width < 0) {\r\n                    gameContainer.removeChild(powerUp.element);\r\n                    powerUps.splice(i, 1);\r\n                }\r\n            }\r\n            \r\n            gameLoopId = requestAnimationFrame(gameLoop);\r\n        }\r\n        \r\n        function createObstacle() {\r\n            const gapHeight = 150 + Math.random() * 100;\r\n            const gapPosition = 100 + Math.random() * (gameContainer.offsetHeight - gapHeight - 100);\r\n            \r\n            const topObstacle = document.createElement('div');\r\n            topObstacle.className = 'obstacle';\r\n            topObstacle.style.height = gapPosition + 'px';\r\n            topObstacle.style.left = gameContainer.offsetWidth + 'px';\r\n            gameContainer.appendChild(topObstacle);\r\n            \r\n            const bottomObstacle = document.createElement('div');\r\n            bottomObstacle.className = 'obstacle';\r\n            bottomObstacle.style.height = (gameContainer.offsetHeight - gapPosition - gapHeight) + 'px';\r\n            bottomObstacle.style.left = gameContainer.offsetWidth + 'px';\r\n            bottomObstacle.style.bottom = '0';\r\n            gameContainer.appendChild(bottomObstacle);\r\n            \r\n            obstacles.push({\r\n                element: topObstacle,\r\n                x: gameContainer.offsetWidth,\r\n                width: 60,\r\n                height: gapPosition,\r\n                passed: false\r\n            });\r\n            \r\n            obstacles.push({\r\n                element: bottomObstacle,\r\n                x: gameContainer.offsetWidth,\r\n                width: 60,\r\n                height: gameContainer.offsetHeight - gapPosition - gapHeight,\r\n                passed: false\r\n            });\r\n        }\r\n        \r\n        function createPowerUp() {\r\n            const powerUp = document.createElement('div');\r\n            powerUp.className = 'power-up';\r\n            powerUp.style.left = gameContainer.offsetWidth + 'px';\r\n            powerUp.style.top = 100 + Math.random() * (gameContainer.offsetHeight - 200) + 'px';\r\n            gameContainer.appendChild(powerUp);\r\n            \r\n            powerUps.push({\r\n                element: powerUp,\r\n                x: gameContainer.offsetWidth,\r\n                y: parseInt(powerUp.style.top),\r\n                width: 30,\r\n                height: 30,\r\n                collected: false\r\n            });\r\n        }\r\n        \r\n        function collectPowerUp(powerUp) {\r\n            powerUp.collected = true;\r\n            gems++;\r\n            gemsDisplay.textContent = gems;\r\n            createParticles(powerUp.x + 15, powerUp.y + 15, 10, '#FF4500');\r\n            gameContainer.removeChild(powerUp.element);\r\n            \r\n            bird.style.backgroundColor = '#FF4500';\r\n            setTimeout(() => {\r\n                if (gameRunning) bird.style.backgroundColor = isNightMode ? '#FFA500' : '#FFD700';\r\n            }, 1000);\r\n        }\r\n        \r\n        function createParticles(x, y, count, color) {\r\n            for (let i = 0; i < count; i++) {\r\n                const particle = document.createElement('div');\r\n                particle.className = 'particle';\r\n                particle.style.width = Math.random() * 8 + 4 + 'px';\r\n                particle.style.height = particle.style.width;\r\n                particle.style.backgroundColor = color || '#FFD700';\r\n                particle.style.left = x + 'px';\r\n                particle.style.top = y + 'px';\r\n                gameContainer.appendChild(particle);\r\n                \r\n                const angle = Math.random() * Math.PI * 2;\r\n                const speed = Math.random() * 5 + 2;\r\n                const lifetime = Math.random() * 1000 + 500;\r\n                \r\n                const startTime = Date.now();\r\n                \r\n                function updateParticle() {\r\n                    const elapsed = Date.now() - startTime;\r\n                    const progress = elapsed \/ lifetime;\r\n                    \r\n                    if (progress >= 1 || !gameContainer.contains(particle)) {\r\n                        if (gameContainer.contains(particle)) {\r\n                            gameContainer.removeChild(particle);\r\n                        }\r\n                        return;\r\n                    }\r\n                    \r\n                    particle.style.opacity = 1 - progress;\r\n                    particle.style.left = x + Math.cos(angle) * speed * elapsed \/ 20 + 'px';\r\n                    particle.style.top = y + Math.sin(angle) * speed * elapsed \/ 20 + 'px';\r\n                    \r\n                    requestAnimationFrame(updateParticle);\r\n                }\r\n                \r\n                requestAnimationFrame(updateParticle);\r\n            }\r\n        }\r\n        \r\n        function createWeatherEffect(type) {\r\n            weatherContainer.innerHTML = '';\r\n            \r\n            if (type === 'rain') {\r\n                for (let i = 0; i < 60; i++) {\r\n                    const drop = document.createElement('div');\r\n                    drop.className = 'rain';\r\n                    drop.style.left = Math.random() * 100 + '%';\r\n                    drop.style.top = Math.random() * -100 + 'px';\r\n                    drop.style.animationDuration = Math.random() * 0.5 + 0.5 + 's';\r\n                    drop.style.animationDelay = Math.random() * 2 + 's';\r\n                    weatherContainer.appendChild(drop);\r\n                }\r\n            }\r\n        }\r\n        \r\n        function toggleTheme() {\r\n            isNightMode = !isNightMode;\r\n            document.body.classList.toggle('night-mode', isNightMode);\r\n            themeToggleButton.textContent = isNightMode ? '\ud83c\udf1e' : '\ud83c\udf19';\r\n            bird.style.backgroundColor = isNightMode ? '#FFA500' : '#FFD700';\r\n            createWeatherEffect(isNightMode ? 'rain' : 'sunny');\r\n        }\r\n        \r\n        function checkCollision(bird, element) {\r\n            const birdRect = bird.getBoundingClientRect();\r\n            const elementRect = element.getBoundingClientRect();\r\n            \r\n            return !(\r\n                birdRect.right < elementRect.left ||\r\n                birdRect.left > elementRect.right ||\r\n                birdRect.bottom < elementRect.top ||\r\n                birdRect.top > elementRect.bottom\r\n            );\r\n        }\r\n        \r\n        function gameOver() {\r\n            gameRunning = false;\r\n            cancelAnimationFrame(gameLoopId);\r\n            clearInterval(gameTimeInterval);\r\n            \r\n            finalScoreDisplay.textContent = `\u2b50 Puntuaci\u00f3n: ${score}`;\r\n            gemsEarnedDisplay.textContent = `\ud83d\udc8e Gemas obtenidas: ${gems}`;\r\n            gameOverScreen.style.display = 'flex';\r\n            \r\n            let player = players.find(p => p.name.toLowerCase() === playerName.toLowerCase());\r\n            if (player) {\r\n                player.lastScore = score;\r\n                player.score += score;\r\n                player.gems = (player.gems || 0) + gems;\r\n                savePlayers();\r\n                updateCurrentPlayerDisplay(player);\r\n                updateLeaderboard();\r\n            }\r\n            \r\n            createParticles(100 + 20, birdY + 15, 20, '#FF4500');\r\n        }\r\n        \r\n        function restartGame() {\r\n            gameOverScreen.style.display = 'none';\r\n            startGame();\r\n        }\r\n        \r\n        function returnToMenu() {\r\n            gameRunning = false;\r\n            if (gameLoopId) cancelAnimationFrame(gameLoopId);\r\n            if (gameTimeInterval) clearInterval(gameTimeInterval);\r\n            \r\n            gameOverScreen.style.display = 'none';\r\n            startScreen.style.display = 'flex';\r\n            gameCodeInput.value = '';\r\n        }\r\n        \r\n        function savePlayers() {\r\n            localStorage.setItem('birdGamePlayers', JSON.stringify(players));\r\n            localStorage.setItem('birdGameAccessCodes', JSON.stringify(accessCodes));\r\n        }\r\n        \r\n        function updateLeaderboard() {\r\n            const sortedPlayers = [...players].sort((a, b) => b.score - a.score);\r\n            \r\n            topPlayersList.innerHTML = '';\r\n            sortedPlayers.slice(0, 10).forEach((player, index) => {\r\n                const playerElement = document.createElement('div');\r\n                playerElement.className = 'player-score';\r\n                if (player.name.toLowerCase() === playerName.toLowerCase()) {\r\n                    playerElement.classList.add('highlight');\r\n                }\r\n                playerElement.innerHTML = `${index + 1}. ${player.name}: ${player.score} pts | \ud83d\udc8e${player.gems || 0}`;\r\n                topPlayersList.appendChild(playerElement);\r\n            });\r\n            \r\n            allPlayersDisplay.innerHTML = '<h3>\ud83d\udc65 Todos los Jugadores<\/h3>';\r\n            sortedPlayers.forEach((player, index) => {\r\n                const playerElement = document.createElement('div');\r\n                playerElement.className = 'player-score';\r\n                if (player.name.toLowerCase() === playerName.toLowerCase()) {\r\n                    playerElement.classList.add('highlight');\r\n                }\r\n                playerElement.innerHTML = `${index + 1}. ${player.name}: ${player.score} pts | \ud83d\udc8e${player.gems || 0}`;\r\n                allPlayersDisplay.appendChild(playerElement);\r\n            });\r\n        }\r\n        \r\n        function updateCurrentPlayerDisplay(player) {\r\n            currentPlayerDisplay.innerHTML = `\r\n                <h3>\ud83c\udfae Jugador Actual<\/h3>\r\n                <div class=\"player-score highlight\">\r\n                    ${player.name}<br>\r\n                    \u2b50 Puntos totales: ${player.score}<br>\r\n                    \ud83d\udc8e Gemas totales: ${player.gems || 0}<br>\r\n                    \u00daltima puntuaci\u00f3n: ${player.lastScore || 0}\r\n                <\/div>\r\n            `;\r\n        }\r\n    <\/script>\r\n<\/body>\r\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>P\u00e1jaro Volador Pro \ud83c\udf13 \u23f1\ufe0f 0s \u2b50 0 \ud83d\ude80 1 \ud83d\udc8e 0 P\u00e1jaro Volador PRO \ud83d\udcf7 \ud83d\ude80 Comenzar \ud83d\udd11 Generador de C\u00f3digos \ud83c\udfc6 Top 10 Jugadores \ud83d\udd10 Generador de C\u00f3digos \ud83d\udd13 Ingresar \u21a9\ufe0f Volver al juego \u2728 Generar C\u00f3digos \ud83c\udfb0 Generar 50 C\u00f3digos \ud83d\udcc4 Descargar PDF \u21a9\ufe0f Volver al juego \ud83d\udc80 Game Over \u2b50 Puntuaci\u00f3n: &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/senorwok.com\/index.php\/juego-senor-wok\/\"> <span class=\"screen-reader-text\">Juego se\u00f1or wok<\/span> Leer m\u00e1s &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"_joinchat":[],"footnotes":""},"class_list":["post-2140","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/pages\/2140"}],"collection":[{"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/comments?post=2140"}],"version-history":[{"count":5,"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/pages\/2140\/revisions"}],"predecessor-version":[{"id":2145,"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/pages\/2140\/revisions\/2145"}],"wp:attachment":[{"href":"https:\/\/senorwok.com\/index.php\/wp-json\/wp\/v2\/media?parent=2140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}