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
PALABRAS AGUDAS, GRAVES Y ESDRÚJULAS
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; } .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; } .draggable-clone { position: fixed; width: auto; 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: 22px; font-weight: bold; pointer-events: none; z-index: 9999; border: 3px solid #7ed321; box-shadow: 0 0 15px rgba(126, 211, 33, 0.6); } @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: 16px; } .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="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" style="position: relative;"> <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> let gameNumberData = {{text_cantidad_palabras}};//10 let gameNumberCategory = {{text_cantidad_categorias}};//2 or 3 const gameData1 = [ { word: "{{text_aguda1}}", type: "0" }, { word: "{{text_aguda2}}", type: "0" }, { word: "{{text_aguda3}}", type: "0" }, { word: "{{text_aguda4}}", type: "0" }, { word: "{{text_aguda5}}", type: "0" }, { word: "{{text_aguda6}}", type: "0" }, { word: "{{text_aguda7}}", type: "0" }, { word: "{{text_aguda8}}", type: "0" }, { word: "{{text_aguda9}}", type: "0" }, { word: "{{text_aguda10}}", type: "0" } ]; const gameData2 = [ { word: "{{text_grave1}}", type: "1" }, { word: "{{text_grave2}}", type: "1" }, { word: "{{text_grave3}}", type: "1" }, { word: "{{text_grave4}}", type: "1" }, { word: "{{text_grave5}}", type: "1" }, { word: "{{text_grave6}}", type: "1" }, { word: "{{text_grave7}}", type: "1" }, { word: "{{text_grave8}}", type: "1" }, { word: "{{text_grave9}}", type: "1" }, { word: "{{text_grave10}}", type: "1" } ]; const gameData3 = [ { word: "{{text_esdrujula1}}", type: "2" }, { word: "{{text_esdrujula2}}", type: "2" }, { word: "{{text_esdrujula3}}", type: "2" }, { word: "{{text_esdrujula4}}", type: "2" }, { word: "{{text_esdrujula5}}", type: "2" }, { word: "{{text_esdrujula6}}", type: "2" }, { word: "{{text_esdrujula7}}", type: "2" }, { word: "{{text_esdrujula8}}", type: "2" }, { word: "{{text_esdrujula9}}", type: "2" }, { word: "{{text_esdrujula10}}", type: "2" } ]; const categories = [ { id: '0', name: '{{text_categoria1}}', color: '#f59e0b' }, { id: '1', name: '{{text_categoria2}}', color: '#10b981' }, { id: '2', name: '{{text_categoria3}}', color: '#f97316' } ]; let gameState = { started: false, paused: false, checked: false, timerInterval: null, seconds: 0, score: 0, shuffledData: [], placements: {} }; let clonedElement = null; let draggedElement = 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 = {}; //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 } gameState.shuffledData = [...xgameData].sort(() => Math.random() - 0.5); 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_category_block_'+cat.id).style.display='none'; document.getElementById('id_button_block_'+cat.id).style.background='#e6e2ea'; } cont++; }); document.getElementById('id_category_block_'+xid_category_block).style.display='block'; document.getElementById('id_button_block_'+xid_category_block).style.background='#ffffff'; document.getElementById('id_btn_block_todo').style.background='#e6e2ea'; } function displayAllBlocksCategories(){ let cont=0; categories.forEach(cat => { if (cont<gameNumberCategory){ document.getElementById('id_category_block_'+cat.id).style.display='block'; document.getElementById('id_button_block_'+cat.id).style.background='#e6e2ea'; } cont++; }); document.getElementById('id_btn_block_todo').style.background='#ffffff'; } function renderBlocks() { const container = document.getElementById('blocksContainer'); container.innerHTML = ''; const wordsBlock = document.createElement('div'); wordsBlock.className = 'block'; wordsBlock.innerHTML = '<h3 style="color:#2d1b4e;margin-bottom:10px;width:100%;">Palabras</h3>'; const wordsContainer = document.createElement('div'); wordsContainer.id = 'wordsContainer'; wordsContainer.style.cssText = 'display:flex;flex-wrap:wrap;gap:10px;justify-content:center;width:100%;'; gameState.shuffledData.forEach((item, index) => { const wordSpan = document.createElement('span'); wordSpan.className = 'word-item'; wordSpan.textContent = item.word; wordSpan.dataset.word = item.word; wordSpan.dataset.type = item.type; wordSpan.dataset.index = index; wordSpan.draggable = true; wordSpan.style.cssText = 'font-size:18px;background:#6c349d;color:white;padding:8px 15px;border-radius:20px;cursor:move;user-select:none;font-weight:bold;transition:all 0.2s;'; wordSpan.addEventListener('dragstart', handleDragStart); wordSpan.addEventListener('dragend', handleDragEnd); wordSpan.addEventListener('click', handleWordClick); wordSpan.addEventListener('touchstart', handleTouchStart, { passive: false }); wordSpan.addEventListener('touchmove', handleTouchMove, { passive: false }); wordSpan.addEventListener('touchend', handleTouchEnd); wordsContainer.appendChild(wordSpan); }); wordsBlock.appendChild(wordsContainer); container.appendChild(wordsBlock); const catMenuBlock=document.createElement('div'); let itemsMenu=''; let cont=0; categories.forEach(cat => { if (cont<gameNumberCategory){ itemsMenu=itemsMenu+`<button id="id_button_block_${cat.id}" onclick="displayBlockCategoryId('${cat.id}')" style="color:${cat.color};margin-bottom:10px;background:#e6e2ea;border:2px solid #333333;">${cat.name}</button>`; } cont++; }); itemsMenu=itemsMenu+`<button id="id_btn_block_todo" onclick="displayAllBlocksCategories()" style="color:#333333;margin-bottom:10px;background:#ffffff;border:2px solid #333333;">Todas</button>`; catMenuBlock.innerHTML = itemsMenu; //container.appendChild(catMenuBlock); cont=0; categories.forEach(cat => { if (cont<gameNumberCategory){ const catBlock = document.createElement('div'); catBlock.className = 'block category-block'; catBlock.style.marginBottom = '5px'; catBlock.id='id_category_block_'+cat.id; catBlock.dataset.category = cat.id; catBlock.innerHTML = `<h3 style="color:${cat.color};margin-bottom:10px;width:100%;text-align:center;">${cat.name}</h3>`; const dropZone = document.createElement('div'); dropZone.className = 'drop-zone'; dropZone.dataset.category = cat.id; dropZone.style.cssText = `min-height:150px;width:100%;border:3px dashed ${cat.color};border-radius:10px;padding:10px;display:flex;flex-wrap:wrap;gap:8px;justify-content:center;align-items:flex-start;align-content:flex-start;background:rgba(255,255,255,0.5);transition:all 0.3s;`; dropZone.addEventListener('dragover', handleDragOver); dropZone.addEventListener('dragleave', handleDragLeave); dropZone.addEventListener('drop', handleDrop); catBlock.appendChild(dropZone); //container.appendChild(catBlock); catMenuBlock.appendChild(catBlock); } cont++; }); container.appendChild(catMenuBlock); } 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 handleDragStart(e) { if (gameState.checked) return; draggedElement = e.target; e.target.style.border = '3px solid #10b981'; e.target.style.transform = 'scale(1.05)'; e.dataTransfer.effectAllowed = 'move'; } function handleDragEnd(e) { e.target.style.border = ''; e.target.style.transform = ''; draggedElement = null; document.getElementById('reproductorAudioPop').play(); } function handleDragOver(e) { if (gameState.checked) return; e.preventDefault(); e.dataTransfer.dropEffect = 'move'; e.currentTarget.style.background = 'rgba(16, 185, 129, 0.2)'; e.currentTarget.style.transform = 'scale(1.02)'; } function handleDragLeave(e) { e.currentTarget.style.background = 'rgba(255,255,255,0.5)'; e.currentTarget.style.transform = 'scale(1)'; } function handleDrop(e) { e.preventDefault(); if (gameState.checked || !draggedElement) return; const dropZone = e.currentTarget; dropZone.style.background = 'rgba(255,255,255,0.5)'; dropZone.style.transform = 'scale(1)'; const category = dropZone.dataset.category; const wordData = draggedElement.dataset.word; if (gameState.placements[wordData]) { const oldZone = document.querySelector(`[data-category="${gameState.placements[wordData]}"]`); const oldWord = oldZone.querySelector(`[data-word="${wordData}"]`); if (oldWord) oldWord.remove(); } const newWord = draggedElement.cloneNode(true); newWord.draggable = true; newWord.addEventListener('dragstart', handleDragStart); newWord.addEventListener('dragend', handleDragEnd); newWord.addEventListener('click', handleWordClick); newWord.addEventListener('touchstart', handleTouchStart, { passive: false }); newWord.addEventListener('touchmove', handleTouchMove, { passive: false }); newWord.addEventListener('touchend', handleTouchEnd); dropZone.appendChild(newWord); gameState.placements[wordData] = category; if (draggedElement.parentElement !== null) { if (draggedElement.parentElement.id === 'wordsContainer') { draggedElement.remove(); } } } function handleWordClick(e) { if (gameState.checked) return; const word = e.target; const wordData = word.dataset.word; if (word.parentElement.classList.contains('drop-zone')) { const wordsContainer = document.getElementById('wordsContainer'); const newWord = word.cloneNode(true); newWord.draggable = true; newWord.addEventListener('dragstart', handleDragStart); newWord.addEventListener('dragend', handleDragEnd); newWord.addEventListener('click', handleWordClick); newWord.addEventListener('touchstart', handleTouchStart, { passive: false }); newWord.addEventListener('touchmove', handleTouchMove, { passive: false }); newWord.addEventListener('touchend', handleTouchEnd); wordsContainer.appendChild(newWord); word.remove(); delete gameState.placements[wordData]; } } let touchStartX, touchStartY; let touchMoved = false; function handleTouchStart(e) { if (gameState.checked) return; e.preventDefault(); draggedElement = e.target; touchMoved = false; const touch = e.touches[0]; touchStartX = touch.clientX; touchStartY = touch.clientY; /*clonedElement = draggedElement.cloneNode(true); clonedElement.style.position = 'fixed'; clonedElement.style.zIndex = '9999'; clonedElement.style.pointerEvents = 'none'; clonedElement.style.opacity = '0.8'; clonedElement.style.border = '3px solid #10b981'; clonedElement.style.transform = 'scale(1.1)'; clonedElement.style.left = touch.clientX - 50 + 'px'; clonedElement.style.top = touch.clientY - 20 + 'px'; document.body.appendChild(clonedElement);*/ // Crear elemento clonado clonedElement = document.createElement('div'); clonedElement.className = 'draggable-clone'; clonedElement.textContent = e.target.textContent; clonedElement.style.left = touch.clientX - 35 + 'px'; clonedElement.style.top = touch.clientY - 35 + 'px'; document.body.appendChild(clonedElement); draggedElement.style.opacity = '0.3'; } function handleTouchMove(e) { if (gameState.checked || !clonedElement) return; e.preventDefault(); touchMoved = true; const touch = e.touches[0]; /*clonedElement.style.left = touch.clientX - 50 + 'px'; clonedElement.style.top = touch.clientY - 20 + 'px';*/ // Actualizar posición del elemento clonado if (clonedElement) { clonedElement.style.left = touch.clientX - 35 + 'px'; clonedElement.style.top = touch.clientY - 35 + 'px'; } const dropZones = document.querySelectorAll('.drop-zone'); dropZones.forEach(zone => { const rect = zone.getBoundingClientRect(); if (touch.clientX >= rect.left && touch.clientX <= rect.right && touch.clientY >= rect.top && touch.clientY <= rect.bottom) { zone.style.background = 'rgba(16, 185, 129, 0.2)'; zone.style.transform = 'scale(1.02)'; } else { zone.style.background = 'rgba(255,255,255,0.5)'; zone.style.transform = 'scale(1)'; } }); } function handleTouchEnd(e) { if (gameState.checked) return; if (clonedElement) { const touch = e.changedTouches[0]; const dropZones = document.querySelectorAll('.drop-zone'); let dropped = false; // Si no se movió mucho, es un click para regresar if (!touchMoved && draggedElement && draggedElement.parentElement && draggedElement.parentElement.classList.contains('drop-zone')) { const wordsContainer = document.getElementById('wordsContainer'); const wordData = draggedElement.dataset.word; const newWord = draggedElement.cloneNode(true); newWord.draggable = true; newWord.style.opacity = '1'; newWord.addEventListener('dragstart', handleDragStart); newWord.addEventListener('dragend', handleDragEnd); newWord.addEventListener('click', handleWordClick); newWord.addEventListener('touchstart', handleTouchStart, { passive: false }); newWord.addEventListener('touchmove', handleTouchMove, { passive: false }); newWord.addEventListener('touchend', handleTouchEnd); wordsContainer.appendChild(newWord); draggedElement.remove(); delete gameState.placements[wordData]; clonedElement.remove(); clonedElement = null; draggedElement = null; return; } dropZones.forEach(zone => { const rect = zone.getBoundingClientRect(); if (touch.clientX >= rect.left && touch.clientX <= rect.right && touch.clientY >= rect.top && touch.clientY <= rect.bottom) { const category = zone.dataset.category; const wordData = draggedElement.dataset.word; if (gameState.placements[wordData]) { const oldZone = document.querySelector(`[data-category="${gameState.placements[wordData]}"]`); const oldWord = oldZone.querySelector(`[data-word="${wordData}"]`); if (oldWord) oldWord.remove(); } const newWord = draggedElement.cloneNode(true); newWord.draggable = true; newWord.addEventListener('dragstart', handleDragStart); newWord.addEventListener('dragend', handleDragEnd); newWord.addEventListener('click', handleWordClick); newWord.addEventListener('touchstart', handleTouchStart, { passive: false }); newWord.addEventListener('touchmove', handleTouchMove, { passive: false }); newWord.addEventListener('touchend', handleTouchEnd); newWord.style.opacity = '1'; zone.appendChild(newWord); gameState.placements[wordData] = category; if (draggedElement.parentElement && draggedElement.parentElement.id === 'wordsContainer') { draggedElement.remove(); } dropped = true; zone.style.background = 'rgba(255,255,255,0.5)'; zone.style.transform = 'scale(1)'; } }); if (!dropped && draggedElement) { draggedElement.style.opacity = '1'; } clonedElement.remove(); clonedElement = null; dropZones.forEach(zone => { zone.style.background = 'rgba(255,255,255,0.5)'; zone.style.transform = 'scale(1)'; }); } draggedElement = null; touchMoved = false; 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; gameState.shuffledData.forEach(item => { const placed = gameState.placements[item.word]; if (placed) { if (placed === item.type) { score += 1; } else { score -= 1; } } }); gameState.score = score; const maxScore = gameNumberData*gameNumberCategory;//Number of items multiplied by categories const timeStr = formatTime(gameState.seconds); const dropZones = document.querySelectorAll('.drop-zone'); dropZones.forEach(zone => { const words = zone.querySelectorAll('.word-item'); words.forEach(wordEl => { const wordData = wordEl.dataset.word; const correctType = wordEl.dataset.type; const placedType = zone.dataset.category; const icon = document.createElement('span'); icon.style.cssText = 'margin-left:5px;font-size:18px;'; if (correctType === placedType) { icon.textContent = '✓'; //icon.style.color = '#10b981'; wordEl.style.background = '#10b981'; } else { icon.textContent = '✗'; //icon.style.color = '#ef4444'; wordEl.style.background = '#ef4444'; } wordEl.appendChild(icon); wordEl.draggable = false; wordEl.style.cursor = 'default'; }); }); 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() { if (clonedElement) { clonedElement.remove(); clonedElement = null; } gameState = { started: false, paused: false, checked: false, timerInterval: null, seconds: 0, score: 0, shuffledData: [], placements: {} }; draggedElement = 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 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;"> <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_aguda1"> <div class="form-group"> <label for="text_aguda1">1</label> <input type="text" name="text_aguda1" id="text_aguda1" class="form-control" value="{{text_aguda1}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_aguda2"> <div class="form-group"> <label for="text_aguda2">2</label> <input type="text" name="text_aguda2" id="text_aguda2" class="form-control" value="{{text_aguda2}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_aguda3"> <div class="form-group"> <label for="text_aguda3">3</label> <input type="text" name="text_aguda3" id="text_aguda3" class="form-control" value="{{text_aguda3}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_aguda4"> <div class="form-group"> <label for="text_aguda4">4</label> <input type="text" name="text_aguda4" id="text_aguda4" class="form-control" value="{{text_aguda4}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_aguda5"> <div class="form-group"> <label for="text_aguda5">5</label> <input type="text" name="text_aguda5" id="text_aguda5" class="form-control" value="{{text_aguda5}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_aguda6"> <div class="form-group"> <label for="text_aguda6">6</label> <input type="text" name="text_aguda6" id="text_aguda6" class="form-control" value="{{text_aguda6}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_aguda7"> <div class="form-group"> <label for="text_aguda7">7</label> <input type="text" name="text_aguda7" id="text_aguda7" class="form-control" value="{{text_aguda7}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_aguda8"> <div class="form-group"> <label for="text_aguda8">8</label> <input type="text" name="text_aguda8" id="text_aguda8" class="form-control" value="{{text_aguda8}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_aguda9"> <div class="form-group"> <label for="text_aguda9">9</label> <input type="text" name="text_aguda9" id="text_aguda9" class="form-control" value="{{text_aguda9}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_aguda10"> <div class="form-group"> <label for="text_aguda10">10</label> <input type="text" name="text_aguda10" id="text_aguda10" class="form-control" value="{{text_aguda10}}"> </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_grave1"> <div class="form-group"> <label for="text_grave1">1</label> <input type="text" name="text_grave1" id="text_grave1" class="form-control" value="{{text_grave1}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_grave2"> <div class="form-group"> <label for="text_grave2">2</label> <input type="text" name="text_grave2" id="text_grave2" class="form-control" value="{{text_grave2}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_grave3"> <div class="form-group"> <label for="text_grave3">3</label> <input type="text" name="text_grave3" id="text_grave3" class="form-control" value="{{text_grave3}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_grave4"> <div class="form-group"> <label for="text_grave4">4</label> <input type="text" name="text_grave4" id="text_grave4" class="form-control" value="{{text_grave4}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_grave5"> <div class="form-group"> <label for="text_grave5">5</label> <input type="text" name="text_grave5" id="text_grave5" class="form-control" value="{{text_grave5}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_grave6"> <div class="form-group"> <label for="text_grave6">6</label> <input type="text" name="text_grave6" id="text_grave6" class="form-control" value="{{text_grave6}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_grave7"> <div class="form-group"> <label for="text_grave7">7</label> <input type="text" name="text_grave7" id="text_grave7" class="form-control" value="{{text_grave7}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_grave8"> <div class="form-group"> <label for="text_grave8">8</label> <input type="text" name="text_grave8" id="text_grave8" class="form-control" value="{{text_grave8}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_grave9"> <div class="form-group"> <label for="text_grave9">9</label> <input type="text" name="text_grave9" id="text_grave9" class="form-control" value="{{text_grave9}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_grave10"> <div class="form-group"> <label for="text_grave10">10</label> <input type="text" name="text_grave10" id="text_grave10" class="form-control" value="{{text_grave10}}"> </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_esdrujula1"> <div class="form-group"> <label for="text_esdrujula1">1</label> <input type="text" name="text_esdrujula1" id="text_esdrujula1" class="form-control" value="{{text_esdrujula1}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_esdrujula2"> <div class="form-group"> <label for="text_esdrujula2">2</label> <input type="text" name="text_esdrujula2" id="text_esdrujula2" class="form-control" value="{{text_esdrujula2}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_esdrujula3"> <div class="form-group"> <label for="text_esdrujula3">3</label> <input type="text" name="text_esdrujula3" id="text_esdrujula3" class="form-control" value="{{text_esdrujula3}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_esdrujula4"> <div class="form-group"> <label for="text_esdrujula4">4</label> <input type="text" name="text_esdrujula4" id="text_esdrujula4" class="form-control" value="{{text_esdrujula4}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_esdrujula5"> <div class="form-group"> <label for="text_esdrujula5">5</label> <input type="text" name="text_esdrujula5" id="text_esdrujula5" class="form-control" value="{{text_esdrujula5}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_esdrujula6"> <div class="form-group"> <label for="text_esdrujula6">6</label> <input type="text" name="text_esdrujula6" id="text_esdrujula6" class="form-control" value="{{text_esdrujula6}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_esdrujula7"> <div class="form-group"> <label for="text_esdrujula7">7</label> <input type="text" name="text_esdrujula7" id="text_esdrujula7" class="form-control" value="{{text_esdrujula7}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_esdrujula8"> <div class="form-group"> <label for="text_esdrujula8">8</label> <input type="text" name="text_esdrujula8" id="text_esdrujula8" class="form-control" value="{{text_esdrujula8}}"> </div> </div> </div> <div class="row"> <div class="col-md-6" id="seccion_palabra_esdrujula9"> <div class="form-group"> <label for="text_esdrujula9">9</label> <input type="text" name="text_esdrujula9" id="text_esdrujula9" class="form-control" value="{{text_esdrujula9}}"> </div> </div> <div class="col-md-6" id="seccion_palabra_esdrujula10"> <div class="form-group"> <label for="text_esdrujula10">10</label> <input type="text" name="text_esdrujula10" id="text_esdrujula10" class="form-control" value="{{text_esdrujula10}}"> </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_aguda'+dd.toString()).style.display='block'; document.getElementById('seccion_palabra_grave'+dd.toString()).style.display='block'; document.getElementById('seccion_palabra_esdrujula'+dd.toString()).style.display='block'; } for(let dd=cantidad+1;dd<=max_secciones_palabras;dd++){ document.getElementById('seccion_palabra_aguda'+dd.toString()).style.display='none'; document.getElementById('seccion_palabra_grave'+dd.toString()).style.display='none'; document.getElementById('seccion_palabra_esdrujula'+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> Identifica los tipos de palabras: agudas, graves, esdrújulas.</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: Cantidad total de palabras</li>\r\n</ul>\r\n<p><strong>Instrucciones:</strong> Identifica y arrastra las palabras a su respectivo tipo.</p>","textarea_titulojuego":"<h1>Palabras Agudas, Graves y Esdrújulas</h1>","textarea_instrucciones":"<h2>Arrastra y clasifica las siguientes palabras</h2>","text_cantidad_palabras":"4","text_aguda1":"An\u00eds","text_aguda2":"Avi\u00f3n","text_aguda3":"Beb\u00e9","text_aguda4":"Caf\u00e9","text_aguda5":"Caj\u00f3n","text_aguda6":"Cami\u00f3n","text_aguda7":"Lim\u00f3n","text_aguda8":"Man\u00ed","text_aguda9":"Pa\u00eds","text_aguda10":"Mam\u00e1","text_grave1":"Az\u00facar","text_grave2":"\u00c1ngel","text_grave3":"Polic\u00eda","text_grave4":"\u00c1lbum","text_grave5":"\u00c1rbol","text_grave6":"C\u00f3ndor","text_grave7":"L\u00e1piz","text_grave8":"F\u00fatbol","text_grave9":"R\u00edo","text_grave10":"T\u00fanel","text_esdrujula1":"Br\u00f3coli","text_esdrujula2":"C\u00e9lula","text_esdrujula3":"Dep\u00f3sito","text_esdrujula4":"Ej\u00e9rcito","text_esdrujula5":"Pel\u00edcula","text_esdrujula6":"N\u00fameros","text_esdrujula7":"S\u00e1bado","text_esdrujula8":"Car\u00e1tula","text_esdrujula9":"V\u00edbora","text_esdrujula10":"Ox\u00edgeno","text_categoria1":"Agudas","text_categoria2":"Graves","text_categoria3":"Esdr\u00fajulas","text_cantidad_categorias":"3"}
FOFUEDUCA
, Copyright 2025