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
ANIMALES VERTEBRADOS E INVERTEBRADOS
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%); } .menu-blocks-grid { display: block; } .blocks-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; margin-bottom: 20px; } .drop-zone { background: white; border-radius: 10px; padding: 15px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); min-height: 300px; position: relative; } .drop-zone-title { background: #e6e2ea; color: #000000; padding: 10px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 18px; margin-bottom: 15px; margin-right:10px; } .drop-zone-subtitle { background: #e1ecfc; color: #000000; padding: 10px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 18px; margin-bottom: 15px; } .drop-zone.highlight { background: #e8f5e9; box-shadow: 0 0 20px rgba(139, 195, 74, 0.5); } .animals-container { grid-column: 1 / -1; background: white; border-radius: 10px; padding: 15px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); } .animals-title { background: #e1ecfc; color: #000000; padding: 10px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 18px; margin-bottom: 15px; } .animals-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(80px, 1fr)); gap: 15px; padding: 10px; } .animal-item { width: 80px; height: 80px; font-size:56px; cursor: grab; user-select: none; position: relative; transition: transform 0.2s; } .animal-item:active { cursor: grabbing; } .animal-item.dragging { opacity: 0.5; border: 3px solid #4caf50; border-radius: 10px; box-shadow: 0 0 15px rgba(76, 175, 80, 0.7); } .animal-item img { width: 100%; height: 100%; object-fit: contain; pointer-events: none; } .status-icon { position: absolute; top: -10px; right: -10px; width: 30px; height: 30px; border-radius: 50%; display: none; align-items: center; justify-content: center; font-size: 18px; z-index: 10; } .status-icon.correct { background: #4caf50; display: flex; } .status-icon.incorrect { background: #f44336; display: flex; } .dropped-animals { display: grid; grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); gap: 10px; min-height: 200px; } .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; } .drag-clone { position: fixed; pointer-events: none; z-index: 9999; opacity: 0.9; width: 80px; height: 80px; border: 3px solid #4caf50; border-radius: 10px; box-shadow: 0 0 20px rgba(76, 175, 80, 0.8); background: white; padding: 5px; } /*.drag-clone img { width: 100%; height: 100%; object-fit: contain; }*/ @media (max-width: 768px) { .blocks-grid { grid-template-columns: 1fr; } .animals-grid { grid-template-columns: repeat(auto-fit, minmax(60px, 1fr)); gap: 10px; } /*.animal-item {width: 60px;height: 60px;font-size: 52px;}*/ .header { padding: 12px 15px; } .container { max-width: 100%; border-radius: 0; } .content { padding: 15px; } .logo-title { font-size: 20px; } button { padding: 8px 15px; font-size: 14px; } .modal { padding: 30px 20px; } .modal h2 { font-size: 24px; } .info-panel { width: 100%; right: -100%; } } </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="dragClone" class="drag-clone"></div>--> <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="menu-blocks-grid" id="menuBlocksContainer"></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> let gameNumberCategory = {{text_cantidad_categorias}};//2 or 3 let gameNumberData = {{text_cantidad_palabras}}; const gameData1 = [ { value: '{{text_1_1}}', img: '{{img_1_1}}', type: '0' }, { value: '{{text_1_2}}', img: '{{img_1_2}}', type: '0' }, { value: '{{text_1_3}}', img: '{{img_1_3}}', type: '0' }, { value: '{{text_1_4}}', img: '{{img_1_4}}', type: '0' }, { value: '{{text_1_5}}', img: '{{img_1_5}}', type: '0' }, { value: '{{text_1_6}}', img: '{{img_1_6}}', type: '0' }, { value: '{{text_1_7}}', img: '{{img_1_7}}', type: '0' }, { value: '{{text_1_8}}', img: '{{img_1_8}}', type: '0' }, { value: '{{text_1_8}}', img: '{{img_1_9}}', type: '0' }, { value: '{{text_1_10}}', img: '{{img_1_10}}', type: '0' } ]; const gameData2 = [ { value: '{{text_2_1}}', img: '{{img_2_1}}', type: '1' }, { value: '{{text_2_2}}', img: '{{img_2_2}}', type: '1' }, { value: '{{text_2_3}}', img: '{{img_2_3}}', type: '1' }, { value: '{{text_2_4}}', img: '{{img_2_4}}', type: '1' }, { value: '{{text_2_5}}', img: '{{img_2_5}}', type: '1' }, { value: '{{text_2_6}}', img: '{{img_2_6}}', type: '1' }, { value: '{{text_2_7}}', img: '{{img_2_7}}', type: '1' }, { value: '{{text_2_8}}', img: '{{img_2_8}}', type: '1' }, { value: '{{text_2_9}}', img: '{{img_2_9}}', type: '1' }, { value: '{{text_2_10}}', img: '{{img_2_10}}', type: '1' } ]; const gameData3 = [ { value: '{{text_3_1}}', img: '{{img_3_1}}', type: '2' }, { value: '{{text_3_2}}', img: '{{img_3_2}}', type: '2' }, { value: '{{text_3_3}}', img: '{{img_3_3}}', type: '2' }, { value: '{{text_3_4}}', img: '{{img_3_4}}', type: '2' }, { value: '{{text_3_5}}', img: '{{img_3_5}}', type: '2' }, { value: '{{text_3_6}}', img: '{{img_3_6}}', type: '2' }, { value: '{{text_3_7}}', img: '{{img_3_7}}', type: '2' }, { value: '{{text_3_8}}', img: '{{img_3_8}}', type: '2' }, { value: '{{text_3_9}}', img: '{{img_3_9}}', type: '2' }, { value: '{{text_3_10}}', img: '{{img_3_10}}', type: '2' } ]; const categories = [ { id: '0', name: '{{text_categoria1}}'}, { id: '1', name: '{{text_categoria2}}'}, { id: '2', name: '{{text_categoria3}}'} ]; let gameState = { started: false, paused: false, checked: false, timerInterval: null, seconds: 0, score: 0, placements: {} }; let draggedElement = null; let clonedElement = null; let currentTouchTarget = 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.placements = {}; 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 displayBlockCategoryId(xid_category_block){ let cont=0; categories.forEach(cat => { if (cont<gameNumberCategory){ document.getElementById('id_data_zone_'+cat.id).style.display='none'; document.getElementById('id_button_block_'+cat.id).style.background='#e6e2ea'; } cont++; }); document.getElementById('id_data_zone_'+xid_category_block).style.display='grid'; document.getElementById('id_button_block_'+xid_category_block).style.background='#63EA5B'; document.getElementById('id_btn_block_todo').style.background='#e6e2ea'; } function displayAllBlocksCategories(){ let cont=0; categories.forEach(cat => { if (cont<gameNumberCategory){ document.getElementById('id_data_zone_'+cat.id).style.display='grid'; document.getElementById('id_button_block_'+cat.id).style.background='#e6e2ea'; } cont++; }); document.getElementById('id_btn_block_todo').style.background='#63EA5B'; } function renderBlocks() { const container = document.getElementById('blocksContainer'); container.innerHTML = ''; // Zona Vertebrados const vertebradosZone = document.createElement('div'); vertebradosZone.className = 'drop-zone'; vertebradosZone.id = 'id_data_zone_0'; vertebradosZone.dataset.zone = '0'; vertebradosZone.innerHTML = ` <div class="drop-zone-subtitle">${categories[0].name}</div> <div class="dropped-animals" data-zone="0"></div> `; const boxZone0 = document.createElement('div'); boxZone0.style.display="inline-block"; boxZone0.innerHTML=` <div class="drop-zone-title" id="id_button_block_0" onclick="displayBlockCategoryId('0')">${categories[0].name}</div> `; // Zona Invertebrados const invertebradosZone = document.createElement('div'); invertebradosZone.className = 'drop-zone'; invertebradosZone.id = 'id_data_zone_1'; invertebradosZone.dataset.zone = '1'; invertebradosZone.innerHTML = ` <div class="drop-zone-subtitle">${categories[1].name}</div> <div class="dropped-animals" data-zone="1"></div> `; const boxZone1 = document.createElement('div'); boxZone1.style.display="inline-block"; boxZone1.innerHTML=` <div class="drop-zone-title" id="id_button_block_1" onclick="displayBlockCategoryId('1')">${categories[1].name}</div> `; const frutasZone = document.createElement('div'); const boxZone2 = document.createElement('div'); boxZone2.style.display="inline-block"; if(gameNumberCategory==3){ // Zona Frutas frutasZone.className = 'drop-zone'; frutasZone.id = 'id_data_zone_2'; frutasZone.dataset.zone = '2'; frutasZone.innerHTML = ` <div class="drop-zone-subtitle">${categories[2].name}</div> <div class="dropped-animals" data-zone="2"></div> `; boxZone2.innerHTML=` <div class="drop-zone-title" id="id_button_block_2" onclick="displayBlockCategoryId('2')">${categories[2].name}</div> `; } const boxZoneTodo = document.createElement('div'); boxZoneTodo.style.display="inline-block"; boxZoneTodo.innerHTML=` <div class="drop-zone-title" style="background:#63EA5B;" id="id_btn_block_todo" onclick="displayAllBlocksCategories()">Todas</div> `; const menuContainer = document.getElementById('menuBlocksContainer'); menuContainer.appendChild(boxZone0); menuContainer.appendChild(boxZone1); if(gameNumberCategory==3)menuContainer.appendChild(boxZone2); menuContainer.appendChild(boxZoneTodo); container.appendChild(vertebradosZone); container.appendChild(invertebradosZone); if(gameNumberCategory==3)container.appendChild(frutasZone); //Default 3 category let xgameData=[...gameData1.slice(0,gameNumberData),...gameData2.slice(0,gameNumberData),...gameData3.slice(0,gameNumberData)];//Unir datos if(gameNumberCategory==2){//Two category xgameData=[...gameData1.slice(0,gameNumberData),...gameData2.slice(0,gameNumberData)];//Unir datos } // Contenedor de animales (orden aleatorio) const shuffledData = [...xgameData].sort(() => Math.random() - 0.5); const animalsContainer = document.createElement('div'); animalsContainer.className = 'animals-container'; animalsContainer.innerHTML = ` <div class="animals-title">Animales para Clasificar</div> <div class="animals-grid" id="animalsPool"></div> `; container.appendChild(animalsContainer); const animalsPool = animalsContainer.querySelector('#animalsPool'); shuffledData.forEach((animal, index) => { const animalDiv = document.createElement('div'); animalDiv.className = 'animal-item'; animalDiv.draggable = true; animalDiv.dataset.value = animal.value; animalDiv.dataset.type = animal.type; animalDiv.dataset.id = `animal-${index}`; if(animal.img.includes('.')){ animalDiv.innerHTML = ` <div class="status-icon"></div> <img style="width:100%;height:100%;" src="${animal.img}"> <div style="font-size:22px;text-align:center;line-height:0px;">${animal.value}</div> `; } else { animalDiv.innerHTML = ` <div class="status-icon"></div> ${animal.img} <div style="font-size:22px;text-align:center;">${animal.value}</div> `; } // Eventos de arrastre para desktop animalDiv.addEventListener('dragstart', handleDragStart); animalDiv.addEventListener('dragend', handleDragEnd); animalDiv.addEventListener('click', handleClick); // Eventos táctiles para móvil animalDiv.addEventListener('touchstart', handleTouchStart, { passive: false }); animalDiv.addEventListener('touchmove', handleTouchMove, { passive: false }); animalDiv.addEventListener('touchend', handleTouchEnd, { passive: false }); animalsPool.appendChild(animalDiv); }); // Configurar zonas de caída document.querySelectorAll('.dropped-animals').forEach(zone => { zone.addEventListener('dragover', handleDragOver); zone.addEventListener('drop', handleDrop); zone.addEventListener('dragleave', handleDragLeave); }); } function handleDragStart(e) { if (gameState.checked) return; draggedElement = e.target.closest('.animal-item'); draggedElement.classList.add('dragging'); e.dataTransfer.effectAllowed = 'move'; } function handleDragEnd(e) { if (draggedElement) { draggedElement.classList.remove('dragging'); draggedElement = null; } document.querySelectorAll('.drop-zone').forEach(z => z.classList.remove('highlight')); document.getElementById('reproductorAudioPop').play(); } function handleDragOver(e) { if (gameState.checked) return; e.preventDefault(); e.dataTransfer.dropEffect = 'move'; const zone = e.target.closest('.drop-zone'); if (zone) zone.classList.add('highlight'); } function handleDragLeave(e) { const zone = e.target.closest('.drop-zone'); if (zone && !zone.contains(e.relatedTarget)) { zone.classList.remove('highlight'); } } function handleDrop(e) { e.preventDefault(); if (gameState.checked || !draggedElement) return; const zone = e.target.closest('.dropped-animals'); const dropZoneElement = e.target.closest('.drop-zone'); if (zone && dropZoneElement) { dropZoneElement.classList.remove('highlight'); const zoneType = zone.dataset.zone; const animalId = draggedElement.dataset.id; gameState.placements[animalId] = zoneType; zone.appendChild(draggedElement); } handleDragEnd(e); } function handleClick(e) { if (gameState.checked) return; const animal = e.target.closest('.animal-item'); if (!animal) return; const isInDropZone = animal.closest('.dropped-animals'); if (isInDropZone) { const animalId = animal.dataset.id; delete gameState.placements[animalId]; document.getElementById('animalsPool').appendChild(animal); } } // Touch events para móviles function handleTouchStart(e) { if (gameState.checked) return; e.preventDefault(); draggedElement = e.target.closest('.animal-item'); draggedElement.classList.add('dragging'); // Crear elemento clonado //clonedElement = document.getElementById('dragClone'); const touch = e.touches[0]; // Copiar el contenido del animal al clon //const img = draggedElement.querySelector('img'); //clonedElement.innerHTML = `<img src="${img.src}" alt="">`; //clonedElement.style.display = 'block'; //clonedElement.style.left = (touch.pageX - 40) + 'px'; //clonedElement.style.top = (touch.pageY - 40) + 'px'; // Crear elemento clonado clonedElement = document.createElement('div'); clonedElement.className = 'drag-clone'; clonedElement.innerHTML = draggedElement.innerHTML; clonedElement.style.left = touch.clientX - 35 + 'px'; clonedElement.style.top = touch.clientY - 35 + 'px'; document.body.appendChild(clonedElement); } function handleTouchMove(e) { if (gameState.checked || !draggedElement || !clonedElement) return; e.preventDefault(); const touch = e.touches[0]; // Mover el elemento clonado con el dedo //clonedElement.style.left = (touch.pageX - 40) + 'px'; //clonedElement.style.top = (touch.pageY - 40) + 'px'; // Actualizar posición del elemento clonado if (clonedElement) { clonedElement.style.left = touch.clientX - 35 + 'px'; clonedElement.style.top = touch.clientY - 35 + 'px'; } // Detectar sobre qué zona está el dedo const elementBelow = document.elementFromPoint(touch.clientX, touch.clientY); const dropZone = elementBelow?.closest('.drop-zone'); // Resaltar zona de destino document.querySelectorAll('.drop-zone').forEach(z => z.classList.remove('highlight')); if (dropZone) { dropZone.classList.add('highlight'); currentTouchTarget = dropZone.querySelector('.dropped-animals'); } else { currentTouchTarget = null; } } function handleTouchEnd(e) { if (gameState.checked || !draggedElement) return; e.preventDefault(); // Ocultar elemento clonado //if (clonedElement) { // clonedElement.style.display = 'none'; // clonedElement.innerHTML = ''; //} // Eliminar elemento clonado if (clonedElement) { clonedElement.remove(); clonedElement = null; } // Si hay una zona de destino válida, mover el animal if (currentTouchTarget) { const zoneType = currentTouchTarget.dataset.zone; const animalId = draggedElement.dataset.id; gameState.placements[animalId] = zoneType; currentTouchTarget.appendChild(draggedElement); } // Limpiar estados draggedElement.classList.remove('dragging'); document.querySelectorAll('.drop-zone').forEach(z => z.classList.remove('highlight')); draggedElement = null; clonedElement = null; currentTouchTarget = null; document.getElementById('reproductorAudioPop').play(); } 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 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 maxScore = gameNumberCategory*gameNumberData; document.querySelectorAll('.animal-item').forEach(animal => { const animalId = animal.dataset.id; const correctType = animal.dataset.type; const placedType = gameState.placements[animalId]; const statusIcon = animal.querySelector('.status-icon'); //console.log(placedType); //console.log(correctType); //console.log('------------'); if (placedType) { if (placedType === correctType) { score += 1; statusIcon.className = 'status-icon correct'; statusIcon.textContent = '✓'; } else { score -= 1; statusIcon.className = 'status-icon incorrect'; statusIcon.textContent = '✗'; } } }); gameState.score = score; 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 = 'Excelente, lo hiciste muy bien.'; trofeo = '🏆'; } else if (gameState.score > maxScore / 2) { message = 'Lo hiciste bien, vuelve a intentarlo'; trofeo = '⭐'; } else { message = 'Vamos tu puedes, inténtalo de nuevo'; trofeo = '🤲'; } // Mostrar mensaje debajo del menu mostrarPuntuacion(message,gameState.score,maxScore,timeStr,trofeo); } function resetGame() { // Limpiar elemento clonado si existe if (clonedElement) { clonedElement.remove(); } gameState = { started: false, paused: false, checked: false, timerInterval: null, seconds: 0, score: 0, placements: {} }; 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 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" style="margin-top:5px;"> <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" style="margin-top:5px;"> <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;"> <div class="form-group"> <label for="text_bloque_clasificar_titulo">Título bloque clasificar</label> <input type="text" name="text_bloque_clasificar_titulo" id="text_bloque_clasificar_titulo" class="form-control" value="{{text_bloque_clasificar_titulo}}"> </div> </div> <div class="form-group" style="margin-top:5px;"> <label for="text_cantidad_categorias">Cantidad categorias a usar:</label> <select name="text_cantidad_categorias" id="text_cantidad_categorias" size="1" onchange="mostrarSeccionesPalabras()"> <option value="2">2</option> <option value="3">3</option> </select> <label for="text_cantidad_palabras">Cantidad de palabras por categoria:</label> <select name="text_cantidad_palabras" id="text_cantidad_palabras" size="1" onchange="mostrarSeccionesPalabras()"> <option value="1">1</option> <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 style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;background:#fff1db;" id="seccion_categoria1"> <div class="form-group"> <label for="text_categoria1">Categoria 1: </label> <input type="text" name="text_categoria1" id="text_categoria1" class="form-control" value="{{text_categoria1}}"> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_1_1"> <div class="form-group"> <label for="text_1_1">1</label> <input type="text" name="text_1_1" id="text_1_1" class="form-control" value="{{text_1_1}}"> {{img_1_1_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_1" id="img_1_1" class="form-control" value="{{img_1_1}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_1_2"> <div class="form-group"> <label for="text_1_2">2</label> <input type="text" name="text_1_2" id="text_1_2" class="form-control" value="{{text_1_2}}"> {{img_1_2_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_2" id="img_1_2" class="form-control" value="{{img_1_2}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_1_3"> <div class="form-group"> <label for="text_1_3">3</label> <input type="text" name="text_1_3" id="text_1_3" class="form-control" value="{{text_1_3}}"> {{img_1_3_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_3" id="img_1_3" class="form-control" value="{{img_1_3}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_1_4"> <div class="form-group"> <label for="text_1_4">4</label> <input type="text" name="text_1_4" id="text_1_4" class="form-control" value="{{text_1_4}}"> {{img_1_4_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_4" id="img_1_4" class="form-control" value="{{img_1_4}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_1_5"> <div class="form-group"> <label for="text_1_5">5</label> <input type="text" name="text_1_5" id="text_1_5" class="form-control" value="{{text_1_5}}"> {{img_1_5_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_5" id="img_1_5" class="form-control" value="{{img_1_5}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_1_6"> <div class="form-group"> <label for="text_1_6">6</label> <input type="text" name="text_1_6" id="text_1_6" class="form-control" value="{{text_1_6}}"> {{img_1_6_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_6" id="img_1_6" class="form-control" value="{{img_1_6}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_1_7"> <div class="form-group"> <label for="text_1_7">7</label> <input type="text" name="text_1_7" id="text_1_7" class="form-control" value="{{text_1_7}}"> {{img_1_7_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_7" id="img_1_7" class="form-control" value="{{img_1_7}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_1_8"> <div class="form-group"> <label for="text_1_8">8</label> <input type="text" name="text_1_8" id="text_1_8" class="form-control" value="{{text_1_8}}"> {{img_1_8_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_8" id="img_1_8" class="form-control" value="{{img_1_8}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_1_9"> <div class="form-group"> <label for="text_1_9">9</label> <input type="text" name="text_1_9" id="text_1_9" class="form-control" value="{{text_1_9}}"> {{img_1_9_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_9" id="img_1_9" class="form-control" value="{{img_1_9}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_1_10"> <div class="form-group"> <label for="text_1_10">10</label> <input type="text" name="text_1_10" id="text_1_10" class="form-control" value="{{text_1_10}}"> {{img_1_10_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_1_10" id="img_1_10" class="form-control" value="{{img_1_10}}"> </div> </div> </div> </div> </div> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;background:#cce9df;" id="seccion_categoria2"> <div class="form-group"> <label for="text_categoria2">Categoria 2: </label> <input type="text" name="text_categoria2" id="text_categoria2" class="form-control" value="{{text_categoria2}}"> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_2_1"> <div class="form-group"> <label for="text_2_1">1</label> <input type="text" name="text_2_1" id="text_2_1" class="form-control" value="{{text_2_1}}"> {{img_2_1_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_1" id="img_2_1" class="form-control" value="{{img_2_1}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_2_2"> <div class="form-group"> <label for="text_2_2">2</label> <input type="text" name="text_2_2" id="text_2_2" class="form-control" value="{{text_2_2}}"> {{img_2_2_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_2" id="img_2_2" class="form-control" value="{{img_2_2}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_2_3"> <div class="form-group"> <label for="text_2_3">3</label> <input type="text" name="text_2_3" id="text_2_3" class="form-control" value="{{text_2_3}}"> {{img_2_3_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_3" id="img_2_3" class="form-control" value="{{img_2_3}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_2_4"> <div class="form-group"> <label for="text_2_4">4</label> <input type="text" name="text_2_4" id="text_2_4" class="form-control" value="{{text_2_4}}"> {{img_2_4_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_4" id="img_2_4" class="form-control" value="{{img_2_4}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_2_5"> <div class="form-group"> <label for="text_2_5">5</label> <input type="text" name="text_2_5" id="text_2_5" class="form-control" value="{{text_2_5}}"> {{img_2_5_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_5" id="img_2_5" class="form-control" value="{{img_2_5}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_2_6"> <div class="form-group"> <label for="text_2_6">6</label> <input type="text" name="text_2_6" id="text_2_6" class="form-control" value="{{text_2_6}}"> {{img_2_6_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_6" id="img_2_6" class="form-control" value="{{img_2_6}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_2_7"> <div class="form-group"> <label for="text_2_7">7</label> <input type="text" name="text_2_7" id="text_2_7" class="form-control" value="{{text_2_7}}"> {{img_2_7_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_7" id="img_2_7" class="form-control" value="{{img_2_7}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_2_8"> <div class="form-group"> <label for="text_2_8">8</label> <input type="text" name="text_2_8" id="text_2_8" class="form-control" value="{{text_2_8}}"> {{img_2_8_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_8" id="img_2_8" class="form-control" value="{{img_2_8}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_2_9"> <div class="form-group"> <label for="text_2_9">9</label> <input type="text" name="text_2_9" id="text_2_9" class="form-control" value="{{text_2_9}}"> {{img_2_9_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_9" id="img_2_9" class="form-control" value="{{img_2_9}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_2_10"> <div class="form-group"> <label for="text_2_10">10</label> <input type="text" name="text_2_10" id="text_2_10" class="form-control" value="{{text_2_10}}"> {{img_2_10_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_2_10" id="img_2_10" class="form-control" value="{{img_2_10}}"> </div> </div> </div> </div> </div> <div style="border-radius:5px;border:solid 2px #dedede;margin:5px;padding:5px;text-align:center;background:#f4d9c5;" id="seccion_categoria3"> <div class="form-group"> <label for="text_categoria3">Categoria 3: </label> <input type="text" name="text_categoria3" id="text_categoria3" class="form-control" value="{{text_categoria3}}"> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_3_1"> <div class="form-group"> <label for="text_3_1">1</label> <input type="text" name="text_3_1" id="text_3_1" class="form-control" value="{{text_3_1}}"> {{img_3_1_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_1" id="img_3_1" class="form-control" value="{{img_3_1}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_3_2"> <div class="form-group"> <label for="text_3_2">2</label> <input type="text" name="text_3_2" id="text_3_2" class="form-control" value="{{text_3_2}}"> {{img_3_2_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_2" id="img_3_2" class="form-control" value="{{img_3_2}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_3_3"> <div class="form-group"> <label for="text_3_3">3</label> <input type="text" name="text_3_3" id="text_3_3" class="form-control" value="{{text_3_3}}"> {{img_3_3_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_3" id="img_3_3" class="form-control" value="{{img_3_3}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_3_4"> <div class="form-group"> <label for="text_3_4">4</label> <input type="text" name="text_3_4" id="text_3_4" class="form-control" value="{{text_3_4}}"> {{img_3_4_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_4" id="img_3_4" class="form-control" value="{{img_3_4}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_3_5"> <div class="form-group"> <label for="text_3_5">5</label> <input type="text" name="text_3_5" id="text_3_5" class="form-control" value="{{text_3_5}}"> {{img_3_5_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_5" id="img_3_5" class="form-control" value="{{img_3_5}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_3_6"> <div class="form-group"> <label for="text_3_6">6</label> <input type="text" name="text_3_6" id="text_3_6" class="form-control" value="{{text_3_6}}"> {{img_3_6_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_6" id="img_3_6" class="form-control" value="{{img_3_6}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_3_7"> <div class="form-group"> <label for="text_3_7">7</label> <input type="text" name="text_3_7" id="text_3_7" class="form-control" value="{{text_3_7}}"> {{img_3_7_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_7" id="img_3_7" class="form-control" value="{{img_3_7}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_3_8"> <div class="form-group"> <label for="text_3_8">8</label> <input type="text" name="text_3_8" id="text_3_8" class="form-control" value="{{text_3_8}}"> {{img_3_8_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_8" id="img_3_8" class="form-control" value="{{img_3_8}}"> </div> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_3_9"> <div class="form-group"> <label for="text_3_9">9</label> <input type="text" name="text_3_9" id="text_3_9" class="form-control" value="{{text_3_9}}"> {{img_3_9_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_9" id="img_3_9" class="form-control" value="{{img_3_9}}"> </div> </div> </div> <div class="col-md-6" id="seccion_palabra_3_10"> <div class="form-group"> <label for="text_3_10">10</label> <input type="text" name="text_3_10" id="text_3_10" class="form-control" value="{{text_3_10}}"> {{img_3_10_opciones_edicion}} <div style="display:none;"> <input type="text" name="img_3_10" id="img_3_10" class="form-control" value="{{img_3_10}}"> </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_palabras=10; var max_secciones_categorias=3; function mostrarSeccionesPalabras() { var cantidad=parseInt(document.getElementById('text_cantidad_palabras').value); var categorias=parseInt(document.getElementById('text_cantidad_categorias').value); for(let dd=1;dd<=cantidad;dd++){ document.getElementById('seccion_palabra_1_'+dd.toString()).style.display='block'; document.getElementById('seccion_palabra_2_'+dd.toString()).style.display='block'; document.getElementById('seccion_palabra_3_'+dd.toString()).style.display='block'; } for(let dd=cantidad+1;dd<=max_secciones_palabras;dd++){ document.getElementById('seccion_palabra_1_'+dd.toString()).style.display='none'; document.getElementById('seccion_palabra_2_'+dd.toString()).style.display='none'; document.getElementById('seccion_palabra_3_'+dd.toString()).style.display='none'; } for(let dd=1;dd<=categorias;dd++){ document.getElementById('seccion_categoria'+dd.toString()).style.display='block'; } for(let dd=categorias+1;dd<=max_secciones_categorias;dd++){ document.getElementById('seccion_categoria'+dd.toString()).style.display='none'; } } document.getElementById('text_cantidad_palabras').value='{{text_cantidad_palabras}}'; document.getElementById('text_cantidad_categorias').value='{{text_cantidad_categorias}}'; mostrarSeccionesPalabras(); </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":"#073763","color_fondo2":"#6d4794","textarea_informaciones":"<h3>\ud83d\udcda Información del Juego</h3>\r\n<p><strong>Objetivo:</strong> Clasificar animales en vertebrados e invertebrados.</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</ul>\r\n<p><strong>Instrucciones:</strong></p>\r\n<ul>\r\n<li>Arrastra los animales a su zona correcta</li>\r\n<li>Click en un animal ya colocado para devolverlo</li>\r\n<li>Puedes mover animales entre zonas</li>\r\n</ul>\r\n<p><strong>Vertebrados:</strong> Tienen columna vertebral (mamíferos, aves, reptiles, anfibios, peces)</p>\r\n<p><strong>Invertebrados:</strong> No tienen columna vertebral (insectos, arácnidos, moluscos, etc.)</p>","textarea_titulojuego":"<h1>Animales Vertebrados e Invertebrados</h1>","textarea_instrucciones":"<h2>Arrastra y clasifica los animales en vertebrados e invertebrados</h2>","text_cantidad_palabras":"6","text_1_1":"llama","text_1_2":"gato","text_1_3":"aguila","text_1_4":"rana","text_1_5":"perro","text_1_6":"tortuga","text_1_7":"loro","text_1_8":"caballo","text_1_9":"cocodrilo","text_1_10":"mono","text_2_1":"estrella","text_2_2":"pulpo","text_2_3":"ara\u00f1a","text_2_4":"caracol","text_2_5":"abeja","text_2_6":"mariposa","text_2_7":"hormiga","text_2_8":"grillo","text_2_9":"oruga","text_2_10":"escorpi\u00f3n","text_3_1":"manzana","text_3_2":"zanahoria","text_3_3":"pi\u00f1a","text_3_4":"sandia","text_3_5":"pl\u00e1tano","text_3_6":"uva","text_3_7":"lim\u00f3n","text_3_8":"naranja","text_3_9":"pera","text_3_10":"frutilla","text_categoria1":"Animales Vertebrados","text_categoria2":"Animales Invertebrados","text_categoria3":"Frutas o verduras","text_cantidad_categorias":"2","img_1_1":"\ud83e\udd99","img_1_2":"\ud83d\udc31","img_1_3":"\ud83e\udd85","img_1_4":"\ud83d\udc38","img_1_5":"\ud83d\udc15\ufe0f","img_1_6":"\ud83d\udc22","img_1_7":"\ud83e\udd9c","img_1_8":"\ud83d\udc34","img_1_9":"\ud83d\udc0a","img_1_10":"\ud83d\udc12","img_2_1":"\u2b50","img_2_2":"\ud83d\udc19","img_2_3":"\ud83d\udd77\ufe0f","img_2_4":"\ud83d\udc0c","img_2_5":"\ud83d\udc1d","img_2_6":"\ud83e\udd8b","img_2_7":"\ud83d\udc1c","img_2_8":"\ud83e\udd97","img_2_9":"\ud83d\udc1b","img_2_10":"\ud83e\udd82","img_3_1":"\ud83c\udf4e","img_3_2":"\ud83e\udd55","img_3_3":"\ud83c\udf4d","img_3_4":"\ud83c\udf49","img_3_5":"\ud83c\udf4c","img_3_6":"\ud83c\udf47","img_3_7":"\ud83c\udf4b","img_3_8":"\ud83c\udf4a","img_3_9":"\ud83c\udf50","img_3_10":"\ud83c\udf53","text_bloque_clasificar_titulo":"Animales para Clasificar"}
FOFUEDUCA
, Copyright 2026