Compare commits

..

2 Commits

Author SHA1 Message Date
aebd696259 Añadido juego de las banderas. 2025-08-21 23:59:34 +02:00
3d963c8468 Mejora en README. 2025-08-21 23:59:22 +02:00
5 changed files with 274 additions and 2 deletions

View File

@@ -1,3 +1,30 @@
# Juegos # `Juegos` 🎲
Repositorio con mini-juegos online usando HTML, CSS y JS. > Colección de juegos ligeros, educativos y de entretenimiento listos para jugar en tu navegador.
> Cada juego se encuentra en su propio directorio con su propio código.
## 🕹️ Índice de Juegos
| Juego | Descripción | Enlace |
|-----------------------------------|---------------------------------------------------------|-----------------------------------------------|
| [3-en-raya](3-en-raya/) | Tres en línea clásico para dos jugadores. | [Jugar](https://games.fermdez.net/3-en-raya/index.html) |
| [3-en-raya-computer](3-en-raya-computer/) | Tres en línea contra la máquina (IA). | [Jugar](https://games.fermdez.net/3-en-raya-computer/index.html) |
| [4-en-raya](4-en-raya/) | Conecta 4 fichas en línea antes que tu adversario (o IA).| [Jugar](https://games.fermdez.net/4-en-raya/index.html) |
| [adivina](adivina/) | Adivina el número secreto en pocos intentos. | [Jugar](https://games.fermdez.net/adivina/index.html) |
| [banderas](banderas/) | Empareja banderas y países del mundo. | [Jugar](https://games.fermdez.net/banderas/index.html) |
| [buscaminas](buscaminas/) | Evita las minas y revela el tablero. | [Jugar](https://games.fermdez.net/buscaminas/index.html) |
| [ladrillos](ladrillos/) | Rompe los ladrillos controlando la paleta y la bola. | [Jugar](https://games.fermdez.net/ladrillos/index.html) |
| [memoria](memoria/) | Encuentra todas las parejas en el clásico juego de memoria.| [Jugar](https://games.fermdez.net/memoria/index.html) |
| [memoria-v2](memoria-v2/) | Versión alternativa del juego de memoria, más visual. | [Jugar](https://games.fermdez.net/memoria-v2/index.html) |
| [piedra-papel-tijera](piedra-papel-tijera/) | Juega al clásico piedra, papel o tijera contra la máquina.| [Jugar](https://games.fermdez.net/piedra-papel-tijera/index.html) |
| [pong](pong/) | El Pong clásico, desafía a la IA usando las flechas. | [Jugar](https://games.fermdez.net/pong/index.html) |
| [puzle-numeros](puzle-numeros/) | Ordena los números deslizando las piezas. | [Jugar](https://games.fermdez.net/puzle-numeros/index.html) |
| [reflejos](reflejos/) | Prueba tu tiempo de reacción, haz clic lo más rápido posible.| [Jugar](https://games.fermdez.net/reflejos/index.html) |
| [serpiente](serpiente/) | Come puntos para crecer y evita chocar contigo mismo. | [Jugar](https://games.fermdez.net/serpiente/index.html) |
| [simon-dice](simon-dice/) | Recuerda y repite la secuencia de colores (Simon Dice). | [Jugar](https://games.fermdez.net/simon-dice/index.html) |
| [topo](topo/) | Haz clic en el topo cuando aparezca y suma puntos. | [Jugar](https://games.fermdez.net/topo/index.html) |
## 📝 Licencia
Este proyecto está bajo la licencia `GNU General Public License`.
> [!NOTE]
> Consulte el archivo [LICENCIA](LICENSE) para ver el texto completo de la licencia.

20
banderas/index.html Normal file
View 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
View 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
View 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;}
}

View File

@@ -263,6 +263,14 @@
<svg viewBox="0 0 24 24"><path d="M5 12h14M12 5l7 7-7 7"/></svg> <svg viewBox="0 0 24 24"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a> </a>
</div> </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> </div>
</main> </main>
</body> </body>