import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("Beginner Grösse: Spalte = 9 Zeile = 9 Anzahl Bomben = 10");
System.out.println("Fortgeschrittene Grösse: Spalte = 16 Zeile = 16 Anzahl Bomben = 40");
System.out.println("Profis Grösse: Spalte = 30 Zeile = 16 Anzahl Bomben = 99");
System.out.println("Info: Alle * sind Bomben, wenn eines davon aufgedeckt wird, wird das Spiel automatisch beendet.");
// Ausgabe & Eingabe
System.out.print("Bitte geben Sie die gewünschte Spalte Grösse ein: ");
Scanner eingabeSpalte = new Scanner(System.in);
while (!eingabeSpalte.hasNextInt() && eingabeSpalte.nextInt() > 0) {
System.out.println("Falsche Eingabe");
System.out.print("Bitte geben Sie die gewünschte Spalte Grösse ein: ");
eingabeSpalte = new Scanner(System.in);
}
int inputSizeSpalte = eingabeSpalte.nextInt();
System.out.print("Bitte geben Sie die gewünschte Zeilen Grösse ein: ");
Scanner eingabeZeile = new Scanner(System.in);
while (!eingabeZeile.hasNextInt() && eingabeZeile.nextInt() > 0) {
System.out.println("Falsche Eingabe");
System.out.print("Bitte geben Sie die gewünschte Zeilen Grösse ein: ");
eingabeZeile = new Scanner(System.in);
}
int inputSizeZeile = eingabeZeile.nextInt();
// Ausgabe & Eingabe
System.out.print("Bitte geben Sie die gewünschte Anzahl Bomben ein: ");
Scanner eingabeBomben = new Scanner(System.in);
while (!eingabeBomben.hasNextInt() && eingabeBomben.nextInt() > 0) {
System.out.println("Falsche Eingabe");
System.out.print("Bitte geben Sie die gewünschte Anzahl Bomben ein: ");
eingabeBomben = new Scanner(System.in);
}
int inputBomben = eingabeBomben.nextInt();
// Ausgabe inputSize & inputBomben
System.out.println();
System.out.println("Ihre gewünschte Zeilen Grösse lautet " + inputSizeSpalte);
System.out.println("Ihre gewünschte Spalte Grösse lautet " + inputSizeZeile);
System.out.println("Ihre gewünschte Anzahl Bomben sind: " + inputBomben);
// Funktion aufrufen & in der int[] array speichern
int[][] array = createArray(inputSizeSpalte, inputSizeZeile);
boolean[][] booleanArray = new boolean[inputSizeSpalte][inputSizeZeile];
// Funktion aufrufen
placeBombs(array, inputBomben);
bombenImNachbarfelder(array);
printBoard(array, booleanArray);
felderAufdecken(array, booleanArray, inputBomben);
}
public static void felderAufdecken (int[][] array, boolean[][] booleanArray, int inputBomben) {
while (!spielFertig(booleanArray)) {
System.out.println();
System.out.println("Welches Feld möchten Sie Aufdecken? ");
Scanner inputXAchse;
int inputX = 0;
boolean correctInput = true;
while (correctInput) {
try {
System.out.print("Position X-Achse: ");
inputXAchse = new Scanner(System.in);
inputX = inputXAchse.nextInt() - 1;
if (inputX + 1 > array.length || inputX + 1 < 1) {
System.out.println("Bitte geben Sie einen Wert zwischen 1 und " + array.length + " ein.");
} else {
correctInput = false;
}
} catch (Exception exception) {
System.out.println("Bitte geben Sie eine Ganzzahl an.");
}
}
Scanner inputYAchse;
int inputY = 0;
correctInput = true;
while (correctInput) {
try {
System.out.print("Position Y-Achse: ");
inputYAchse = new Scanner(System.in);
inputY = inputYAchse.nextInt() - 1;
if (inputY + 1 > array[0].length || inputY + 1 < 1) {
System.out.println("Bitte geben Sie einen Wert zwischen 1 und " + array[0].length + " ein.");
} else {
correctInput = false;
booleanArray[inputX][inputY] = true;
}
} catch (Exception exception) {
System.out.println("Bitte geben Sie einen Integer an.");
}
}
if (array[inputX][inputY] == 9){
printBoard(array, booleanArray);
System.out.println("Schade, Sie haben das Spiel verloren!");
return;
} else if (array[inputX][inputY] == 0) {
NachbarfelderVomZero(booleanArray, array, inputX, inputY);
}
printBoard(array, booleanArray);
int bombenprüfen = 0;
for (int x = 0; x < booleanArray.length; x++) {
for (int y = 0; y < booleanArray[0].length; y++) {
if (booleanArray[x][y] == false) {
bombenprüfen = bombenprüfen + 1;
}
}
}
if (bombenprüfen == inputBomben) {
System.out.println("Herzlichen Glückwunsch!");
System.out.println("Sie haben das Spiel gewonnen.");
return;
}
}
}
public static void NachbarfelderVomZero (boolean[][] booleanArray, int[][] array, int inputX, int inputY) {
checkForZero(booleanArray, array, inputX + 1, inputY);
checkForZero(booleanArray, array, inputX + 1, inputY + 1);
checkForZero(booleanArray, array, inputX + 1, inputY - 1);
checkForZero(booleanArray, array, inputX - 1, inputY);
checkForZero(booleanArray, array, inputX - 1, inputY + 1);
checkForZero(booleanArray, array, inputX - 1, inputY - 1);
checkForZero(booleanArray, array, inputX, inputY + 1);
checkForZero(booleanArray, array, inputX, inputY - 1);
}
public static void checkForZero (boolean[][] booleanArray, int[][] array, int x, int y) {
if (x >= 0 && x < booleanArray.length && y >= 0 && y < booleanArray[0].length && booleanArray[x][y] == false) {
if (array[x][y] != 9) {
if (booleanArray[x][y] == false) {
booleanArray[x][y] = true;
}
}
if (array[x][y] == 0) {
NachbarfelderVomZero(booleanArray, array, x, y);
}
}
}
public static boolean spielFertig (boolean[][] booleanArray) {
for (int x = 0; x < booleanArray.length; x++) {
for (int y = 0; y < booleanArray[0].length; y++) {
if (!booleanArray[x][y]) {
return false;
}
}
}
return true;
}
public static int[][] bombenImNachbarfelder(int[][] array) {
for (int x = 0; x < array.length; x++) {
for (int y = 0; y < array[0].length; y++) {
if (array[x][y] == 9) {
checkForBomb(array, x + 1, y);
checkForBomb(array, x + 1, y + 1);
checkForBomb(array, x + 1, y - 1);
checkForBomb(array, x - 1, y);
checkForBomb(array, x - 1, y + 1);
checkForBomb(array, x - 1, y - 1);
checkForBomb(array, x, y + 1);
checkForBomb(array, x, y - 1);
}
}
}
return array;
}
public static void checkForBomb(int[][] array, int x, int y) {
if (x >= 0 && x < array.length &&
y >= 0 && y < array[0].length &&
array[x][y] != 9) {
array[x][y]++;
}
}
public static void placeBombs(int[][] array, int anzahlBomben) {
Random random = new Random();
int a = 0;
while (a < anzahlBomben) {
int spalte = random.nextInt(array.length);
int zeile = random.nextInt(array[0].length);
if (array[spalte][zeile] != 9) {
array[spalte][zeile] = 9;
a++;
}
}
}
public static int[][] createArray(int spalte, int zeile) {
int[][] array = new int[spalte][zeile];
return array;
}
public static void printBoard(int[][] array, boolean[][] booleanArray) {
// Die Koordinaten mit dem entsprechenden Abstand anzeigen (X-Achse)
int anzahlZiffern = (int) Math.log10(array.length) + 1;
int anzahlLuecke = anzahlZiffern * 2 + 1;
for (int positionKoordinatenXAchse = 0; positionKoordinatenXAchse <= anzahlLuecke; positionKoordinatenXAchse++) {
System.out.print(" ");
}
for (int i = 0; i < array.length; i++) {
int arrayAufsteigendPlusEins = (int) Math.log10(i + 1);
System.out.print(i + 1);
for (int b = 0; b < anzahlZiffern - arrayAufsteigendPlusEins; b++) {
System.out.print(" ");
}
}
System.out.println();
// Grafic erste Zeile
for (int erstePositionGraficZeichen = 0; erstePositionGraficZeichen <= anzahlZiffern; erstePositionGraficZeichen++) {
System.out.print(" ");
}
System.out.print("┏━");
int laengeDerGerade = (anzahlZiffern * array.length) + array.length;
for (int i = 0; i < laengeDerGerade; i++) {
System.out.print("━");
}
System.out.println("┓");
// Koordinaten Y-Achse, mit Grafic und Array-Ausgabe
for (int y = 0; y < array[0].length; y++) {
System.out.print(y + 1);
int arrayAufsteigendPlusEins = (int) Math.log10(y + 1);
for (int b = 0; b < anzahlZiffern - arrayAufsteigendPlusEins; b++) {
System.out.print(" ");
}
System.out.print("┃");
for (int x = 0; x < array.length; x++) {
for (int c = 0; c < anzahlZiffern; c++) {
System.out.print(" ");
}
if (booleanArray[x][y]) {
if (array[x][y] == 9) {
System.out.print("*");
} else if (array[x][y] == 0) {
System.out.print(" ");
} else {
System.out.print(array[x][y]);
}
} else {
System.out.print("▒");
}
}
System.out.println(" ┃");
}
for (int letzteZeilGrafic = 0; letzteZeilGrafic <= anzahlZiffern; letzteZeilGrafic++) {
System.out.print(" ");
}
System.out.print("┗━");
for (int i = 0; i < laengeDerGerade; i++) {
System.out.print("━");
}
System.out.println("┛");
}
}