import java.util.Scanner;
import java.util.random;
public class NewSweeperv1 {
    public static void main(String[] args)  throws InterruptedException {
        String LIGHT_GREEN = "\u001B[38;5;121m";   
        String MEDIUM_GREEN = "\u001B[38;5;83m";     
        String SOFT_GREEN = "\u001B[38;5;120m";  
        String LIME_GREEN = "\u001B[38;5;112m";   
        String YELLOW_GREEN = "\u001B[38;5;190m"; 
        String YELLOW = "\u001B[38;5;226m";       
        String LIGHT_GOLD = "\u001B[38;5;220m";   
        String ORANGE = "\u001B[38;5;214m";       
        String RED = "\u001B[38;5;196m"; 
        String RESET = "\u001B[0m";              


        Scanner scanner = new Scanner(System.in);

        
        int a = 0;
        int b = 0;
        int minesNear = 0;
        int minesAmount = 10;
        int minesPlaced = 0;
        int minesRevealed = 0;
        // String y = "y";
        boolean win = false;
        boolean SpielVerstanden = false;
        boolean bolNutzerWissen = false;
        boolean bolMieneAufdecken = false;
        int[][] MineSweeperField = new int[9][9]; 
        boolean[][] revealedFields = new boolean[9][9]; 

        while (minesPlaced < minesAmount) {
            int row = (int) (Math.random() * 9);
            int col = (int) (Math.random() * 9);
            if (MineSweeperField[row][col] != 13) {
                MineSweeperField[row][col] = 13; // Place a mine
                minesPlaced++;
            }
        }



        for (int j = 0; j < 9; j++) {
            for (int i = 0; i < 9; i++){
                if (MineSweeperField[j][i] == 13) {
                    continue; // Skip mines
                }
                minesNear = 0;
                for (int x = -1; x <= 1; x++){
                    for (int y = -1; y <= 1; y++){
                        int newRow = j + x;
                        int newCol = i + y;  
                                if (newRow >= 0 && newRow < 9 && newCol >= 0 && newCol < 9 && MineSweeperField[newRow][newCol] == 13) {
                                    minesNear++;
                                }
                            }
                        }   
                        MineSweeperField[j][i] = minesNear; // Set the number of nearby mines
                   
                    }
                }            

                System.out.println("Hey! Kurze Frage bevor wir anfangen. Weißt du wie man Minesweeper Spielt? [y/n]");
                while (!bolNutzerWissen) {
                String NutzerWissen = scanner.next();
                if (NutzerWissen.equals("n")){                        
                    
                    System.out.println("Ok, dann erkläre ich es dir mal kurz");
                    Thread.sleep(3000);
                    System.out.println("Zu aller erst ist das hier dein Feld:");
                    Thread.sleep(3000);
                    System.out.println(" 1 2 3 4 5 6 7 8 9");
                    System.out.println("x-----------------x");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 1");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 2");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 3");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 4");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 5");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 6");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 7");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 8");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 9");
                    System.out.println("x-----------------x");
                    Thread.sleep(3000);
                    System.out.println("Innerhalb dieses Feldes sind 10 Mienen Versteckt");
                    Thread.sleep(3000);
                    System.out.println("Wenn du ein Feld aufdecken willst, musst du seine Koordinated eingeben");
                    Thread.sleep(3000);
                    System.out.println("Wenn du ein Feld aufdeckst gibt es die eine Nummer. Das sieht dann in etwa so aus: (Koordinaten: (3|7) )");
                    Thread.sleep(4000);
                    System.out.println(" 1 2 3 4 5 6 7 8 9");
                    System.out.println("x-----------------x");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 1");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 2");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 3");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 4");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 5");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 6");
                    System.out.println("|-|-|" + SOFT_GREEN + "2" + RESET + "|-|-|-|-|-|-| 7");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 8");
                    System.out.println("|-|-|-|-|-|-|-|-|-| 9");
                    System.out.println("x-----------------x");
                    Thread.sleep(3500);
                    System.out.println("Die Zahl in diesem Fall ist 2");
                    Thread.sleep(2000);
                    System.out.println("Diese Zahl kann von 0 bis hoch zu 8 gehen");
                    Thread.sleep(3000);
                    System.out.println("Diese Zahl gibt an, wie viele Mienen an dem Feld angelegt sind. Das beinhaltet seine Kanten alsauch Ecken");
                    Thread.sleep(5000);
                    System.out.println("In diesem Fall gibt es also 2 Mienen Neben dem ausgewählten Feld");
                    Thread.sleep(3000);
                    System.out.println("Dein Ziel in diesem Spiel ist es, alle Minen zu finden und sie nicht aufzudecken");
                    Thread.sleep(3000);
                    System.out.println("Wenn du eine Mine aufdeckst, dann hast du verloren");
                    Thread.sleep(3000);
                    System.out.println("Um dir einfacher zu merken wo Minen sind, kannst du sie mit einer Flagge markieren");
                    Thread.sleep(3000);
                    System.out.println("Denkst du, das du das Spiel Jetzt verstanden hast? [y/n]");
                    
                 

                
                    } else {
                        if (NutzerWissen.equals("y")){
                            System.out.println("Ja, Perfekt! Dann können wir ja gleich Anfangen!");
                            Thread.sleep(3000);
                            bolNutzerWissen = true;
                        }
                        else{
                            System.out.println("Dass war keine der Beiden Optionen die dir gegeben wurde.");
                            Thread.sleep(3500);
                            System.out.println("Entweder weißt du wie man Minesweeper spielt oder halt net.");
                            Thread.sleep(3500);
                            System.out.println("Du bist nicht Schroedingers Minesweeper Spieler. Du kannst nicht beides aufeinmal!");
                            Thread.sleep(3500);
                            System.out.println("Also nochmal, Weißt du wie man Minesweeper Spielt? [y/n]");
                        }
                    }
                }
        System.out.println(" 1 2 3 4 5 6 7 8 9");
        System.out.println("x-----------------x");
        for(int j=0;j!=9;j++)
        {
        for(int i=0;i!=9;i++)
            {
                if(!revealedFields[j][i]) {
                    System.out.print("|-");
                }
                else if (revealedFields[j][i]){
                    System.out.println(MineSweeperField[j][i]);
                }
            }
            System.out.println("|");
        }
        System.out.println("x-----------------x");





            
        



        // loop begin after mine generation and first field print
        while (!win){
        a = 0;
        System.out.println("Willst du ein Feld Aufdecken? [y/n]");
        String MineAufdecken = scanner.next();

        if (MineAufdecken.equals("n")){
        bolMieneAufdecken = false;
        } else {
                bolMieneAufdecken = true;
                }
        System.out.println("Bitte geben sie eine Zeile ein");
        int spalte = scanner.nextInt() - 1;
        System.out.println("Bitte geben sie jetzt eine Spalte ein");
        int zeile = scanner.nextInt() - 1;
        if (bolMieneAufdecken) {
        revealedFields[spalte][zeile]=true;
        }
        //20=Angenommene Mine
        else MineSweeperField[spalte][zeile]=20;



        System.out.println(" 1 2 3 4 5 6 7 8 9");
        System.out.println("x-----------------x");
        for(int j=0;j!=9;j++)
        {
        for(int i=0;i!=9;i++)
            {
                System.out.print("|");
                if (MineSweeperField[j][i]==20){
                    System.out.print(RED + "M" + RESET); //⚐ geht net da VS code das net kann :c
                }
                else if(!revealedFields[j][i]) {
                    System.out.print("-");
                }
                else if (revealedFields[j][i]){
                if (MineSweeperField[j][i]==0){
                    System.out.print(MineSweeperField[j][i]);
                    }                    
                else if (MineSweeperField[j][i]==1){
                    System.out.print(LIGHT_GREEN + MineSweeperField[j][i] + RESET);
                    }
                else if (MineSweeperField[j][i]==2){
                    System.out.print(SOFT_GREEN  + MineSweeperField[j][i] + RESET);
                    }
                else if (MineSweeperField[j][i]==3){
                    System.out.print(MEDIUM_GREEN + MineSweeperField[j][i] + RESET);
                    }
                else if (MineSweeperField[j][i]==4){
                    System.out.print(LIME_GREEN + MineSweeperField[j][i] + RESET);
                    }
                else if (MineSweeperField[j][i]==5){
                    System.out.print(YELLOW_GREEN + MineSweeperField[j][i] + RESET);
                    }                                
                else if (MineSweeperField[j][i]==6){
                    System.out.print(YELLOW + MineSweeperField[j][i] + RESET);
                    }
                else if (MineSweeperField[j][i]==7){
                    System.out.print(LIGHT_GOLD + MineSweeperField[j][i] + RESET);
                    }
                else if (MineSweeperField[j][i]==8){
                    System.out.print(ORANGE + MineSweeperField[j][i] + RESET);
                    }

                }

                // if (MineSweeperField[j][i]==13){
                //     System.out.print("|9");
                // }
                // else System.out.print(MineSweeperField[j][i]);
            }
            a++;
            System.out.println("|" + a);
        }
        System.out.println("x-----------------x");
        minesRevealed++;
        if (minesRevealed>=81)
            win = true;
    }
}
}