Añadido juego de las banderas.
This commit is contained in:
		
							
								
								
									
										20
									
								
								banderas/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								banderas/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="es">
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="UTF-8">
 | 
			
		||||
  <title>Empareja la Bandera</title>
 | 
			
		||||
  <link rel="stylesheet" href="styles.css">
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
  <h1>Empareja la Bandera</h1>
 | 
			
		||||
  <p>Haz clic en una bandera y después en el país correspondiente. ¿Puedes emparejar todas?</p>
 | 
			
		||||
  <div id="score">Aciertos: <span id="score-value"></span> / <span id="score-total"></span></div>
 | 
			
		||||
  <div id="game">
 | 
			
		||||
    <div class="flags" id="flags"></div>
 | 
			
		||||
    <div class="countries" id="countries"></div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <button id="restart-btn">Reiniciar</button>
 | 
			
		||||
  <div id="status"></div>
 | 
			
		||||
  <script src="script.js"></script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										141
									
								
								banderas/script.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								banderas/script.js
									
									
									
									
									
										Normal file
									
								
							@@ -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();
 | 
			
		||||
							
								
								
									
										76
									
								
								banderas/styles.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								banderas/styles.css
									
									
									
									
									
										Normal file
									
								
							@@ -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;}
 | 
			
		||||
}
 | 
			
		||||
@@ -263,6 +263,14 @@
 | 
			
		||||
          <svg viewBox="0 0 24 24"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
 | 
			
		||||
        </a>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="game-card">
 | 
			
		||||
        <div class="game-icon">🇪🇸</div>
 | 
			
		||||
        <div class="game-title">Banderas</div>
 | 
			
		||||
        <div class="game-desc">Empereja la bandera con su país correspondiente.</div>
 | 
			
		||||
        <a class="play-btn" href="banderas/" target="_blank">Jugar
 | 
			
		||||
          <svg viewBox="0 0 24 24"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
 | 
			
		||||
        </a>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </main>
 | 
			
		||||
</body>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user