import java.util.Scanner;
    
    class TickTackToe {
        // Class to represent the Tic Tac Toe game
    
        private Scanner scTTT;      // Scanner object to read input
        private String[] board;     // Array to represent the Tic Tac Toe board
        private String currentPlayer;  // Current player (X or O)
        private int turn;           // Number of turns played
    
        public void play() {
            // Method to start the game
    
            initializeGame();  // Initialize the game variables
    
            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();  // Read user's choice
    
            if (choice == 1) {
                playAgainstFriend();   // Play against a friend
            } else if (choice == 2) {
                playAgainstComputer(); // Play against the computer
            }
    
            scTTT.close();  // Close the scanner
        }
    
        private void initializeGame() {
            // Method to initialize game variables
    
            scTTT = new Scanner(System.in);  // Initialize the scanner
            board = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"};  // Initialize the board
            currentPlayer = "X";  // Start with player X
            turn = 0;  // No turns played yet
        }
    
        private void displayBoard() {
            // Method to display the current state of the board
    
            for (int i = 0; i < 9; i += 3) {
                System.out.println(board[i] + " | " + board[i + 1] + " | " + board[i + 2]);
            }
            // Display the board in the format of a Tic Tac Toe grid
        }
    
        private void switchPlayer() {
            // Method to switch the current player (X <-> O)
    
            currentPlayer = (currentPlayer.equals("X")) ? "O" : "X";
            // If currentPlayer is X, switch to O, and vice versa
        }
    
        private boolean isSquareTaken(int move) {
            // Method to check if a square on the board is already taken
    
            return board[move - 1].equals("X") || board[move - 1].equals("O");
            // Check if the chosen square is already marked by X or O
        }
    
        private void announceWinner() {
            // Method to announce the winner of the game
    
            System.out.println("Player " + currentPlayer + " wins!");
            // Print the winning player (X or O)
        }
    
        private boolean checkWinCondition() {
            // Method to check if there's a winning condition on the board
    
            // Check rows for a winning line
            for (int i = 0; i < 9; i += 3) {
                if (board[i].equals(currentPlayer) && board[i + 1].equals(currentPlayer) && board[i + 2].equals(currentPlayer)) {
                    return true;  // Return true if there's a winning line
                }
            }
            // Check columns for a winning line
            for (int i = 0; i < 3; i++) {
                if (board[i].equals(currentPlayer) && board[i + 3].equals(currentPlayer) && board[i + 6].equals(currentPlayer)) {
                    return true;  // Return true if there's a winning line
                }
            }
            // Check diagonals for a winning line
            if ((board[0].equals(currentPlayer) && board[4].equals(currentPlayer) && board[8].equals(currentPlayer)) ||
                (board[2].equals(currentPlayer) && board[4].equals(currentPlayer) && board[6].equals(currentPlayer))) {
                return true;  // Return true if there's a winning line
            }
            return false;  // No winning line found
        }
    
        private boolean isBoardFull() {
            // Method to check if the board is completely filled
    
            for (String square : board) {
                if (!square.equals("X") && !square.equals("O")) {
                    return false;  // Return false if there's an empty square
                }
            }
            return true;  // All squares are filled
        }
    
        private void playAgainstFriend() {
            // Method to play against a friend
    
            System.out.println("Type the number of the square you want to place your piece in");
            boolean quit = false;  // Variable to control the game loop
    
            while (!quit) {
                displayBoard();  // Display the current state of the board
                System.out.println("Player " + currentPlayer + "'s turn");
                int move = scTTT.nextInt();  // Read the player's move
    
                if (move < 1 || move > 9 || isSquareTaken(move)) {
                    System.out.println("Invalid move, try again");
                } else {
                    board[move - 1] = currentPlayer;  // Mark the chosen square
                    turn++;  // Increment the turn counter
    
                    if (checkWinCondition()) {
                        displayBoard();  // Display the final board
                        announceWinner();  // Announce the winner
                        quit = true;  // Exit the game loop
                    } else if (isBoardFull()) {
                        displayBoard();  // Display the final board
                        System.out.println("It's a tie!");  // Announce a tie
                        quit = true;  // Exit the game loop
                    } else {
                        switchPlayer();  // Switch to the other player
                    }
                }
            }
        }
    
        private void playAgainstComputer() {
            // Method to play against the computer
    
            System.out.println("Type the number of the square you want to place your piece in");
            boolean quit = false;  // Variable to control the game loop
    
            while (!quit) {
                displayBoard();  // Display the current state of the board
    
                if (currentPlayer.equals("X")) {
                    System.out.println("Player 1's turn");
                    int move = scTTT.nextInt();  // Read the player's move
    
                    if (move < 1 || move > 9 || isSquareTaken(move)) {
                        System.out.println("Invalid move, try again");
                    } else {
                        board[move - 1] = currentPlayer;  // Mark the chosen square
                        turn++;  // Increment the turn counter
    
                        if (checkWinCondition()) {
                            displayBoard();  // Display the final board
                            announceWinner();  // Announce the winner
                            quit = true;  // Exit the game loop
                        } else if (isBoardFull()) {
                            displayBoard();  // Display the final board
                            System.out.println("It's a tie!");  // Announce a tie
                            quit = true;  // Exit the game loop
                        } else {
                            switchPlayer();  // Switch to the other player
                        }
                    }
                } else {
                    System.out.println("Computer's turn");
                    int move = (int) (Math.random() * 9) + 1;  // Generate a random move
    
                    while (isSquareTaken(move)) {
                        move = (int) (Math.random() * 9) + 1;  // Find an available random move
                    }
    
                    board[move - 1] = currentPlayer;  // Mark the computer's move
                    turn++;  // Increment the turn counter
    
                    if (checkWinCondition()) {
                        displayBoard();  // Display the final board
                        System.out.println("Computer wins!");  // Announce the computer's win
                        quit = true;  // Exit the game loop
                    } else if (isBoardFull()) {
                        displayBoard();  // Display the final board
                        System.out.println("It's a tie!");  // Announce a tie
                        quit = true;  // Exit the game loop
                    } else {
                        switchPlayer();  // Switch to the other player
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            // Main method to start the game
    
            TicTacToeGame game = new TicTacToeGame();  // Create a new game instance
            game.play();  // Start the game
        }
    }
    
    
    class HigherOrLower {
        public void horl() {
            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();
        }
    }
    
    
    class RockPaperScissors {
        public void rps() {
            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();
        }
    }
    
    
    import java.util.Scanner;
    
        public static void displayMenu() {
            System.out.println("Type 1 for Tic Tac Toe, 2 for Higher or Lower, 3 for Rock Paper Scissors, or 4 to exit");
        }
    
        public static void selectGame(Scanner sc) {
            int choice = sc.nextInt();
    
            switch (choice) {
                case 1:
                    TicTacToeGame ttt = new TicTacToeGame();
                    ttt.play();
                    break;
                case 2:
                    HigherOrLower hol = new HigherOrLower();
                    hol.horl();
                    break;
                case 3:
                    RockPaperScissors rps = new RockPaperScissors();
                    rps.rps();
                    break;
                case 4:
                    // Exit case
                    System.out.println("Exiting the game. Goodbye!");
                    break;
                default:
                    System.out.println("Invalid input, try again");
                    selectGame(sc);
            }
        }
    
        Scanner sc = new Scanner(System.in);
        displayMenu();
        selectGame(sc);
        sc.close();
    
    Type 1 for Tic Tac Toe, 2 for Higher or Lower, 3 for Rock Paper Scissors, or 4 to exit
    Exiting the game. Goodbye!