Solución Buscaminas
Desarrollo de la solución:
Código Java completo de la solución:
import java.util.Random;
import java.util.Scanner;
public class Buscaminas {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int tamano = getIntFromTerminal("Introduce el tamaño del tablero", scanner);
//int tamano = 5;
int celdasDescubiertas = 0;
int numCeldasTotales = tamano * tamano;
int numMinas = tamano;
boolean[][] minas = new boolean[tamano][tamano]; // hay mina o no
boolean[][] descubiertas = new boolean[tamano][tamano]; // posición descubierta o no
int[][] contadores = new int[tamano][tamano]; // contadores filas adyacentes
rellenarTableroDeMinas(tamano, minas, numMinas);
establecerContadoresMinasAdyacentes(tamano, minas, contadores);
mostrarTrablero(tamano, minas, descubiertas, contadores);
//mostrarTableroDeMinas(tamano, minas); // DEBUG
//descubrirTodasLasPosiciones(tamano, descubiertas); // DEBUG
while(true) {
int columna = getIntFromTerminal("Introduce el número de columna", scanner);
int fila = getIntFromTerminal("Introduce el número de fila", scanner);
if(minas[fila][columna]) {
System.out.println("GAME OVER");
mostrarTableroDeMinas(tamano, minas);
break;
}
if(!descubiertas[fila][columna]) {
descubiertas[fila][columna] = true;
celdasDescubiertas++;
} else {
System.out.println("La posición ya está descubierta.");
}
if(numCeldasTotales - celdasDescubiertas == numMinas) {
System.out.println("WIN");
break;
}
mostrarTrablero(tamano, minas, descubiertas, contadores);
}
}
public static void establecerContadoresMinasAdyacentes(int tamano, boolean[][] minas, int[][] contadores) {
for(int i = 0; i < tamano; i++) {
for(int j = 0; j < tamano; j++) {
contadores[i][j] = comprobarMinasAdyacentes(minas, i, j, tamano);
}
}
}
public static int comprobarMinasAdyacentes(boolean[][] minas, int fila, int columna, int tamano) {
int contador = 0;
for(int i = fila-1; i <= fila+1; i++) {
for(int j = columna-1; j <= columna+1; j++) {
if(i < 0 || i >= tamano || j < 0 || j >= tamano) {
continue;
}
if(i == fila && j == columna) {
continue;
}
if(minas[i][j]) {
contador++;
}
}
}
return contador;
}
public static int getIntFromTerminal(String msg, Scanner scanner) {
System.out.print(msg + ": ");
String input = scanner.nextLine();
return Integer.parseInt(input);
}
public static void rellenarTableroDeMinas(int tamano, boolean[][] minas, int numMinas) {
Random random = new Random();
while(numMinas > 0) {
int fila = random.nextInt(tamano);
int columna = random.nextInt(tamano);
if(!minas[fila][columna]) {
minas[fila][columna] = true;
numMinas--;
}
}
}
public static void mostrarTrablero(int tamano, boolean[][] minas, boolean[][] descubiertas, int[][] contadores) {
System.out.print("\t");
for(int i = 0; i < tamano; i++) {
System.out.print("C" + i + "\t");
}
System.out.println();
for(int i = 0; i < tamano; i++) {
System.out.print("F" + i + "\t");
for(int j = 0; j < tamano; j++) {
if(descubiertas[i][j]) {
System.out.print(contadores[i][j] + "\t");
} else {
System.out.print("-\t");
}
}
System.out.println();
}
System.out.println();
}
// DEBUG
public static void descubrirTodasLasPosiciones(int tamano, boolean[][] descubiertas) {
for(int i = 0; i < tamano; i++) {
for(int j = 0; j < tamano; j++) {
descubiertas[i][j] = true;
}
}
}
// DEBUG
public static void mostrarTableroDeMinas(int tamano, boolean[][] minas) {
System.out.print("\t");
for(int i = 0; i < tamano; i++) {
System.out.print("C" + i + "\t");
}
System.out.println();
for(int i = 0; i < tamano; i++) {
System.out.print("F" + i + "\t");
for(int j = 0; j < tamano; j++) {
if(minas[i][j]) {
System.out.print("M\t");
} else {
System.out.print("-\t");
}
}
System.out.println();
}
System.out.println();
}
}