diff --git a/banderas/index.html b/banderas/index.html new file mode 100644 index 0000000..6e146fc --- /dev/null +++ b/banderas/index.html @@ -0,0 +1,20 @@ + + + + + Empareja la Bandera + + + +

Empareja la Bandera

+

Haz clic en una bandera y después en el país correspondiente. ¿Puedes emparejar todas?

+
Aciertos: /
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/banderas/script.js b/banderas/script.js new file mode 100644 index 0000000..0a30390 --- /dev/null +++ b/banderas/script.js @@ -0,0 +1,141 @@ +// Lista completa con país y siglas según ISO 3166-1 alpha-2 +const countryList = [ + { name: "España", code: "ES" }, { name: "Francia", code: "FR" }, { name: "Alemania", code: "DE" }, { name: "Italia", code: "IT" }, + { name: "Portugal", code: "PT" }, { name: "Reino Unido", code: "GB" }, { name: "Estados Unidos", code: "US" }, { name: "Canadá", code: "CA" }, + { name: "México", code: "MX" }, { name: "Brasil", code: "BR" }, { name: "Argentina", code: "AR" }, { name: "Chile", code: "CL" }, + { name: "Japón", code: "JP" }, { name: "China", code: "CN" }, { name: "Australia", code: "AU" }, { name: "Rusia", code: "RU" }, + { name: "Sudáfrica", code: "ZA" }, { name: "Nueva Zelanda", code: "NZ" }, { name: "India", code: "IN" }, { name: "Egipto", code: "EG" }, + { name: "Grecia", code: "GR" }, { name: "Turquía", code: "TR" }, { name: "Ucrania", code: "UA" }, { name: "Suecia", code: "SE" }, + { name: "Noruega", code: "NO" }, { name: "Dinamarca", code: "DK" }, { name: "Finlandia", code: "FI" }, { name: "Irlanda", code: "IE" }, + { name: "Bélgica", code: "BE" }, { name: "Polonia", code: "PL" }, { name: "Suiza", code: "CH" }, { name: "Países Bajos", code: "NL" } +]; + +function getFlagEmoji(code) { + // Las banderas se generan a partir de letras usando unicode, no por siglas textuales + // Solo funcionan para países con código alpha-2 y script latino + if (!code || code.length !== 2) return ""; + return String.fromCodePoint( + ...code.toUpperCase().split("").map(c => 0x1F1E6 + c.charCodeAt(0) - 65) + ); +} + +// Para elegir N países aleatorios distintos con bandera +function pickRandomCountries(list, n) { + const chosen = []; + const used = {}; + while (chosen.length < n && list.length > 0) { + let idx = Math.floor(Math.random() * list.length); + let c = list[idx]; + let flag = getFlagEmoji(c.code); + if (flag && !used[c.code]) { + chosen.push({name: c.name, code: c.code, flag}); + used[c.code] = true; + } + list.splice(idx,1); + } + return chosen; +} + +let flagsDiv = document.getElementById('flags'); +let countriesDiv = document.getElementById('countries'); +let statusDiv = document.getElementById('status'); +let scoreSpan = document.getElementById('score-value'); +let scoreTotal = document.getElementById('score-total'); +let restartBtn = document.getElementById('restart-btn'); + +let pairs = [], flags = [], countries = [], selectedFlag = null, selectedCountry = null, score = 0, totalPairs = 12; + +function shuffle(arr) { + for (let i = arr.length-1; i>0; i--) { + const j = Math.floor(Math.random() * (i+1)); + [arr[i], arr[j]] = [arr[j], arr[i]]; + } +} + +function startGame() { + let fullList = countryList.slice(); // copia + pairs = pickRandomCountries(fullList, totalPairs); + flags = pairs.map(o=>o); + countries = pairs.map(o=>o); + shuffle(flags); shuffle(countries); + score = 0; + scoreSpan.textContent = score; + scoreTotal.textContent = pairs.length; + selectedFlag = selectedCountry = null; + renderFlags(); + renderCountries(); + statusDiv.textContent = 'Empareja todas las banderas con su país'; +} + +function renderFlags() { + flagsDiv.innerHTML = ''; + flags.forEach((p, i) => { + const d = document.createElement('div'); + d.className = 'flag'; + d.textContent = p.flag; + d.setAttribute('tabindex', 0); + d.onclick = () => selectFlag(i); + if (p.matched) d.classList.add('matched'); + if (selectedFlag === i) d.classList.add('selected'); + flagsDiv.appendChild(d); + }); +} + +function renderCountries() { + countriesDiv.innerHTML = ''; + countries.forEach((p, i) => { + const d = document.createElement('div'); + d.className = 'country'; + d.textContent = p.name; + d.setAttribute('tabindex', 0); + d.onclick = () => selectCountry(i); + if (p.matched) d.classList.add('matched'); + if (selectedCountry === i) d.classList.add('selected'); + countriesDiv.appendChild(d); + }); +} + +function selectFlag(i) { + if (flags[i].matched) return; + selectedFlag = i; + renderFlags(); + if (selectedCountry !== null) checkMatch(); +} + +function selectCountry(i) { + if (countries[i].matched) return; + selectedCountry = i; + renderCountries(); + if (selectedFlag !== null) checkMatch(); +} + +function checkMatch() { + const flagObj = flags[selectedFlag]; + const countryObj = countries[selectedCountry]; + if (flagObj.code === countryObj.code) { + flags[selectedFlag].matched = true; + countries[selectedCountry].matched = true; + score++; + scoreSpan.textContent = score; + statusDiv.textContent = '¡Correcto!'; + renderFlags(); + renderCountries(); + if (score === pairs.length) { + statusDiv.textContent = '¡Has emparejado todas las banderas! 🎉'; + } + } else { + statusDiv.textContent = 'No es correcto, intenta otra vez.'; + setTimeout(() => { + statusDiv.textContent = ''; + selectedFlag = selectedCountry = null; + renderFlags(); + renderCountries(); + }, 850); + return; + } + selectedFlag = null; + selectedCountry = null; +} + +restartBtn.onclick = startGame; +startGame(); \ No newline at end of file diff --git a/banderas/styles.css b/banderas/styles.css new file mode 100644 index 0000000..20d95da --- /dev/null +++ b/banderas/styles.css @@ -0,0 +1,76 @@ +body { + background: #eaf4f4; + font-family: Arial, sans-serif; + text-align: center; + color: #22223b; +} +h1 { + margin-top: 32px; + color: #23698f; +} +#score { + font-size: 1.18em; + margin-bottom: 10px; + color: #23698f; +} +#game { + display: flex; + justify-content: center; + gap: 45px; + margin: 30px auto 30px auto; +} +.flags, .countries { + display: grid; + grid-template-columns: 1fr; + gap: 12px; +} +.flag, .country { + background: #fff; + border-radius: 10px; + box-shadow: 0 1px 6px #bbb; + padding: 8px 12px; + font-size: 1.5em; + cursor: pointer; + transition: background .21s, box-shadow .18s; + border: 2px solid #f4f9fa; + outline: none; +} +.flag.selected, .country.selected { + background: #82cfff; + border-color: #23698f; + box-shadow: 0 0 0 2px #23698f; +} +.flag.matched, .country.matched { + background: #b4f7ab; + color: #333; + border-color: #3fb950; + cursor: default; + box-shadow: 0 0 0 2px #3fb950; +} +#restart-btn { + background: #23698f; + color: #fff; + font-size: 1em; + border: none; + border-radius: 7px; + padding: 8px 30px; + cursor: pointer; + margin-bottom: 12px; + transition: background .18s; +} +#restart-btn:hover { + background: #031c34; +} +#status { + font-size: 1.12em; + min-height: 2em; + color: #23698f; + margin-bottom: 10px; +} +@media (max-width: 850px) { + #game { flex-direction: column; gap: 32px;} + .flags, .countries { grid-template-columns: repeat(2,1fr);} +} +@media (max-width: 520px) { + .flags, .countries { grid-template-columns: 1fr;} +} \ No newline at end of file diff --git a/index.html b/index.html index 1621efd..026461a 100644 --- a/index.html +++ b/index.html @@ -263,6 +263,14 @@ +
+
🇪🇸
+
Banderas
+
Empereja la bandera con su país correspondiente.
+ Jugar + + +