// Unit 1: Primitive Data Types and Variables
import java.util.Scanner; // Library for user input
import java.lang.Math; // Library for random numbers

public class ConsoleGame {
    public final String DEFAULT = "\u001B[0m"; // Default Terminal Color

    public ConsoleGame() {
        // Unit 2: Methods and Control Structures
        Scanner sc = new Scanner(System.in); // Using Java Scanner Object

        boolean quit = false;
        while (!quit) {
            this.menuString(); // Print Menu
            try {
                int choice = sc.nextInt(); // Using method from Java Scanner Object
                System.out.print("" + choice + ": ");
                quit = this.action(choice); // Take action
            } catch (Exception e) {
                sc.nextLine(); // Error: clear buffer
                System.out.println(e + ": Not a number, try again.");
            }
        }
        sc.close();
    }

    public void menuString() {
        // Unit 3: Arrays and ArrayLists
        String menuText = ""
                + "\u001B[35m___________________________\n"
                + "|~~~~~~~~~~~~~~~~~~~~~~~~~|\n"
                + "|\u001B[0m          Menu!          \u001B[35m|\n"
                + "|~~~~~~~~~~~~~~~~~~~~~~~~~|\n"
                + "| 0 - Exit                |\n"
                + "| 1 - Rock Paper Scissors |\n"
                + "| 2 - Higher or Lower     |\n"
                + "| 3 - Tic Tac Toe         |\n"
                + "|_________________________|   \u001B[0m\n"
                + "\n"
                + "Choose an option.\n"
                ;
        System.out.println(menuText);
    }

    // Unit 4: Classes and Objects
    private boolean action(int selection) {
        boolean quit = false;
        switch (selection) { // Switch or Switch/Case is Control Flow statement and is used to evaluate the user selection
            case 0:
                System.out.print("Goodbye, World!");
                quit = true;
                break;
            case 1:
                rps();
                break;
            case 2:
                horl();
                break;
            case 3:
                ticTacToe();
                break;

            default:
                // Prints error message from console
                System.out.print("Unexpected choice, try again.");
        }
        System.out.println(DEFAULT); // Make sure to reset color and provide a new line
        return quit;
    }

    // Unit 5: File Input/Output (Not present in this code)

    public void horl() {
        // Unit 6: Conditional Statements and Loops
        System.out.println("Higher or Lower");
        System.out.println("You have three guesses to guess the number I am thinking of between 1-8.");
        System.out.println("If you guess the number correctly, you win!");
        Scanner scHL = new Scanner(System.in);
        int randomG = (int) (Math.random() * 8) + 1;
        int guess = scHL.nextInt();
        for (int i = 3; i > 0; i--) {
            if (guess == randomG) {
                System.out.println("You win!");
                break;
            } else if (guess > randomG) {
                System.out.println("The number is lower");
            } else if (guess < randomG) {
                System.out.println("The number is higher");
            }
            guess = scHL.nextInt();
        }
        System.out.println("Game over.");
        scHL.close();
    }

