{"id":1218,"date":"2026-03-18T16:54:20","date_gmt":"2026-03-18T16:54:20","guid":{"rendered":"https:\/\/entrenacalculo.com\/?page_id=1218"},"modified":"2026-03-18T16:55:16","modified_gmt":"2026-03-18T16:55:16","slug":"tabla-de-multiplicar-del-2","status":"publish","type":"page","link":"https:\/\/entrenacalculo.com\/en\/tabla-de-multiplicar-del-2\/","title":{"rendered":"Tabla de multiplicar del 2"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1218\" class=\"elementor elementor-1218\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bdbba61 e-flex e-con-boxed e-con e-parent\" data-id=\"bdbba61\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5f82794 elementor-widget elementor-widget-html\" data-id=\"5f82794\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\r\n<style>\r\n    .juego-fiel-tabla-2-container {\r\n        font-family: Arial, sans-serif;\r\n        background-color: #f0f0f0;\r\n        margin: 0;\r\n        padding: 5px;\r\n        border-radius: 10px;\r\n    }\r\n    .juego-fiel-tabla-2-container .container {\r\n        max-width: 800px; margin: 0 auto; padding: 10px 15px; background-color: #fff; border-radius: 10px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); text-align: center;\r\n    }\r\n    .juego-fiel-tabla-2-container h2 { color: #333; }\r\n    .juego-fiel-tabla-2-container .lesson { font-style: italic; color: #666;\r\n        margin: 0 0 10px 0; \/* CAMBIO: margen ajustado *\/\r\n    font-size: 0.9em; \/* CAMBIO: texto ligeramente m\u00e1s peque\u00f1o *\/\r\n    line-height: 1.2; \/* CAMBIO: interlineado m\u00e1s compacto *\/ }\r\n    .juego-fiel-tabla-2-container button { margin: 10px; padding: 5px 10px; font-size: 16px; border: none; border-radius: 5px; cursor: pointer; background-color: #007bff; color: #fff; transition: background-color 0.3s ease; }\r\n    .juego-fiel-tabla-2-container button:hover { background-color: #0056b3; }\r\n    \r\n    \/* --- ESTILOS VISUALES CORREGIDOS --- *\/\r\n    .juego-fiel-tabla-2-container .questions-container {\r\n        display: grid;\r\n        grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\r\n        grid-gap: 5px;\r\n        margin-bottom: 10px;\r\n    }\r\n    .juego-fiel-tabla-2-container .question {\r\n        padding: 8px;\r\n        background-color: #f9f9f9;\r\n        border-radius: 5px;\r\n    }\r\n    .juego-fiel-tabla-2-container .question p {\r\n    margin: 2px 0;\r\n}\r\n\r\n    \/* --- FIN DE LA CORRECCI\u00d3N --- *\/\r\n\r\n    .juego-fiel-tabla-2-container .correct-answer { color: green; font-weight: bold; }\r\n    .juego-fiel-tabla-2-container .incorrect-answer { color: red; font-weight: bold; }\r\n    .juego-fiel-tabla-2-container .hidden { display: none; }\r\n    .juego-fiel-tabla-2-container .error-blink { animation: blink-animation-fiel-2 0.5s infinite alternate; }\r\n    @keyframes blink-animation-fiel-2 { from { background-color: #ff9999; } to { background-color: inherit; } }\r\n    @keyframes destello-fiel-2 { 10% { text-shadow: 0 0 10px gold; } 50% { text-shadow: 0 0 10px rgb(85, 0, 255); } 100% { text-shadow: 0 0 10px rgb(211, 9, 9); } }\r\n    .juego-fiel-tabla-2-container .destello { animation: destello-fiel-2 1s infinite alternate; }\r\n    .juego-fiel-tabla-2-container .modal { display: none; position: fixed; z-index: 10000; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 90%; max-width: 600px; background-color: rgba(0, 0, 0, 0.5); border-radius: 10px; }\r\n    .juego-fiel-tabla-2-container .modal-content { background-color: #fefefe; margin: 20px auto; padding: 20px; border: 1px solid #888; border-radius: 10px; text-align: center;\r\n    }\r\n    .juego-fiel-tabla-2-container .close { color: #aaa; float: right; font-size: 28px; font-weight: bold; }\r\n    .juego-fiel-tabla-2-container .close:hover, .juego-fiel-tabla-2-container .close:focus { color: black; text-decoration: none; cursor: pointer; }\r\n    .juego-fiel-tabla-2-container .titulo-division { color: #ffc107; }\r\n    .juego-fiel-tabla-2-container .userAnswer {\r\n     width: 65px;\r\n            padding: 2px 5px;\r\n            height: 30px;\r\n            text-align: center;\r\n            border: 2px solid #cccccc !important;\r\n            border-radius: 5px;\r\n            background-color: #ffffff !important;\r\n            font-size: 18px;\r\n            color: #333;\r\n            display: block;\r\n            margin: 5px auto;\r\n}\r\n\r\n.juego-fiel-tabla-2-container .userAnswer:focus {\r\n     border-color: #ffc107 !important;\r\n            outline: none;\r\n            box-shadow: 0 0 5px rgba(255, 193, 7, 0.6);\r\n}\r\n\/* Barra de progreso *\/\r\n.progress-wrapper-2 { \r\n    background-color: #eee; border-radius: 10px; height: 20px; \r\n    width: 100%; margin: 15px 0; position: relative; \r\n    border: 1px solid #ccc; overflow: hidden; \r\n}\r\n#progressBar-fiel-2 { \r\n    background: #4caf50; height: 100%; width: 0%; transition: width 0.3s; \r\n}\r\n.progress-text-2 { \r\n    position: absolute; width: 100%; text-align: center; top: 0; \r\n    font-size: 12px; font-weight: bold; color: #000; line-height: 20px; \r\n}\r\n\r\n\/* Ajuste al modal para que no crezca m\u00e1s que la pantalla *\/\r\n.juego-fiel-tabla-2-container .modal-content { \r\n    max-height: 85vh; \/* Evita que salga de la pantalla *\/\r\n    display: flex; \r\n    flex-direction: column; \r\n    position: relative; \r\n}\r\n\/* Permite scroll solo en el contenido *\/\r\n#errorContent-fiel-2 { \r\n    overflow-y: auto; \r\n    margin: 15px 0; \r\n    padding-right: 10px; \r\n}\r\n\/* Fija la X de cerrar arriba a la derecha *\/\r\n.juego-fiel-tabla-2-container .close { \r\n    position: absolute; top: 5px; right: 15px; \r\n}\r\n<\/style>\r\n\r\n<!-- ESTRUCTURA HTML -->\r\n<div class=\"juego-fiel-tabla-2-container\">\r\n    <div class=\"container\">\r\n        <!--<h2 class=\"titulo-division\"><b>\u00a1Tabla de multiplicaci\u00f3n del 2!<\/b><\/h2>-->\r\n        <p class=\"lesson titulo-division\">\"En la multiplicaci\u00f3n, estamos combinando grupos iguales de n\u00fameros. Por ejemplo, cuando multiplicamos 8 por 2, estamos sumando 8 dos veces: 8 + 8, lo que nos da 16.\"<\/p>\r\n        <div class=\"questions-container\" id=\"exercise-fiel-2\"><\/div>\r\n        <div id=\"roundResult-fiel-2\" class=\"hidden\"><\/div>\r\n        <div class=\"progress-wrapper-2\">\r\n    <div id=\"progressBar-fiel-2\"><\/div>\r\n    <div class=\"progress-text-2\" id=\"progressText-fiel-2\">Racha: 0 \/ 27<\/div>\r\n<\/div>\r\n        <div id=\"consecutiveCorrect-fiel-2\" class=\"hidden\"><\/div>\r\n        <button id=\"verify-btn-fiel-2\">Verificar respuestas<\/button>\r\n        <button id=\"continue-btn-fiel-2\">Continuar reto<\/button>\r\n        <button id=\"finish-btn-fiel-2\">An\u00e1lisis de errores<\/button>\r\n        <button id=\"restart-btn-fiel-2\">Reiniciar reto<\/button>\r\n        <div id=\"finishMessage-fiel-2\" class=\"hidden\"><\/div>\r\n\r\n        <div id=\"errorModal-fiel-2\" class=\"modal\">\r\n            <div class=\"modal-content\">\r\n                <span id=\"closeError-fiel-2\" class=\"close\">&times;<\/span>\r\n                <div id=\"errorContent-fiel-2\"><\/div>\r\n                <button id=\"download-txt-btn-fiel-2\">Descargar ejercicios a partir de los errores, en PDF<\/button>\r\n            <\/div>\r\n        <\/div>\r\n        <div id=\"winModal-fiel-2\" class=\"modal\">\r\n            <div class=\"modal-content\">\r\n                <span id=\"closeWin-fiel-2\" class=\"close\">&times;<\/span>\r\n                <div id=\"winContent-fiel-2\"><\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n   <audio id=\"audio-9-fiel-2\" src=\"https:\/\/entrenacalculo.com\/wp-content\/uploads\/2026\/03\/ronda_9.mp3.mp3\"><\/audio>\r\n<audio id=\"audio-18-fiel-2\" src=\"https:\/\/entrenacalculo.com\/wp-content\/uploads\/2026\/03\/ronda_18.mp3.mp3\"><\/audio>\r\n<audio id=\"audio-victoria-fiel-2\" src=\"https:\/\/entrenacalculo.com\/wp-content\/uploads\/2026\/03\/victoria_27.mp3.mp3\"><\/audio>\r\n<audio id=\"audio-reintento-leve-fiel-2\" src=\"https:\/\/entrenacalculo.com\/wp-content\/uploads\/2026\/03\/error_leve.mp3.mp3\"><\/audio>\r\n<audio id=\"audio-reintento-grave-fiel-2\" src=\"https:\/\/entrenacalculo.com\/wp-content\/uploads\/2026\/03\/error_grave.mp3.mp3\"><\/audio>\r\n<\/div>\r\n\r\n<!-- C\u00d3DIGO JAVASCRIPT -->\r\n<script>\r\n(function() {\r\n    const suffix = '-fiel-2';\r\n    const consecutiveCorrectKey = 'consecutiveCorrect_fiel_2';\r\n    const allErrorsKey = 'allErrors_fiel_2';\r\n    const exercisesKey = 'exercises_fiel_2';\r\n\r\n    const exerciseDiv = document.getElementById('exercise' + suffix);\r\n    const roundResult = document.getElementById('roundResult' + suffix);\r\n    const consecutiveCorrectPara = document.getElementById('consecutiveCorrect' + suffix);\r\n    const errorModal = document.getElementById('errorModal' + suffix);\r\n    const winModal = document.getElementById('winModal' + suffix);\r\n    const errorContent = document.getElementById('errorContent' + suffix);\r\n    const winContent = document.getElementById('winContent' + suffix);\r\n    \/\/const successAudio = document.getElementById('success-audio' + suffix);\r\n    \/\/const errorAudio = document.getElementById('error-audio' + suffix);\r\n\r\n    let consecutiveCorrect = parseInt(localStorage.getItem(consecutiveCorrectKey)) || 0;\r\n    let allErrors = JSON.parse(localStorage.getItem(allErrorsKey)) || [];\r\n    let startTime;\r\n    let verifyButtonClicked = false;\r\n    \r\n    \/\/ --- ACTUALIZACI\u00d3N DE BARRA ---\r\n    function updateProgressBar() {\r\n        const perc = Math.min((consecutiveCorrect \/ 27) * 100, 100);\r\n        document.getElementById('progressBar-fiel-2').style.width = perc + '%';\r\n        document.getElementById('progressText-fiel-2').innerHTML = `Racha: ${consecutiveCorrect} \/ 27`;\r\n    }\r\n\r\n    function generateExercise() {\r\n        const factor = Math.random() < 0.5 ? 2 : Math.floor(Math.random() * 10) + 1;\r\n        const num = 2;\r\n        const correctAnswer = factor * num;\r\n        return { factor, num, correctAnswer };\r\n    }\r\n\r\n    function generateExercises() {\r\n        const exercises = [];\r\n        let previousExercises = JSON.parse(localStorage.getItem(exercisesKey));\r\n        let newExercises;\r\n        do {\r\n            exercises.length = 0;\r\n            while (exercises.length < 9) {\r\n                const exercise = generateExercise();\r\n                const isUnique = !exercises.some(e => e.factor === exercise.factor && e.num === exercise.num);\r\n                if (isUnique) exercises.push(exercise);\r\n            }\r\n            newExercises = JSON.stringify(exercises);\r\n        } while (previousExercises && newExercises === previousExercises);\r\n        localStorage.setItem(exercisesKey, newExercises);\r\n        return exercises;\r\n    }\r\n\r\n    function showExercises(exercises) {\r\n        if (!exerciseDiv) return;\r\n        exerciseDiv.innerHTML = '';\r\n        exercises.forEach((exercise, index) => {\r\n            \/\/ -- CORRECCI\u00d3N APLICADA AQU\u00cd --\r\n            exerciseDiv.innerHTML += `\r\n            <div class=\"question\">\r\n                <p>Pregunta ${index + 1}: \u00bfCu\u00e1nto es ${exercise.factor} x ${exercise.num}?<\/p>\r\n                <input type=\"number\" id=\"userAnswer${index}${suffix}\" class=\"userAnswer\">\r\n                <p id=\"feedback${index}${suffix}\" class=\"feedback\"><\/p>\r\n            <\/div>`;\r\n        });\r\n        updateProgressBar(); \/\/ --- AGREGAR ESTO: Actualiza la barra al mostrar ejercicios ---\r\n    }\r\n\r\n    function verifyAnswers() {\r\n        if (verifyButtonClicked) return;\r\n        verifyButtonClicked = true;\r\n        let correctAnswers = 0;\r\n        const exercises = JSON.parse(localStorage.getItem(exercisesKey));\r\n        const errors = [];\r\n        if (!exercises) return;\r\n        exercises.forEach((exercise, index) => {\r\n            const userAnswer = parseInt(document.getElementById(`userAnswer${index}${suffix}`).value);\r\n            const feedbackPara = document.getElementById(`feedback${index}${suffix}`);\r\n            if (!isNaN(userAnswer) && userAnswer === exercise.correctAnswer) {\r\n                feedbackPara.innerHTML = '\u00a1Correcto!';\r\n                feedbackPara.classList.add('correct-answer');\r\n                correctAnswers++;\r\n                consecutiveCorrect++;\r\n               \/\/ playSuccessSound();\r\n            } else {\r\n                feedbackPara.innerHTML = `\u00a1Lo correcto es ${exercise.correctAnswer}!`;\r\n                feedbackPara.classList.add('incorrect-answer');\r\n                feedbackPara.classList.add('error-blink');\r\n                consecutiveCorrect = 0;\r\n                errors.push(exercise);\r\n               \/\/ playErrorSound();\r\n            }\r\n        });\r\n        \/\/ --- INICIO DE L\u00d3GICA DE AUDIOS POR PRIORIDAD Y RACHA ---\r\n        let huboFallo = errors.length > 0;\r\n\r\n        if (consecutiveCorrect >= 27) {\r\n            \/\/ PRIORIDAD 1: VICTORIA FINAL\r\n            playAudio('audio-victoria' + suffix);\r\n        } \r\n        else if (huboFallo) {\r\n            \/\/ PRIORIDAD 2: ERRORES (REINTENTOS)\r\n            let totalErrores = errors.length;\r\n            if (totalErrores <= 2) {\r\n                playAudio('audio-reintento-leve' + suffix);\r\n            } else {\r\n                playAudio('audio-reintento-grave' + suffix);\r\n            }\r\n        } \r\n        else {\r\n            \/\/ PRIORIDAD 3: RONDAS PERFECTAS (9 o 18)\r\n            if (consecutiveCorrect === 9) {\r\n                playAudio('audio-9' + suffix);\r\n            } \r\n            else if (consecutiveCorrect === 18) {\r\n                playAudio('audio-18' + suffix);\r\n            }\r\n        }\r\n        \/\/ --- FIN DE L\u00d3GICA DE AUDIOS ---\r\n        localStorage.setItem(consecutiveCorrectKey, consecutiveCorrect);\r\n        allErrors.push(...errors);\r\n        localStorage.setItem(allErrorsKey, JSON.stringify(allErrors));\r\n        updateProgressBar(); \/\/ --- AGREGAR ESTO: La barra se mueve justo despu\u00e9s de verificar ---\r\n        showRoundResult(correctAnswers);\r\n        showConsecutiveCorrect();\r\n    }\r\n\r\n    function showRoundResult(correctAnswers) {\r\n        if(roundResult) {\r\n            roundResult.innerHTML = `Lograste ${correctAnswers} respuestas correctas de 9, en esta ronda.`;\r\n            roundResult.style.color = 'blue';\r\n            roundResult.classList.remove('hidden');\r\n        }\r\n    }\r\n\r\n    function showConsecutiveCorrect() {\r\n        if(consecutiveCorrectPara) {\r\n            consecutiveCorrectPara.innerHTML = `Has alcanzado ${consecutiveCorrect} respuestas correctas seguidas.`;\r\n            consecutiveCorrectPara.style.color = 'green';\r\n            consecutiveCorrectPara.classList.remove('hidden');\r\n            if (consecutiveCorrect >= 27) {\r\n                const finishTime = new Date() - startTime;\r\n                const minutes = Math.floor((finishTime % (1000 * 60 * 60)) \/ (1000 * 60));\r\n                const seconds = Math.floor((finishTime % (1000 * 60)) \/ 1000);\r\n                const totalErrors = allErrors.length;\r\n                const totalTimeForPoints = Math.floor(finishTime \/ 1000);\r\n                const totalPoints = calculatePoints(consecutiveCorrect, totalTimeForPoints, totalErrors);\r\n                \r\n                winContent.innerHTML = `<h2 style=\"color: blue;\" class=\"destello\">\u00a1Ganaste el juego!<br>Tabla de multiplicaci\u00f3n del 2<\/h2> <span style=\"font-size: 56px;\" class=\"destello\">&#x1F3C6;<\/span>`;\r\n                winContent.innerHTML += `<p><b>\u00a1Felicidades!<\/b> Has logrado <b> 27 respuestas correctas consecutivas.<\/b><\/p>`;\r\n                winContent.innerHTML += `<p>Tiempo de finalizaci\u00f3n: <b>${minutes} minutos ${seconds} segundos<\/b><\/p>`;\r\n                winContent.innerHTML += `<p>Puntaje total: <b>${totalPoints} Puntos<\/b><\/p>`;\r\n                winContent.style.color = 'blue';\r\n                if(winModal) winModal.style.display = \"block\";\r\n                \r\n                \/\/localStorage.removeItem(consecutiveCorrectKey);\r\n                \/\/localStorage.removeItem(allErrorsKey);\r\n                \/\/localStorage.removeItem(exercisesKey);\r\n            } else {\r\n                consecutiveCorrectPara.innerHTML += ` \u00a1Necesitas llegar a 27 para ganar!`;\r\n            }\r\n        }\r\n    }\r\n\r\n    function calculatePoints(finalConsecutive, totalTimeSeconds, totalErrors) {\r\n        const basePoints = finalConsecutive * 10;\r\n        const errorPenalty = totalErrors * 5;\r\n        const timePenalty = totalTimeSeconds * 0.5;\r\n        let streakBonus = 0;\r\n        if (finalConsecutive >= 27) { streakBonus += 300; } \r\n        else if (finalConsecutive >= 18) { streakBonus += 150; } \r\n        else if (finalConsecutive >= 9) { streakBonus += 50; }\r\n        const totalPoints = basePoints - errorPenalty - timePenalty + streakBonus;\r\n        return Math.max(0, Math.floor(totalPoints));\r\n    }\r\n\r\n    function showErrors() {\r\n        const currentAllErrors = JSON.parse(localStorage.getItem(allErrorsKey)) || [];\r\n        if(errorContent) {\r\n            errorContent.innerHTML = '<h2>Errores en el juego. <br> Pero corregidos.<\/h2>';\r\n            if (currentAllErrors.length > 0) {\r\n                 currentAllErrors.forEach((error, index) => {\r\n                    errorContent.innerHTML += `<p>${index + 1}. <span style=\"color: red;\">${error.factor} x ${error.num} = ${error.correctAnswer}<\/span><\/p>`;\r\n                });\r\n            } else {\r\n                errorContent.innerHTML += '<p>\u00a1No has cometido errores!<\/p>';\r\n            }\r\n        }\r\n        if(errorModal) errorModal.style.display = \"block\";\r\n    }\r\n\r\n    function refreshGame() {\r\n        verifyButtonClicked = false;\r\n        if (roundResult) roundResult.classList.add('hidden');\r\n        const exercises = generateExercises();\r\n        showExercises(exercises);\r\n    }\r\n\r\n    function restartGame() {\r\n        startTime = new Date(); \r\n        consecutiveCorrect = 0; \r\n        allErrors = [];\r\n        \r\n        \/\/ --- ESTAS SON LAS L\u00cdNEAS QUIR\u00daRGICAS A AGREGAR ---\r\n    localStorage.setItem(consecutiveCorrectKey, '0');\r\n    localStorage.setItem(allErrorsKey, JSON.stringify([])); \/\/ Limpia el historial para el nuevo juego\r\n    localStorage.removeItem(exercisesKey); \/\/ Obliga a generar ejercicios nuevos\r\n    \/\/ --------------------------------------------------\r\n \r\n        if (roundResult) roundResult.classList.add('hidden');\r\n        if (consecutiveCorrectPara) consecutiveCorrectPara.classList.add('hidden');\r\n        verifyButtonClicked = false; \r\n        updateProgressBar(); \/\/ --- AGREGAR ESTO: La barra vuelve a cero visualmente ---\r\n        refreshGame(); \r\n    }\r\n            \r\n    \/*function playSuccessSound() { if(successAudio) successAudio.play().catch(e => {}); }*\/\r\n   \/* function playErrorSound() { if(errorAudio) errorAudio.play().catch(e => {}); }*\/\r\n\r\n    function closeErrorModal() { if(errorModal) errorModal.style.display = \"none\"; }\r\n    function closeWinModal() { if(winModal) winModal.style.display = \"none\"; }\r\n\r\n    function generateTextFile() {\r\n        const allErrors = JSON.parse(localStorage.getItem(allErrorsKey)) || [];\r\n        let content = \"Lecci\u00f3n Instructiva: El Reto del Dos\\n\\n\";\r\n        if (allErrors.length > 0) {\r\n            const firstError = allErrors[0];\r\n            content += \"\u00a1Hola! Parece que te has encontrado con una pregunta de multiplicaci\u00f3n que te ha causado un peque\u00f1o problema. No te preocupes, \u00a1vamos a aprender de este error juntos!\\n\\n\";\r\n            content += \"**Concepto Clave:**\\n\\n\";\r\n            content += `Cuando te enfrentas a una multiplicaci\u00f3n como '\u00bfCu\u00e1nto es ${firstError.factor} multiplicado por ${firstError.num}?', recuerda que la multiplicaci\u00f3n significa sumar una cantidad un n\u00famero determinado de veces.\\n\\n`;\r\n            content += \"**Explicaci\u00f3n:**\\n\\n\";\r\n            content += `Cuando multiplicamos ${firstError.factor} por ${firstError.num}, estamos buscando el resultado de sumar ${firstError.factor} un total de ${firstError.num} veces.\\n\\n`;\r\n            content += \"Vamos a ver c\u00f3mo podemos resolver esto paso a paso:\\n\\n\";\r\n            content += `1. Tomamos ${firstError.factor}, que es el n\u00famero que vamos a sumar.\\n`;\r\n            content += `2. Luego, sumamos ${firstError.factor} un total de ${firstError.num} veces.\\n`;\r\n            content += `3. Contamos el total de la suma.\\n\\n`;\r\n            content += \"**Ejemplos Pr\u00e1cticos:**\\n\\n\";\r\n            content += \"Ahora que entendemos el concepto, \u00a1vamos a practicar con algunos ejercicios!\\n\\n\";\r\n            content += \"**Ejercicio 1:**\\n\";\r\n            content += `Calcula el resultado de multiplicar ${firstError.factor} por ${firstError.num}. Recuerda que estamos buscando el resultado de sumar ${firstError.factor} un total de ${firstError.num} veces.\\n\\n`;\r\n            content += \"**Ejercicio 2:**\\n\";\r\n            content += `Imagina que tienes ${firstError.num} cajas de dulces y cada caja contiene ${firstError.factor} dulces. \u00bfCu\u00e1ntos dulces tienes en total?\\n\\n`;\r\n            content += \"Recuerda, la multiplicaci\u00f3n se trata de sumar una cantidad repetidas veces, as\u00ed que aseg\u00farate de multiplicar correctamente. \u00a1Buena suerte!\\n\\n\";\r\n            content += \"**Verificaci\u00f3n con Operaci\u00f3n Inversa:**\\n\\n\";\r\n            content += \"Despu\u00e9s de calcular la multiplicaci\u00f3n, verifica tu respuesta dividiendo el resultado entre uno de los factores, siempre asegur\u00e1ndote de no dividir por cero. Por ejemplo, en el ejercicio 1, podemos verificar\";\r\n            content += `${firstError.factor} * ${firstError.num} = ${firstError.factor * firstError.num}, dividiendo  ${firstError.factor * firstError.num} entre ${firstError.num}, `;\r\n            content += `si obtenemos ${firstError.factor}, nuestro c\u00e1lculo es correcto.\\n\\n`;\r\n            content += \"Ejercicios sugeridos a partir de los errores cometidos:\\n\\n\";\r\n        } else {\r\n            content += \"\u00a1Impresionante! Has superado el entrenamiento de la tabla del 2 con una precisi\u00f3n perfecta.\\n\\n\";\r\n        }\r\n        allErrors.forEach((error, index) => {\r\n            content += `${index + 1}. Calcula: ${error.factor} * ${error.num}=\\n`;\r\n        });\r\n\/\/ --- ESTA ES LA PARTE QUE CAMBIA PARA GENERAR PDF ---\r\n    const { jsPDF } = window.jspdf;\r\n    const doc = new jsPDF();\r\n    \r\n    \/\/ Configuramos fuente y tama\u00f1o\r\n    doc.setFont(\"helvetica\", \"normal\");\r\n    doc.setFontSize(11);\r\n\r\n    \/\/ Dividimos tu variable 'content' en l\u00edneas que quepan en el ancho del PDF\r\n    const splitText = doc.splitTextToSize(content, 180); \r\n    \r\n    \/\/ Escribimos el texto en el PDF\r\n    let yAxis = 20;\r\n    splitText.forEach(line => {\r\n        if (yAxis > 275) { \/\/ Si llegamos al final de la p\u00e1gina, creamos otra\r\n            doc.addPage();\r\n            yAxis = 20;\r\n        }\r\n        doc.text(line, 15, yAxis);\r\n        yAxis += 7; \/\/ Espaciado entre l\u00edneas\r\n    });\r\n    \r\n\/\/ --- NUEVA MEJORA: GR\u00c1FICO DE RENDIMIENTO ---\r\n    if (allErrors.length > 0) {\r\n        \/\/ Verificamos espacio en la p\u00e1gina\r\n        if (yAxis > 230) { doc.addPage(); yAxis = 20; }\r\n        \r\n        yAxis += 15; \r\n        doc.setFont(\"helvetica\", \"bold\");\r\n        doc.text(\"AN\u00c1LISIS DE RENDIMIENTO (Frecuencia de errores)\", 15, yAxis);\r\n        yAxis += 10;\r\n        doc.setFont(\"helvetica\", \"normal\");\r\n\r\n        \/\/ L\u00f3gica de conteo de errores\r\n        const conteo = {};\r\n        allErrors.forEach(err => {\r\n            const etiqueta = `${err.factor} x ${err.num}`;\r\n            conteo[etiqueta] = (conteo[etiqueta] || 0) + 1;\r\n        });\r\n\r\n        \/\/ Dibujo de las barras amarillas\r\n        Object.entries(conteo).forEach(([operacion, cantidad]) => {\r\n            doc.text(operacion, 15, yAxis + 5);\r\n            doc.setFillColor(255, 193, 7); \/\/ Color amarillo multiplicaci\u00f3n\r\n            doc.rect(40, yAxis, cantidad * 15, 6, 'F'); \r\n            doc.text(`${cantidad} fallo(s)`, 45 + (cantidad * 15), yAxis + 5);\r\n            yAxis += 10;\r\n            if (yAxis > 275) { doc.addPage(); yAxis = 20; }\r\n        });\r\n    }\r\n    \/\/ Descargamos el archivo con formato PDF\r\n    doc.save('Tarea_Tabla_2.pdf');\r\n    \/\/ --- FIN DEL CAMBIO ---\r\n}\r\n\r\n    \/\/ Event Listeners\r\n    document.getElementById('restart-btn' + suffix)?.addEventListener('click', restartGame);\r\n    document.getElementById('verify-btn' + suffix)?.addEventListener('click', verifyAnswers);\r\n    document.getElementById('continue-btn' + suffix)?.addEventListener('click', refreshGame);\r\n    document.getElementById('finish-btn' + suffix)?.addEventListener('click', showErrors);\r\n    document.getElementById('download-txt-btn' + suffix)?.addEventListener('click', generateTextFile);\r\n    document.getElementById('closeError' + suffix)?.addEventListener('click', closeErrorModal);\r\n    document.getElementById('closeWin' + suffix)?.addEventListener('click', closeWinModal);\r\n\r\n    \/\/ Inicializaci\u00f3n\r\n    const initialExercises = JSON.parse(localStorage.getItem(exercisesKey)) || generateExercises();\r\n    showExercises(initialExercises);\r\n    startTime = new Date();\r\n})();\r\nfunction playAudio(id) {\r\n    const audio = document.getElementById(id);\r\n    if (audio) {\r\n        audio.currentTime = 0; \/\/ Reinicia el audio si se llama r\u00e1pido\r\n        audio.volume = 0.6;    \/\/ Volumen equilibrado para el ni\u00f1o\r\n        audio.play().catch(e => console.log(\"Audio pendiente de carga\"));\r\n    }\r\n}\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u00abEn la multiplicaci\u00f3n, estamos combinando grupos iguales de n\u00fameros. Por ejemplo, cuando multiplicamos 8 por 2, estamos sumando 8 dos veces: 8 + 8, lo que nos da 16.\u00bb Racha: 0 \/ 27 Verificar respuestas Continuar reto An\u00e1lisis de errores Reiniciar reto &times; Descargar ejercicios a partir de los errores, en PDF &times;<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1218","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/pages\/1218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/comments?post=1218"}],"version-history":[{"count":4,"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/pages\/1218\/revisions"}],"predecessor-version":[{"id":1222,"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/pages\/1218\/revisions\/1222"}],"wp:attachment":[{"href":"https:\/\/entrenacalculo.com\/en\/wp-json\/wp\/v2\/media?parent=1218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}