Cargando..
info@fofueduca.com
Inicio
Juegos
Editor
Recursos
Videos
Cuadernos
EnglishWorld
Mosaico didáctico
Editor juegos
Acerca de
Iniciar sesión
Buscar
MIS JUEGOS en este Navegador+Dispositivo
Regístrate para acceder a tus proyectos desde cualquer dispositivo.
Volver
Crear juego
CUANTOS HAY
Nombre del juego
Tipo plantilla
Cod.HTML juego
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{global_title}}</title> {{global_pushmeta}} <style> * { margin: 0; padding: 0; box-sizing: border-box; } html { height: 100%; overflow-y: auto; } body { font-family: 'Arial', sans-serif; background: linear-gradient(135deg, #2d1b4e 0%, #3d2463 100%); display: flex; justify-content: center; padding: 10px; width: 100%; } .container { width: 100%; max-width: 900px; background: #2d1b4e; border-radius: 10px; overflow: auto; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); touch-action: auto; } .header { background: linear-gradient(135deg, #5b4a8a 0%, #4d3d78 100%); /*padding: 15px 20px;*/ display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; border-bottom: 3px solid #8b7bb8; } .logo-title { display: flex; align-items: center; gap: 10px; color: white; font-size: 24px; font-weight: bold; } .logo-title span { font-size: 32px; } .header-controls { display: flex; padding: 15px 20px; gap: 10px; align-items: center; flex-wrap: wrap; } .timer { background: rgba(255, 255, 255, 0.2); padding: 8px 15px; border-radius: 25px; color: white; font-weight: bold; font-size: 20px; min-width: 100px; text-align: center; } .score-display { background: rgba(255, 255, 255, 0.2); padding: 8px 15px; border-radius: 25px; color: white; font-weight: bold; font-size: 14px; display: none; } .score-display.active { display: block; } button { padding: 10px 20px; border: none; border-radius: 25px; font-weight: bold; cursor: pointer; font-size: 16px; transition: all 0.3s ease; white-space: nowrap; } .btn-primary { background: #6c349d; color: white; display: inline-flex; align-items: center; gap: 8px; } .btn-primary:hover { background: #7a3bb1; transform: translateY(-2px); box-shadow: 0 4px 12px rgba(85, 0, 232, 0.3); } .btn-secondary { background: #199f11; color: white; } .btn-secondary:hover { background: #1eaa16; } .btn-fullscreen { background: rgba(255, 255, 255, 0.2); color: white; width: 40px; height: 40px; padding: 0; display: flex; align-items: center; justify-content: center; border-radius: 5px; } .btn-fullscreen:hover { background: rgba(255, 255, 255, 0.3); } .btn-info { background: rgba(0, 168, 232, 0.7); color: white; width: 40px; height: 40px; padding: 0; border-radius: 50%; font-size: 18px; display: flex; align-items: center; justify-content: center; } .btn-info:hover { background: #00a8e8; } .content { padding: 20px; min-height: auto; overflow: visible; touch-action: auto; background:linear-gradient(135deg, {{color_fondo1}} 0%, {{color_fondo2}} 100%); } .blocks-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 20px; } @media (min-width: 600px) { .blocks-grid { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 599px) { .blocks-grid { grid-template-columns: 1fr; } } .block { background: white; border-radius: 10px; padding: 15px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); /*display: flex;*/ flex-direction: column; align-items: center; gap: 15px; } .block-animals { grid-column: 1 / -1; padding: 30px; position: relative; min-height: 400px; display: flex; align-items: center; justify-content: center; } .animals-container { width: 100%; height: 100%; position: relative; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 10px; } .animal-item { font-size: 40px; display: inline-block; } .drop-zone-item { display: flex; align-items: center; /*gap: 15px;*/ /*width: 100%;*/ justify-content: center; width:150px; float:right; padding-bottom:15px; } .animal-icon { font-size: 50px; } .drop-zone { width: 80px; height: 80px; border: 3px solid #7ed321; border-radius: 10px; background: rgba(126, 211, 33, 0.1); display: flex; align-items: center; justify-content: center; position: relative; transition: all 0.3s ease; } .drop-zone.highlight { background: rgba(126, 211, 33, 0.3); border-color: #5fa319; transform: scale(1.05); } .drop-zone.occupied { background: rgba(126, 211, 33, 0.2); } .numbers-container { display: flex; flex-wrap: wrap; gap: 15px; justify-content: center; padding: 20px; } .draggable { width: 70px; height: 70px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 32px; font-weight: bold; cursor: move; user-select: none; touch-action: none; transition: all 0.2s ease; box-shadow: 0 4px 8px rgba(0,0,0,0.2); } .draggable:hover { transform: translateY(-2px); box-shadow: 0 6px 12px rgba(0,0,0,0.3); } .draggable.dragging { opacity: 0.5; border: 3px solid #7ed321; box-shadow: 0 0 15px rgba(126, 211, 33, 0.6); } .draggable.in-zone { cursor: pointer; } .draggable.dragging-touch { opacity: 0.3; } .draggable-clone { position: fixed; width: 70px; height: 70px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 32px; font-weight: bold; pointer-events: none; z-index: 9999; border: 3px solid #7ed321; box-shadow: 0 0 15px rgba(126, 211, 33, 0.6); } .result-icon { position: absolute; top: -10px; right: -10px; font-size: 24px; background: white; border-radius: 50%; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 4px rgba(0,0,0,0.2); } .overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); display: flex; align-items: center; justify-content: center; z-index: 1000; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; touch-action: none; } .overlay.active { opacity: 1; pointer-events: all; } .modal { background: white; padding: 40px; border-radius: 15px; text-align: center; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); max-width: 90%; } .modal h2 { color: #2d1b4e; margin-bottom: 20px; font-size: 32px; } .modal-message { color: #555; margin: 15px 0 20px 0; font-size: 16px; font-weight: bold; } .modal p { color: #555; margin: 10px 0; font-size: 18px; } .modal button { margin-top: 20px; } .footer { background: rgba(0, 0, 0, 0.3); padding: 15px 20px; text-align: center; color: white; font-size: 12px; display: flex; align-items: center; justify-content: center; gap: 10px; border-top: 2px solid #8b7bb8; } .footer-logo { width: 95%; height: 50px; display: flex; align-items: center; justify-content: center; font-weight: bold; } .info-panel { position: fixed; top: 0; right: -400px; width: 350px; height: 100%; background: white; box-shadow: -5px 0 15px rgba(0,0,0,0.3); transition: right 0.3s; z-index: 999; padding: 20px; overflow-y: auto; } .info-panel.open { right: 0; } .info-panel h3 { color: #1e3a8a; margin-bottom: 15px; } .info-panel p { margin-bottom: 10px; line-height: 1.6; } .btn-close-info { background: #ef4444; color: white; border: none; padding: 8px 16px; border-radius: 8px; cursor: pointer; margin-top: 15px; } @media (max-width: 768px) { .header { padding: 12px 15px; } .container { max-width: 100%; border-radius: 0; } .content { padding: 15px; } .logo-title { font-size: 20px; } .block { padding: 12px; gap: 12px; } button { padding: 8px 15px; font-size: 14px; } .modal { padding: 30px 20px; } .modal h2 { font-size: 24px; } .info-panel { width: 100%; right: -100%; } .animal-item { font-size: 30px; } .animal-icon { font-size: 40px; } .drop-zone { width: 60px; height: 60px; } .draggable { width: 60px; height: 60px; font-size: 28px; } } </style> <style> /* ==================== ESTILOS CSS PARA LA PANTALLA DE RESULTADO Y PUNTAJE ==================== */ /* Contenedor principal de la pantalla de puntuación */ #puntuacionFinal { position: relative; top: 0; left: 0; width: 100%; background-color: rgba(0, 0, 0, 0.9); /* Fondo oscuro con transparencia */ color: white; display: flex; align-items: center; justify-content: center; z-index: 900; opacity: 0; /* Controlado por JS para transiciones */ transition: opacity 0.5s ease; pointer-events: none; /* No permite interacción cuando está oculto */ border-radius:25px; } .puntuacionfinal-hidden { display: none !important; opacity: 0 !important; pointer-events: none !important; } .puntuacionfinal-active { opacity: 1 !important; pointer-events: auto !important; } /* Contenido central de la puntuación */ .contenido-puntuacion { /*background-color: #333;*/ padding: 50px; margin: 50px; border-radius: 20px; text-align: center; box-shadow: 0 0 40px rgba(200, 20, 200, 0.7); /* Sombra */ z-index: 901; position: relative; transform: scale(0.9); animation: zoomIn-contenido-puntuacion 0.5s forwards; /* Animacion*/ } @keyframes zoomIn-contenido-puntuacion { to { transform: scale(1); } } .mensaje-puntuacion { font-size: 2.0em; color: #fefefe; margin-bottom: 25px; text-shadow: 3px 3px 6px #000; } .trofeo-icon { font-size: 8em; margin: 25px 0; line-height: 1; /* Animación de rebote para el trofeo */ animation: bounce-trofeo 1s infinite alternate; } .puntos-label { font-size: 1.5em; color: #dedede; margin-bottom: 5px; } .puntos-contador { font-size: 6em; color: #9762ce; /* Color Vistoso */ font-weight: 900; margin-top: 0; min-height: 1.2em; } /* Keyframes para el rebote del trofeo */ @keyframes bounce-trofeo { from { transform: translateY(0); } to { transform: translateY(-20px); } } /* ------------------- Animación de Confeti (Mixtura) ------------------- */ .confetti-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; pointer-events: none; z-index: 899; } /* Estilo para los elementos de confeti, generados dinámicamente */ .confetti { position: absolute; width: 8px; height: 15px; opacity: 0; background-color: white; /* Color por defecto, será sobrescrito */ transform-origin: center; animation: fall-confetti linear infinite; } /* Keyframes para la caída y rotación del confeti */ @keyframes fall-confetti { 0% { transform: translate(0, -100px) rotate(0deg); opacity: 0; } 10% { opacity: 1; } 100% { transform: translate(0, 100vh) rotate(1000deg); opacity: 0; } } .score-details { display: flex; justify-content: center; gap: 30px; flex-wrap: wrap; } .score-item { display: flex; flex-direction: column; align-items: center; } .score-label { font-size: 14px; opacity: 0.9; margin-bottom: 5px; } .score-value { font-size: 32px; font-weight: bold; color: #fff; } </style> </head> <body> <div id="infoPanel" class="info-panel"> {{textarea_informaciones}} <button class="btn-close-info" onclick="toggleInfo()">Cerrar</button> </div> <div class="container"> <div class="header"> <div class="logo-title"> <span><img src="{{global_logofofu}}" style="width: 100px;height: 59px;padding-top: 6px;padding-left: 6px;"></span> </div> <div class="header-controls"> <div class="timer" id="timer">00:00:00</div> <div class="score-display" id="scoreDisplay"></div> <button class="btn-primary" id="pauseBtn" onclick="togglePause()" style="display:none;"> ⏸ PAUSAR </button> <button class="btn-secondary" id="checkBtn" onclick="checkAnswers()" style="display:none;"> ✓ REVISAR </button> <button class="btn-fullscreen" onclick="toggleFullscreen()">⛶</button> <button class="btn-info" onclick="toggleInfo()">☰</button> </div> </div> <div id="puntuacionFinal" class="puntuacionfinal-hidden"> <div class="confetti-container" id="confettiContainer"></div> <div class="contenido-puntuacion"> <div class="mensaje-puntuacion" id="mensaje-puntuacion">HAS GANADO, lo hiciste muy bien 🎉</div> <div class="trofeo-icon" id="trofeo-icon">🏆</div> {{textarea_titulojuego}} <p class="puntos-label">Puntos Obtenidos:</p> <div id="puntosContador" class="puntos-contador">0</div> <div class="score-details"> <div class="score-item"> <div class="score-label">PUNTAJE</div> <div id="mensaje-puntaje" class="score-value">50/100</div> </div> <div class="score-item"> <div class="score-label">TIEMPO</div> <div id="mensaje-tiempo" class="score-value">00:00:00</div> </div> </div> <br> <button onclick="javascript:resetGame()" class="btn-secondary">🔄 REINTENTAR</button> </div> </div> <div class="overlay" id="startOverlay"> <div class="modal"> {{textarea_titulojuego}} {{textarea_instrucciones}} <button class="btn-primary" onclick="startGame()"> ▶ COMENZAR </button> </div> </div> <div class="overlay" id="pauseOverlay"> <div class="modal"> <h2>PAUSA</h2> <button class="btn-primary" onclick="togglePause()"> ▶ CONTINUAR </button> </div> </div> <div class="content" id="content" style="display:none;"> <div style="width:95%;color:#ffffff;text-align:center;padding-bottom:15px;"> {{textarea_titulojuego}} {{textarea_instrucciones}} </div> <div class="blocks-grid" id="blocksContainer"></div> </div> <div class="footer"> <div class="footer-logo"><img src="{{global_logofofu}}" style="width:100px;height:59px;"></div> <span><a target="_blank" href="https://fofueduca.com" style="color:#ffffff;">fofueduca.com</a></span> </div> </div> <div style="display:none;"> <audio id="reproductorAudioPop" controls> <source src="{{global_audiopop}}" type="audio/ogg"> </audio> </div> <script> function generarEnteroAleatorioEnRango(min, max) { if (min > max) { [min, max] = [max, min]; // Intercambia los valores si el mínimo es mayor que el máximo } min = Math.ceil(min); // Asegura que el mínimo sea un entero (opcional si ya sabes que es entero) max = Math.floor(max); // Asegura que el máximo sea un entero (opcional si ya sabes que es entero) return Math.floor(Math.random() * (max - min + 1)) + min; } let gameNumberData = {{text_cantidad_datos}};//2 a 10 let gameData = [ { tipo_cantidad: {{text_tipo_cantidad1}}, animal: '{{img_objeto1}}', emoji: '{{img_objeto1}}', count: 1, count_min: {{text_cantidad1}}, count_max: {{text_maxcantidad1}} },//9 { tipo_cantidad: {{text_tipo_cantidad2}}, animal: '{{img_objeto2}}', emoji: '{{img_objeto2}}', count: 1, count_min: {{text_cantidad2}}, count_max: {{text_maxcantidad2}} },//13 { tipo_cantidad: {{text_tipo_cantidad3}}, animal: '{{img_objeto3}}', emoji: '{{img_objeto3}}', count: 1, count_min: {{text_cantidad3}}, count_max: {{text_maxcantidad3}} },//12 { tipo_cantidad: {{text_tipo_cantidad4}}, animal: '{{img_objeto4}}', emoji: '{{img_objeto4}}', count: 1, count_min: {{text_cantidad4}}, count_max: {{text_maxcantidad4}} },//10 { tipo_cantidad: {{text_tipo_cantidad5}}, animal: '{{img_objeto5}}', emoji: '{{img_objeto5}}', count: 1, count_min: {{text_cantidad5}}, count_max: {{text_maxcantidad5}} },//7 { tipo_cantidad: {{text_tipo_cantidad6}}, animal: '{{img_objeto6}}', emoji: '{{img_objeto6}}', count: 1, count_min: {{text_cantidad6}}, count_max: {{text_maxcantidad6}} }, { tipo_cantidad: {{text_tipo_cantidad7}}, animal: '{{img_objeto7}}', emoji: '{{img_objeto7}}', count: 1, count_min: {{text_cantidad7}}, count_max: {{text_maxcantidad7}} }, { tipo_cantidad: {{text_tipo_cantidad8}}, animal: '{{img_objeto8}}', emoji: '{{img_objeto8}}', count: 1, count_min: {{text_cantidad8}}, count_max: {{text_maxcantidad8}} }, { tipo_cantidad: {{text_tipo_cantidad9}}, animal: '{{img_objeto9}}', emoji: '{{img_objeto9}}', count: 1, count_min: {{text_cantidad9}}, count_max: {{text_maxcantidad9}} }, { tipo_cantidad: {{text_tipo_cantidad10}}, animal: '{{img_objeto10}}', emoji: '{{img_objeto10}}', count: 1, count_min: {{text_cantidad10}}, count_max: {{text_maxcantidad10}} } ]; let gameState = { started: false, paused: false, checked: false, timerInterval: null, seconds: 0, score: 0, draggedElement: null, originalParent: null, touchStartX: 0, touchStartY: 0, answers: {}, clonedElement: null }; document.addEventListener('DOMContentLoaded', () => { document.getElementById('startOverlay').classList.add('active'); }); function startGame() { gameState.started = true; gameState.paused = false; gameState.checked = false; gameState.seconds = 0; gameState.score = 0; gameState.answers = {}; document.getElementById('startOverlay').classList.remove('active'); document.getElementById('content').style.display = 'block'; document.getElementById('pauseBtn').style.display = 'flex'; document.getElementById('checkBtn').style.display = 'flex'; document.getElementById('scoreDisplay').classList.remove('active'); renderBlocks(); startTimer(); } function shuffleArray(array) { const arr = [...array]; for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr; } function renderBlocks() { const container = document.getElementById('blocksContainer'); container.innerHTML = ''; // Bloque 1: Animales distribuidos aleatoriamente const animalsBlock = document.createElement('div'); animalsBlock.className = 'block block-animals'; const animalsContainer = document.createElement('div'); animalsContainer.className = 'animals-container'; for(let i=0;i<gameNumberData;i++){ if(gameData[i].tipo_cantidad==1){ gameData[i].count=gameData[i].count_min; } else { gameData[i].count=generarEnteroAleatorioEnRango(gameData[i].count_min,gameData[i].count_max); } } let allAnimals = []; gameData.slice(0,gameNumberData).forEach(item => { for (let i = 0; i < item.count; i++) { allAnimals.push(item.emoji); } }); allAnimals = shuffleArray(allAnimals); let setFont="40px"; let n=allAnimals.length; if(n<=51){ //Para 51 objetos fuente de 40px //Para 20 objetos fuente de 60px let x1=51; let y1=40; let pendiente=(60-y1)/(20-x1); let y=(pendiente*(n-x1))+y1; y=Math.round(y); setFont=y.toString()+'px'; } let setWidth=(parseInt(setFont)+10).toString()+'px'; allAnimals.forEach(emoji => { const animalSpan = document.createElement('span'); animalSpan.className = 'animal-item'; //animalSpan.textContent = emoji; if(emoji.includes('.')){ animalSpan.innerHTML = "<img style='width:"+setWidth+";height:auto;' src='"+emoji+"'>"; } else { animalSpan.style.fontSize=setFont; animalSpan.textContent = emoji; } animalsContainer.appendChild(animalSpan); }); animalsBlock.appendChild(animalsContainer); container.appendChild(animalsBlock); // Bloque 2: Zonas de caída const dropZonesBlock = document.createElement('div'); dropZonesBlock.className = 'block'; const shuffledAnimals = shuffleArray([...gameData.slice(0,gameNumberData)]); shuffledAnimals.forEach((item, index) => { const dropItem = document.createElement('div'); dropItem.className = 'drop-zone-item'; const animalIcon = document.createElement('div'); animalIcon.className = 'animal-icon'; //animalIcon.textContent = item.emoji; if(item.emoji.includes('.'))animalIcon.innerHTML = "<img style='width:60px;height:auto;' src='"+item.emoji+"'>"; else animalIcon.textContent = item.emoji; const dropZone = document.createElement('div'); dropZone.className = 'drop-zone'; dropZone.dataset.animal = item.emoji; dropZone.dataset.correct = item.count; dropZone.dataset.index = index; dropItem.appendChild(animalIcon); dropItem.appendChild(dropZone); dropZonesBlock.appendChild(dropItem); }); container.appendChild(dropZonesBlock); // Bloque 3: Números arrastrables const numbersBlock = document.createElement('div'); numbersBlock.className = 'block'; const numbersContainer = document.createElement('div'); numbersContainer.className = 'numbers-container'; numbersContainer.id = 'numbersContainer'; const numbers = shuffleArray(gameData.slice(0,gameNumberData).map(item => item.count)); numbers.forEach((num, index) => { const numDiv = document.createElement('div'); numDiv.className = 'draggable'; numDiv.textContent = num; numDiv.draggable = true; numDiv.dataset.number = num; numDiv.dataset.originalIndex = index; numDiv.addEventListener('mousedown', handleDragStart); numDiv.addEventListener('dragstart', handleDragStart); numDiv.addEventListener('dragend', handleDragEnd); numDiv.addEventListener('click', handleClick); numDiv.addEventListener('touchstart', handleTouchStart, { passive: false }); numDiv.addEventListener('touchmove', handleTouchMove, { passive: false }); numDiv.addEventListener('touchend', handleTouchEnd); numbersContainer.appendChild(numDiv); }); numbersBlock.appendChild(numbersContainer); container.appendChild(numbersBlock); setupDropZones(); } function setupDropZones() { const dropZones = document.querySelectorAll('.drop-zone'); dropZones.forEach(zone => { zone.addEventListener('dragover', handleDragOver); zone.addEventListener('drop', handleDrop); zone.addEventListener('dragleave', handleDragLeave); }); } function handleDragStart(e) { if (gameState.checked || gameState.paused) return; gameState.draggedElement = e.target; gameState.originalParent = e.target.parentElement; e.target.classList.add('dragging'); if (e.dataTransfer) { e.dataTransfer.effectAllowed = 'move'; } } function handleDragEnd(e) { e.target.classList.remove('dragging'); document.querySelectorAll('.drop-zone').forEach(zone => { zone.classList.remove('highlight'); }); document.getElementById('reproductorAudioPop').play(); } function handleDragOver(e) { e.preventDefault(); if (gameState.checked || gameState.paused) return; e.currentTarget.classList.add('highlight'); if (e.dataTransfer) { e.dataTransfer.dropEffect = 'move'; } } function handleDragLeave(e) { e.currentTarget.classList.remove('highlight'); } function handleDrop(e) { e.preventDefault(); if (gameState.checked || gameState.paused) return; const dropZone = e.currentTarget; dropZone.classList.remove('highlight'); if (dropZone.children.length > 0 && !dropZone.children[0].classList.contains('result-icon')) { gameState.originalParent.appendChild(gameState.draggedElement); return; } dropZone.appendChild(gameState.draggedElement); dropZone.classList.add('occupied'); gameState.draggedElement.classList.add('in-zone'); if (gameState.originalParent && gameState.originalParent.classList.contains('drop-zone')) { gameState.originalParent.classList.remove('occupied'); } const zoneIndex = dropZone.dataset.index; const number = gameState.draggedElement.dataset.number; gameState.answers[zoneIndex] = number; } function handleClick(e) { if (gameState.checked || gameState.paused) return; const element = e.target; // Remover cualquier clase de arrastre que pueda haber quedado element.classList.remove('dragging'); if (element.parentElement.classList.contains('drop-zone')) { const numbersContainer = document.getElementById('numbersContainer'); numbersContainer.appendChild(element); element.parentElement.classList.remove('occupied'); element.classList.remove('in-zone'); const zoneIndex = element.parentElement.dataset.index; delete gameState.answers[zoneIndex]; } } function handleTouchStart(e) { if (gameState.checked || gameState.paused) return; e.preventDefault(); const touch = e.touches[0]; gameState.draggedElement = e.target; gameState.originalParent = e.target.parentElement; gameState.touchStartX = touch.clientX; gameState.touchStartY = touch.clientY; e.target.classList.add('dragging-touch'); // Crear elemento clonado gameState.clonedElement = document.createElement('div'); gameState.clonedElement.className = 'draggable-clone'; gameState.clonedElement.textContent = e.target.textContent; gameState.clonedElement.style.left = touch.clientX - 35 + 'px'; gameState.clonedElement.style.top = touch.clientY - 35 + 'px'; document.body.appendChild(gameState.clonedElement); } function handleTouchMove(e) { if (gameState.checked || gameState.paused || !gameState.draggedElement) return; e.preventDefault(); const touch = e.touches[0]; // Actualizar posición del elemento clonado if (gameState.clonedElement) { gameState.clonedElement.style.left = touch.clientX - 35 + 'px'; gameState.clonedElement.style.top = touch.clientY - 35 + 'px'; } const element = document.elementFromPoint(touch.clientX, touch.clientY); document.querySelectorAll('.drop-zone').forEach(zone => { zone.classList.remove('highlight'); }); if (element && element.classList.contains('drop-zone')) { element.classList.add('highlight'); } } function handleTouchEnd(e) { if (gameState.checked || gameState.paused || !gameState.draggedElement) return; e.preventDefault(); gameState.draggedElement.classList.remove('dragging-touch'); // Eliminar elemento clonado if (gameState.clonedElement) { gameState.clonedElement.remove(); gameState.clonedElement = null; } const touch = e.changedTouches[0]; const element = document.elementFromPoint(touch.clientX, touch.clientY); document.querySelectorAll('.drop-zone').forEach(zone => { zone.classList.remove('highlight'); }); if (element && element.classList.contains('drop-zone')) { if (element.children.length > 0 && !element.children[0].classList.contains('result-icon')) { gameState.originalParent.appendChild(gameState.draggedElement); } else { element.appendChild(gameState.draggedElement); element.classList.add('occupied'); gameState.draggedElement.classList.add('in-zone'); if (gameState.originalParent && gameState.originalParent.classList.contains('drop-zone')) { gameState.originalParent.classList.remove('occupied'); } const zoneIndex = element.dataset.index; const number = gameState.draggedElement.dataset.number; gameState.answers[zoneIndex] = number; } } gameState.draggedElement = null; gameState.originalParent = null; document.getElementById('reproductorAudioPop').play(); } function checkAnswers() { if (!gameState.started) return; gameState.checked = true; clearInterval(gameState.timerInterval); document.getElementById('pauseBtn').style.display = 'none'; document.getElementById('checkBtn').style.display = 'none'; let score = 0; const dropZones = document.querySelectorAll('.drop-zone'); dropZones.forEach(zone => { const correctAnswer = zone.dataset.correct; const zoneIndex = zone.dataset.index; const userAnswer = gameState.answers[zoneIndex]; const numberElement = zone.querySelector('.draggable'); if (numberElement) { const resultIcon = document.createElement('div'); resultIcon.className = 'result-icon'; if (userAnswer === correctAnswer) { resultIcon.textContent = '✓'; resultIcon.style.color = 'green'; score += 1; } else { resultIcon.textContent = '✗'; resultIcon.style.color = 'red'; score -= 1; } zone.appendChild(resultIcon); } }); gameState.score = Math.max(0, score); const maxScore = gameNumberData; const timeStr = formatTime(gameState.seconds); document.getElementById('scoreDisplay').classList.add('active'); document.getElementById('scoreDisplay').textContent = `Puntaje: ${gameState.score}/${maxScore} | Tiempo: ${timeStr}`; let message = ''; let trofeo = ''; if (gameState.score === maxScore) { message = '{{text_feedback1}}'; trofeo = '🏆'; } else if (gameState.score > maxScore / 2) { message = '{{text_feedback2}}'; trofeo = '⭐'; } else { message = '{{text_feedback3}}'; trofeo = '🤲'; } // Mostrar mensaje debajo del menu mostrarPuntuacion(message,gameState.score,maxScore,timeStr,trofeo); } function resetGame() { // Limpiar elemento clonado si existe if (gameState.clonedElement) { gameState.clonedElement.remove(); } gameState = { started: false, paused: false, checked: false, timerInterval: null, seconds: 0, score: 0, draggedElement: null, originalParent: null, touchStartX: 0, touchStartY: 0, answers: {}, clonedElement: null }; document.getElementById('content').style.display = 'none'; document.getElementById('pauseBtn').style.display = 'none'; document.getElementById('checkBtn').style.display = 'none'; document.getElementById('scoreDisplay').classList.remove('active'); document.getElementById('pauseOverlay').classList.remove('active'); document.getElementById('timer').textContent = '00:00:00'; ocultarPuntuacion(); document.getElementById('startOverlay').classList.add('active'); } function togglePause() { if (!gameState.started || gameState.checked) return; gameState.paused = !gameState.paused; document.getElementById('pauseOverlay').classList.toggle('active', gameState.paused); if (gameState.paused) { clearInterval(gameState.timerInterval); } else { startTimer(); } } function startTimer() { gameState.timerInterval = setInterval(() => { gameState.seconds++; document.getElementById('timer').textContent = formatTime(gameState.seconds); }, 1000); } function formatTime(seconds) { const hrs = Math.floor(seconds / 3600); const mins = Math.floor((seconds % 3600) / 60); const secs = seconds % 60; return `${String(hrs).padStart(2, '0')}:${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`; } function toggleInfo() { const panel = document.getElementById('infoPanel'); panel.classList.toggle('open'); } function toggleFullscreen() { if (!document.fullscreenElement) { document.documentElement.requestFullscreen(); } else { document.exitFullscreen(); } } </script> <script> //FUNCIONES Y VARIABLES PARA LA PANTALLA GRANDE DE RESULTADO Y PUNTAJE const puntuacionFinal = document.getElementById('puntuacionFinal'); const puntosContador = document.getElementById('puntosContador'); const confettiContainer = document.getElementById('confettiContainer'); const DURACION_CONTADOR_MS = 1500; // Duración de la animación del contador en milisegundos const NUM_CONFETIS = 60; // Cantidad de confetis a generar let contadorAnimationFrame = null; // Para el contador de puntos let confetis = []; // Colores para el confeti const confettiColors = ['#ffc107', '#17a2b8', '#dc3545', '#28a745', '#6f42c1', '#fd7e14']; /** * Anima el contador numérico de 0 a la meta final. * Utiliza requestAnimationFrame para una animación suave. */ function animarContador(meta) { const timestampInicio = performance.now(); function actualizarContador(timestampActual) { const tiempoTranscurrido = timestampActual - timestampInicio; const progreso = Math.min(1, tiempoTranscurrido / DURACION_CONTADOR_MS); const valorActual = Math.floor(progreso * meta); puntosContador.textContent = valorActual; if (progreso < 1) { contadorAnimationFrame = requestAnimationFrame(actualizarContador); } else { puntosContador.textContent = meta; // Asegura el valor exacto al final } } contadorAnimationFrame = requestAnimationFrame(actualizarContador); } /** * Crea un elemento de confeti con propiedades de estilo aleatorias. */ function crearConfeti() { const confeti = document.createElement('div'); confeti.classList.add('confetti'); const randomColor = confettiColors[Math.floor(Math.random() * confettiColors.length)]; const randomLeft = Math.random() * 100; // Posición horizontal (0-100% viewport width) const randomDuration = Math.random() * 3 + 2; // Duración de 2s a 5s const randomDelay = Math.random() * 2; // Retraso de 0s a 2s const randomSize = Math.random() * 8 + 7; // Tamaño de 7px a 15px confeti.style.backgroundColor = randomColor; confeti.style.width = `${randomSize}px`; confeti.style.height = `${randomSize / 2}px`; /* Rectangular */ confeti.style.left = `${randomLeft}vw`; confeti.style.animationDuration = `${randomDuration}s`; confeti.style.animationDelay = `${randomDelay}s`; confettiContainer.appendChild(confeti); confetis.push(confeti); } /** * Inicia la animación de confeti creando los elementos. */ function iniciarConfeti() { for (let i = 0; i < NUM_CONFETIS; i++) { crearConfeti(); } } /** * Detiene todas las animaciones, limpia los elementos y oculta la pantalla. */ function ocultarPuntuacion() { // 1. Detener el contador if (contadorAnimationFrame !== null) { cancelAnimationFrame(contadorAnimationFrame); contadorAnimationFrame = null; } // 2. Remover los elementos de confeti (detiene su animación CSS) confetis.forEach(c => c.remove()); confetis = []; // 3. Ocultar la pantalla de puntuación puntuacionFinal.classList.remove('puntuacionfinal-active'); puntuacionFinal.classList.add('puntuacionfinal-hidden'); // 4. Resetear el contador visual puntosContador.textContent = '0'; } // Evento para mostrar la puntuación function mostrarPuntuacion(x_message,x_score,x_maxScore,x_timeStr,x_trofeo){ // Limpiar y resetear antes de mostrar para asegurar un inicio limpio ocultarPuntuacion(); document.getElementById('mensaje-puntuacion').innerHTML=x_message; document.getElementById('mensaje-puntaje').innerHTML=x_score+"/"+x_maxScore; document.getElementById('mensaje-tiempo').innerHTML=x_timeStr; document.getElementById('trofeo-icon').innerHTML=x_trofeo; puntuacionFinal.classList.remove('puntuacionfinal-hidden'); // Un pequeño retardo para asegurar que la clase puntuacionfinal-hidden se remueva antes de aplicar active setTimeout(() => { puntuacionFinal.classList.add('puntuacionfinal-active'); // Iniciar las animaciones animarContador(x_score); iniciarConfeti(); }, 10); } </script> </body> </html>
Cod.HTML form
<div class="form-group"> <label for="textarea_titulojuego">Título del juego</label> <xtextarea name="textarea_titulojuego" id="textarea_titulojuego" class="form-control" rows="7" style="width:100%;">{{textarea_titulojuego}}</xtextarea> </div> <div class="form-group"> <label for="textarea_instrucciones">Instrucciones del juego</label> <xtextarea name="textarea_instrucciones" id="textarea_instrucciones" class="form-control" rows="7" style="width:100%;">{{textarea_instrucciones}}</xtextarea> </div> <div class="form-group"> <label for="textarea_informaciones">Información del juego</label> <xtextarea name="textarea_informaciones" id="textarea_informaciones" class="form-control" rows="7" style="width:100%;">{{textarea_informaciones}}</xtextarea> </div> <div class="form-group" style="margin-top:5px;text-align:center;"> <label for="text_cantidad_datos">Cantidad de objetos a usar:</label> <select name="text_cantidad_datos" id="text_cantidad_datos" size="1" onchange="mostrarSeccionesObjetos()"> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> </div> <div class="row"> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato1"> {{img_objeto1_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto1" id="img_objeto1" class="form-control" value="{{img_objeto1}}"> </div> <div class="form-group"> <label for="text_cantidad1">Cantidad</label> <select name="text_tipo_cantidad1" id="text_tipo_cantidad1" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad1" id="text_cantidad1" class="form-control" value="{{text_cantidad1}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad1"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad1" id="text_maxcantidad1" class="form-control" value="{{text_maxcantidad1}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato2"> {{img_objeto2_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto2" id="img_objeto2" class="form-control" value="{{img_objeto2}}"> </div> <div class="form-group"> <label for="text_cantidad2">Cantidad</label> <select name="text_tipo_cantidad2" id="text_tipo_cantidad2" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad2" id="text_cantidad2" class="form-control" value="{{text_cantidad2}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad2"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad2" id="text_maxcantidad2" class="form-control" value="{{text_maxcantidad2}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato3"> {{img_objeto3_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto3" id="img_objeto3" class="form-control" value="{{img_objeto3}}"> </div> <div class="form-group"> <label for="text_cantidad3">Cantidad</label> <select name="text_tipo_cantidad3" id="text_tipo_cantidad3" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad3" id="text_cantidad3" class="form-control" value="{{text_cantidad3}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad3"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad3" id="text_maxcantidad3" class="form-control" value="{{text_maxcantidad3}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato4"> {{img_objeto4_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto4" id="img_objeto4" class="form-control" value="{{img_objeto4}}"> </div> <div class="form-group"> <label for="text_cantidad4">Cantidad</label> <select name="text_tipo_cantidad4" id="text_tipo_cantidad4" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad4" id="text_cantidad4" class="form-control" value="{{text_cantidad4}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad4"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad4" id="text_maxcantidad4" class="form-control" value="{{text_maxcantidad4}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato5"> {{img_objeto5_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto5" id="img_objeto5" class="form-control" value="{{img_objeto5}}"> </div> <div class="form-group"> <label for="text_cantidad5">Cantidad</label> <select name="text_tipo_cantidad5" id="text_tipo_cantidad5" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad5" id="text_cantidad5" class="form-control" value="{{text_cantidad5}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad5"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad5" id="text_maxcantidad5" class="form-control" value="{{text_maxcantidad5}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato6"> {{img_objeto6_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto6" id="img_objeto6" class="form-control" value="{{img_objeto6}}"> </div> <div class="form-group"> <label for="text_cantidad6">Cantidad</label> <select name="text_tipo_cantidad6" id="text_tipo_cantidad6" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad6" id="text_cantidad6" class="form-control" value="{{text_cantidad6}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad6"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad6" id="text_maxcantidad6" class="form-control" value="{{text_maxcantidad6}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato7"> {{img_objeto7_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto7" id="img_objeto7" class="form-control" value="{{img_objeto7}}"> </div> <div class="form-group"> <label for="text_cantidad7">Cantidad</label> <select name="text_tipo_cantidad7" id="text_tipo_cantidad7" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad7" id="text_cantidad7" class="form-control" value="{{text_cantidad7}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad7"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad7" id="text_maxcantidad7" class="form-control" value="{{text_maxcantidad7}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato8"> {{img_objeto8_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto8" id="img_objeto8" class="form-control" value="{{img_objeto8}}"> </div> <div class="form-group"> <label for="text_cantidad8">Cantidad</label> <select name="text_tipo_cantidad8" id="text_tipo_cantidad8" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad8" id="text_cantidad8" class="form-control" value="{{text_cantidad8}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad8"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad8" id="text_maxcantidad8" class="form-control" value="{{text_maxcantidad8}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato9"> {{img_objeto9_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto9" id="img_objeto9" class="form-control" value="{{img_objeto9}}"> </div> <div class="form-group"> <label for="text_cantidad9">Cantidad</label> <select name="text_tipo_cantidad9" id="text_tipo_cantidad9" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad9" id="text_cantidad9" class="form-control" value="{{text_cantidad9}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad9"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad9" id="text_maxcantidad9" class="form-control" value="{{text_maxcantidad9}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> <div class="col-md-6"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;" id="seccion_bloque_dato10"> {{img_objeto10_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_objeto10" id="img_objeto10" class="form-control" value="{{img_objeto10}}"> </div> <div class="form-group"> <label for="text_cantidad10">Cantidad</label> <select name="text_tipo_cantidad10" id="text_tipo_cantidad10" size="1" onchange="mostrarSeccionesRangos()"> <option value="0">Aleatoria</option> <option value="1">Fija</option> </select> <div style="display:flex;align-items:center;"> <div> <input type="number" min="0" max="100" name="text_cantidad10" id="text_cantidad10" class="form-control" value="{{text_cantidad10}}" style="margin-right:5px;"> </div> <div id="seccion_maxcantidad10"> <div style="float:left;">a</div> <div style="float:left;"> <input type="number" min="0" max="100" name="text_maxcantidad10" id="text_maxcantidad10" class="form-control" value="{{text_maxcantidad10}}" style="margin-left:5px;"> </div> </div> </div> </div> </div> </div> </div> <div class="row"> <div class="col-md-12"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;"> Mensajes al revisar el juego según los puntos obtenidos <div class="form-group"> <label for="text_feedback1">Si obtuvo el 100% del puntaje</label> <input type="text" name="text_feedback1" id="text_feedback1" class="form-control" value="{{text_feedback1}}"> </div> <div class="form-group"> <label for="text_feedback2">Si obtuvo más del 50% del puntaje</label> <input type="text" name="text_feedback2" id="text_feedback2" class="form-control" value="{{text_feedback2}}"> </div> <div class="form-group"> <label for="text_feedback3">Si obtuvo menos del 50% del puntaje</label> <input type="text" name="text_feedback3" id="text_feedback3" class="form-control" value="{{text_feedback3}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;"> Color de fondo <div style="width:100%;align-content:center;clear:both;"> <div style="float:left;"> <div style="display: none;"> <input type="text" name="color_fondo1" id="color_fondo1" class="form-control" value="{{color_fondo1}}"> </div> <input type="text" name="color_fondo1_picker" id="color_fondo1_picker" class="form-control" style="width:60px;display:initial;" value="{{color_fondo1}}" /> <script> initColorSpectrum("color_fondo1","color_fondo1_picker","{{color_fondo1}}"); </script> </div> <div style="float:left;"> <div style="display: none;"> <input type="text" name="color_fondo2" id="color_fondo2" class="form-control" value="{{color_fondo2}}"> </div> <input type="text" name="color_fondo2_picker" id="color_fondo2_picker" class="form-control" style="width:60px;display:initial;" value="{{color_fondo2}}" /> <script> initColorSpectrum("color_fondo2","color_fondo2_picker","{{color_fondo2}}"); </script> </div> </div> </div> </div> </div> <script> var max_secciones_datos=10; function mostrarSeccionesObjetos() { var cantidad=parseInt(document.getElementById('text_cantidad_datos').value); for(let dd=1;dd<=cantidad;dd++){ document.getElementById('seccion_bloque_dato'+dd.toString()).style.display='block'; } for(let dd=cantidad+1;dd<=max_secciones_datos;dd++){ document.getElementById('seccion_bloque_dato'+dd.toString()).style.display='none'; } } function mostrarSeccionesRangos() { if(document.getElementById('text_tipo_cantidad1').value=='1'){ document.getElementById('seccion_maxcantidad1').style.display='none'; } else { document.getElementById('seccion_maxcantidad1').style.display='block'; } if(document.getElementById('text_tipo_cantidad2').value=='1'){ document.getElementById('seccion_maxcantidad2').style.display='none'; } else { document.getElementById('seccion_maxcantidad2').style.display='block'; } if(document.getElementById('text_tipo_cantidad3').value=='1'){ document.getElementById('seccion_maxcantidad3').style.display='none'; } else { document.getElementById('seccion_maxcantidad3').style.display='block'; } if(document.getElementById('text_tipo_cantidad4').value=='1'){ document.getElementById('seccion_maxcantidad4').style.display='none'; } else { document.getElementById('seccion_maxcantidad4').style.display='block'; } if(document.getElementById('text_tipo_cantidad5').value=='1'){ document.getElementById('seccion_maxcantidad5').style.display='none'; } else { document.getElementById('seccion_maxcantidad5').style.display='block'; } if(document.getElementById('text_tipo_cantidad6').value=='1'){ document.getElementById('seccion_maxcantidad6').style.display='none'; } else { document.getElementById('seccion_maxcantidad6').style.display='block'; } if(document.getElementById('text_tipo_cantidad7').value=='1'){ document.getElementById('seccion_maxcantidad7').style.display='none'; } else { document.getElementById('seccion_maxcantidad7').style.display='block'; } if(document.getElementById('text_tipo_cantidad8').value=='1'){ document.getElementById('seccion_maxcantidad8').style.display='none'; } else { document.getElementById('seccion_maxcantidad8').style.display='block'; } if(document.getElementById('text_tipo_cantidad9').value=='1'){ document.getElementById('seccion_maxcantidad9').style.display='none'; } else { document.getElementById('seccion_maxcantidad9').style.display='block'; } if(document.getElementById('text_tipo_cantidad10').value=='1'){ document.getElementById('seccion_maxcantidad10').style.display='none'; } else { document.getElementById('seccion_maxcantidad10').style.display='block'; } } document.getElementById('text_tipo_cantidad1').value="{{text_tipo_cantidad1}}"; document.getElementById('text_tipo_cantidad2').value="{{text_tipo_cantidad2}}"; document.getElementById('text_tipo_cantidad3').value="{{text_tipo_cantidad3}}"; document.getElementById('text_tipo_cantidad4').value="{{text_tipo_cantidad4}}"; document.getElementById('text_tipo_cantidad5').value="{{text_tipo_cantidad5}}"; document.getElementById('text_tipo_cantidad6').value="{{text_tipo_cantidad6}}"; document.getElementById('text_tipo_cantidad7').value="{{text_tipo_cantidad7}}"; document.getElementById('text_tipo_cantidad8').value="{{text_tipo_cantidad8}}"; document.getElementById('text_tipo_cantidad9').value="{{text_tipo_cantidad9}}"; document.getElementById('text_tipo_cantidad10').value="{{text_tipo_cantidad10}}"; document.getElementById('text_cantidad_datos').value="{{text_cantidad_datos}}"; mostrarSeccionesObjetos(); mostrarSeccionesRangos(); </script>
Cod.HTML js
{"text_feedback1":"Excelente, lo hiciste muy bien.","text_feedback2":"Lo hiciste bien, vuelve a intentarlo.","text_feedback3":"Vamos tu puedes, intentalo de nuevo","color_fondo1":"#0b5394","color_fondo2":"#6d4794","textarea_informaciones":"<h3>\ud83d\udcda Información del Juego</h3>\r\n<p><strong>Objetivo:</strong> Cuenta el número de animales.</p>\r\n<p><strong>Tipo de puntuación:</strong></p>\r\n<ul>\r\n<li>Respuesta correcta: +1 punto</li>\r\n<li>Respuesta incorrecta: -1 punto</li>\r\n<li>Máximo: 5 puntos</li>\r\n</ul>\r\n<p><strong>Instrucciones:</strong> Cuenta los animales y arrastra la cantidad correcta en la casilla.</p>","textarea_titulojuego":"<h1>¿CUANTOS HAY?</h1>","textarea_instrucciones":"<h2>Cuenta y arrastra el número que corresponde a cada uno de los animales.</h2>","img_objeto1":"\ud83d\udc15\ufe0f","text_cantidad1":"2","img_objeto2":"\ud83e\udd86","text_cantidad2":"3","img_objeto3":"\ud83d\udc11","text_cantidad3":"5","img_objeto4":"\ud83d\udc34","text_cantidad4":"7","img_objeto5":"\ud83e\udd99","text_cantidad5":"9","text_maxcantidad1":"6","text_maxcantidad2":"4","text_maxcantidad3":"6","text_maxcantidad4":"8","text_maxcantidad5":"10","text_tipo_cantidad1":"1","text_tipo_cantidad2":"1","text_tipo_cantidad3":"1","text_tipo_cantidad4":"1","text_tipo_cantidad5":"1","text_cantidad_datos":"5","text_tipo_cantidad6":"1","img_objeto6":"\ud83d\udc2d","text_cantidad6":"1","text_maxcantidad6":"2","text_tipo_cantidad7":"0","img_objeto7":"\ud83d\udc14","text_cantidad7":"1","text_maxcantidad7":"2","text_tipo_cantidad8":"0","img_objeto8":"\ud83d\udc30","text_cantidad8":"1","text_maxcantidad8":"2","text_tipo_cantidad9":"0","img_objeto9":"\ud83d\udc04","text_cantidad9":"1","text_maxcantidad9":"2","text_tipo_cantidad10":"0","img_objeto10":"\ud83d\udc24","text_cantidad10":"1","text_maxcantidad10":"2"}
FOFUEDUCA
, Copyright 2025