    public void ticTacToe() {
        // Unit 7: Arrays and ArrayLists
        System.out.println("Tic Tac Toe");
        Scanner scTTT = new Scanner(System.in);
        String[] board = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
        String player = "X";
        String player2 = "O";
        int turn = 0;
        Boolean quit = false;
        System.out.println("Do you want to play against a friend or the computer?");
        System.out.println("Type 1 for friend, 2 for computer");
        int choice = scTTT.nextInt();
        // Make tic-tac-toe using player1 and player2
        if (choice == 1) {
            System.out.println("Type the number of the square you want to place your piece in");
            while (quit == false) {
                System.out.println("Player 1's turn (X)");
                System.out.println(board[0] + " | " + board[1] + " | " + board[2]);
                System.out.println(board[3] + " | " + board[4] + " | " + board[5]);
                System.out.println(board[6] + " | " + board[7] + " | " + board[8]);
                int move = scTTT.nextInt();
                if (board[move - 1].equals("X") || board[move - 1].equals("O")) {
                    System.out.println("That square is already taken, try again");
                } else {
                    board[move - 1] = player;
                    turn++;
                    if (board[0].equals("X") && board[1].equals("X") && board[2].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[3].equals("X") && board[4].equals("X") && board[5].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[6].equals("X") && board[7].equals("X") && board[8].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[0].equals("X") && board[3].equals("X") && board[6].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[1].equals("X") && board[4].equals("X") && board[7].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[2].equals("X") && board[5].equals("X") && board[8].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[0].equals("X") && board[4].equals("X") && board[8].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[2].equals("X") && board[4].equals("X") && board[6].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (turn == 9) {
                        System.out.println("It's a tie!");
                        quit = true;
                    } else {
                        System.out.println("Player 2's turn (O)");
                        System.out.println(board[0] + " | " + board[1] + " | " + board[2]);
                        System.out.println(board[3] + " | " + board[4] + " | " + board[5]);
                        System.out.println(board[6] + " | " + board[7] + " | " + board[8]);
                        int move2 = scTTT.nextInt();
                        if (board[move2 - 1].equals("X") || board[move2 - 1].equals("O")) {
                            System.out.println("That square is already taken, try again");
                        } else {
                            board[move2 - 1] = player2;
                            turn++;
                            if (board[0].equals("O") && board[1].equals("O") && board[2].equals("O")) {
                                System.out.println("Player 2 wins!");
                                quit = true;
                            } else if (board[3].equals("O") && board[4].equals("O") && board[5].equals("O")) {
                                System.out.println("Player 2 wins!");
                                quit = true;
                            } else if (board[6].equals("O") && board[7].equals("O") && board[8].equals("O")) {
                                System.out.println("Player 2 wins!");
                                quit = true;
                            } else if (board[0].equals("O") && board[3].equals("O") && board[6].equals("O")) {
                                System.out.println("Player 2 wins!");
                                quit = true;
                            } else if (board[1].equals("O") && board[4].equals("O") && board[7].equals("O")) {
                                System.out.println("Player 2 wins!");
                                quit = true;
                            } else if (board[2].equals("O") && board[5].equals("O") && board[8].equals("O")) {
                                System.out.println("Player 2 wins!");
                                quit = true;
                            }
                        }
                    }
                }
            }
        }
        if (choice == 2) {
            // Unit 8: Object-Oriented Design
            String computer = "O";
            System.out.println("Type the number of the square you want to place your piece in");
            while (quit == false) {
                System.out.println("Player 1's turn (X)");
                System.out.println(board[0] + " | " + board[1] + " | " + board[2]);
                System.out.println(board[3] + " | " + board[4] + " | " + board[5]);
                System.out.println(board[6] + " | " + board[7] + " | " + board[8]);
                int move = scTTT.nextInt();
                if (board[move - 1].equals("X") || board[move - 1].equals("O")) {
                    System.out.println("That square is already taken, try again");
                } else {
                    board[move - 1] = player;
                    turn++;
                    if (board[0].equals("X") && board[1].equals("X") && board[2].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[3].equals("X") && board[4].equals("X") && board[5].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[6].equals("X") && board[7].equals("X") && board[8].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[0].equals("X") && board[3].equals("X") && board[6].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[1].equals("X") && board[4].equals("X") && board[7].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[2].equals("X") && board[5].equals("X") && board[8].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[0].equals("X") && board[4].equals("X") && board[8].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (board[2].equals("X") && board[4].equals("X") && board[6].equals("X")) {
                        System.out.println("Player 1 wins!");
                        quit = true;
                    } else if (turn == 9) {
                        System.out.println("It's a tie!");
                        quit = true;
                    } else {
                        System.out.println("Computer's turn (O)");
                        System.out.println(board[0] + " | " + board[1] + " | " + board[2]);
                        System.out.println(board[3] + " | " + board[4] + " | " + board[5]);
                        System.out.println(board[6] + " | " + board[7] + " | " + board[8]);
                        int move2 = (int) (Math.random() * 9) + 1;
                        if (board[move2 - 1].equals("X") || board[move2 - 1].equals("O")) {
                            System.out.println("That square is already taken, try again");
                        } else {
                            board[move2 - 1] = computer;
                            turn++;
                            if (board[0].equals("O") && board[1].equals("O") && board[2].equals("O")) {
                                System.out.println("Computer wins!");
                                quit = true;
                            } else if (board[3].equals("O") && board[4].equals("O") && board[5].equals("O")) {
                                System.out.println("Computer wins!");
                                quit = true;
                            } else if (board[6].equals("O") && board[7].equals("O") && board[8].equals("O")) {
                                System.out.println("Computer wins!");
                                quit = true;
                            } else if (board[0].equals("O") && board[3].equals("O") && board[6].equals("O")) {
                                System.out.println("Computer wins!");
                                quit = true;
                            } else if (board[1].equals("O") && board[4].equals("O") && board[7].equals("O")) {
                                System.out.println("Computer wins!");
                                quit = true;
                            } else if (board[2].equals("O") && board[5].equals("O") && board[8].equals("O")) {
                                System.out.println("Computer wins!");
                                quit = true;
                            }
                        }
                    }
                }
            }
        }
        scTTT.close();
    }

    public void rps() {
        // Unit 9: Review and Exam Preparation
        System.out.println("Rock Paper Scissors");
        System.out.println("Type r for rock, p for paper, or s for scissors");
        Scanner scRPS = new Scanner(System.in);
        String userChoice = scRPS.nextLine().toLowerCase();
        Boolean quit = false;
        int random = (int) (Math.random() * 3);

        while (quit == false) {
            if (userChoice.equals("r")) {
                if (random == 1) {
                    System.out.println("You chose rock \nThe computer chose paper \nYou lose!");
                } else if (random == 2) {
                    System.out.println("You chose rock \nThe computer chose scissors \nYou win!");
                } else {
                    System.out.println("You chose rock \nThe computer chose rock \nIt's a tie!");
                }
                quit = true;
            } else if (userChoice.equals("p")) {
                if (random == 1) {
                    System.out.println("You chose paper \nThe computer chose paper \nIt's a tie!");
                } else if (random == 2) {
                    System.out.println("You chose paper \nThe computer chose scissors \nYou lose!");
                } else {
                    System.out.println("You chose paper \nThe computer chose rock \nYou win!");
                }
                quit = true;
            } else if (userChoice.equals("s")) {
                if (random == 1) {
                    System.out.println("You chose scissors \nThe computer chose paper \nYou win!");
                } else if (random == 2) {
                    System.out.println("You chose scissors \nThe computer chose scissors \nIt's a tie!");
                } else {
                    System.out.println("You chose scissors \nThe computer chose rock \nYou lose!");
                }
                quit = true;
            } else {
                System.out.println("Invalid input, try again");
                userChoice = scRPS.nextLine();
            }
        }
        scRPS.close();
    }

    // Unit 10: Final Project (Not present in this code)

    // Unit 11: Additional Topics in Java Programming (Not present in this code)

    static public void main(String[] args) {
        new ConsoleGame(); // Starting Menu object
    }
}

// Unit 1: Primitive Data Types and Variables
import java.util.*;
import java.util.stream.*;
import java.nio.file.*;

public class WordScrambleGame {

    // Unit 2: Methods and Control Structures
    public static String startText() {
        // This method is not used in the code.
        return null; // Placeholder return statement.
    }

    // Unit 3: Arrays and ArrayLists
    public static void main(String[] args) throws IOException {
        // Unit 4: Classes and Objects
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

        int linetext = random.nextInt(9971);

        String selectedWord = "default";

        // Unit 5: File Input/Output
        Stream<String> lines = Files.lines(Paths.get("/home/bobisabob/vscode/CSA_Repo/_notebooks/dictionary.txt"));

        for (int i = 0; i < 101; i++) {
            // Unit 6: Conditional Statements and Loops
            linetext = random.nextInt(9971);
            selectedWord = lines.skip(linetext).findFirst().get();
            if (selectedWord.length() >= 4) {
                break;
            }
        }
        lines.close();

        String scrambledWord = scrambleWord(selectedWord);

        int attempts = 0;
        int maxAttempts = 3;

        System.out.println("Welcome to the Word Scramble Game!");
        System.out.println("Try to unscramble the word. You have " + maxAttempts + " attempts.");
        System.out.println("Here's the scrambled word: " + scrambledWord);

        while (attempts < maxAttempts) {
            System.out.print("Enter your guess: ");
            String guess = scanner.nextLine();

            if (guess.equalsIgnoreCase(selectedWord)) {
                System.out.println("Congratulations! You guessed the word.");
                break;
            } else {
                attempts++;
                System.out.println("Incorrect guess! Attempts remaining: " + (maxAttempts - attempts));
            }
            if (attempts == 1) {
                System.out.println("Here's a hint, the first letter is " + selectedWord.charAt(0));
            }
            if (attempts == 2) {
                System.out.println("Here's a hint, the last letter is " + selectedWord.charAt(selectedWord.length() - 1));
            }
        }

        if (attempts == maxAttempts) {
            System.out.println("Sorry, you've run out of attempts. The word was: " + selectedWord);
        }

        scanner.close();
    }

    // Unit 7: Arrays and ArrayLists
    public static String scrambleWord(String word) {
        char[] letters = word.toCharArray();
        Random random = new Random();

        for (int i = 0; i < letters.length; i++) {
            int randomIndex = random.nextInt(letters.length);
            char temp = letters[i];
            letters[i] = letters[randomIndex];
            letters[randomIndex] = temp;
        }

        return new String(letters);
    }
}

// Unit 8: Object-Oriented Design
WordScrambleGame.main(null);

Welcome to the Word Scramble Game!
Try to unscramble the word. You have 3 attempts.
Here's the scrambled word: pveoimr
Enter your guess: Incorrect guess! Attempts remaining: 2
Here's a hint, the first letter is i
Enter your guess: Incorrect guess! Attempts remaining: 1
Here's a hint, the last letter is e
Enter your guess: Incorrect guess! Attempts remaining: 0
Sorry, you've run out of attempts. The word was: improve