<html>
<head>
<title>BuscaMinas</title>
<style type="text/css">
.casilla {
width: 30px;
height: 30px;
text-align: center;
border: 1px solid #999;
font-size: 18px;
float: left;
background-color: #eee;
}
.casilla.vacia {
background-color: #fff;
}
.casilla.mina {
background-color: #f00;
color: #fff;
font-weight: bold;
}
</style>
</head>
<body>
<div>
<h1>BuscaMinas</h1>
<div>
<button onclick="generarTablero()">Reiniciar</button>
</div>
<div id="tablero">
</div>
</div>
<script>
var tablero = [];
var ancho = 3;
var alto = 3;
var minas = 1;
function generarTablero(){
tablero = [];
let tableroHTML = '';
for(let y = 0; y < alto; y++){
let fila = [];
for(let x = 0; x < ancho; x++){
let casilla = {
mina: false,
marcada: false,
descubierta: false
};
fila.push(casilla);
tableroHTML += `<div class="casilla" data-x="${x}" data-y="${y}" onclick="descubrirCasilla(${x},${y})" oncontextmenu="marcarCasilla(${x},${y})"></div>`
}
tablero.push(fila);
}
document.getElementById('tablero').innerHTML = tableroHTML;
generarMinas(minas);
}
function generarMinas(cantidadMinas){
for(let i = 0; i < cantidadMinas; i++){
let x = Math.floor(Math.random() * ancho);
let y = Math.floor(Math.random() * alto);
tablero[y][x].mina = true;
}
}
function descubrirCasilla(x, y){
if(tablero[y][x].marcada || tablero[y][x].descubierta) return;
if(tablero[y][x].mina){
descubrirTodasLasMinas();
alert('Game Over');
} else {
tablero[y][x].descubierta = true;
renderizarTablero();
if(comprobarVictoria()){
alert('Ganaste');
}
}
}
function marcarCasilla(x, y){
tablero[y][x].marcada = !tablero[y][x].marcada;
renderizarTablero();
}
function descubrirTodasLasMinas(){
tablero.forEach(function(fila, y){
fila.forEach(function(casilla, x){
if(casilla.mina){
tablero[y][x].descubierta = true;
}
});
});
renderizarTablero();
}
function comprobarVictoria(){
let sinDescubrir = tablero.every(function(fila){
return fila.every(function(casilla){
return casilla.mina || casilla.descubierta;
});
});
return sinDescubrir;
}
function renderizarTablero(){
tablero.forEach(function(fila, y){
fila.forEach(function(casilla, x){
let celda = document.querySelector(`div[data-x="${x}"][data-y="${y}"]`);
if(casilla.descubierta){
celda.classList.add('vacia');
if(casilla.mina){
celda.innerText = 'X';
} else {
let cantidadMinasAlrededor = contarMinasAlrededor(x, y);
celda.innerText = cantidadMinasAlrededor > 0 ? cantidadMinasAlrededor : '';
}
} else if(casilla.marcada){
celda.innerText = 'M';
} else {
celda.innerText = '';
}
});
});
}
function contarMinasAlrededor(x, y){
let minasAlrededor = 0;
for(let dy = -1; dy <= 1; dy++){
for(let dx = -1; dx <= 1; dx++){
if(dx == 0 && dy == 0) continue;
let xAlrededor = x + dx;
let yAlrededor = y + dy;
if(xAlrededor >= 0 && xAlrededor < ancho && yAlrededor >= 0 && yAlrededor < alto){
if(tablero[yAlrededor][xAlrededor].mina){
minasAlrededor++;
}
}
}
}
return minasAlrededor;
}
generarTablero();
window.onload = generarTablero;
</script>
</body>
</html>
Si guardáis este código como archivo ".html", observaréis que hay un pequeño fallo.