import java.util.Scanner;
import java.util.Random;

public class Hangman {
    private static final String[] WORDS = {"apple", "banana", "orange", "grape", "kiwi", "pineapple"};
    private static final String[] HANGMAN_ART = {
        "  ____\n |    |\n      |\n      |\n      |\n      |\n=========",
        "  ____\n |    |\n O    |\n      |\n      |\n      |\n=========",
        "  ____\n |    |\n O    |\n |    |\n      |\n      |\n=========",
        "  ____\n |    |\n O    |\n/|    |\n      |\n      |\n=========",
        "  ____\n |    |\n O    |\n/|\\   |\n      |\n      |\n=========",
        "  ____\n |    |\n O    |\n/|\\   |\n/     |\n      |\n=========",
        "  ____\n |    |\n O    |\n/|\\   |\n/ \\   |\n      |\n========="
    };

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

        boolean playAgain;
        do {
            String wordToGuess = WORDS[random.nextInt(WORDS.length)];
            char[] guessedLetters = new char[wordToGuess.length()];
            int incorrectGuesses = 0;

            System.out.println("Welcome to Hangman!");
            System.out.println("Guess the word:");

            while (incorrectGuesses < HANGMAN_ART.length) {
                displayWord(wordToGuess, guessedLetters);
                displayHangman(incorrectGuesses);

                System.out.print("\nEnter a letter: ");
                char guess = scanner.nextLine().toLowerCase().charAt(0);

                if (isLetterGuessed(guess, guessedLetters)) {
                    System.out.println("You've already guessed that letter. Try again.");
                    continue;
                }

                if (wordToGuess.indexOf(guess) == -1) {
                    System.out.println("Incorrect guess!");
                    incorrectGuesses++;
                } else {
                    System.out.println("Correct guess!");
                }

                updateGuessedLetters(guess, wordToGuess, guessedLetters);

                if (isWordGuessed(guessedLetters)) {
                    displayWord(wordToGuess, guessedLetters);
                    System.out.println("Congratulations! You guessed the word.");
                    break;
                }
            }

            if (incorrectGuesses == HANGMAN_ART.length) {
                System.out.println("Sorry, you ran out of guesses. The word was: " + wordToGuess);
            }

            System.out.print("Do you want to play again? (yes/no): ");
            String playAgainInput = scanner.nextLine().toLowerCase();
            playAgain = playAgainInput.equals("yes");
        } while (playAgain);
    }

    private static void displayWord(String word, char[] guessedLetters) {
        StringBuilder display = new StringBuilder();
        for (char letter : word.toCharArray()) {
            if (contains(guessedLetters, letter)) {
                display.append(letter).append(" ");
            } else {
                display.append("_ ");
            }
        }
        System.out.println(display.toString());
    }

    private static boolean contains(char[] array, char value) {
        for (char element : array) {
            if (element == value) {
                return true;
            }
        }
        return false;
    }

    private static void displayHangman(int incorrectGuesses) {
        System.out.println(HANGMAN_ART[incorrectGuesses]);
    }

    private static boolean isLetterGuessed(char guess, char[] guessedLetters) {
        for (char letter : guessedLetters) {
            if (letter == guess) {
                return true;
            }
        }
        return false;
    }

    private static void updateGuessedLetters(char guess, String word, char[] guessedLetters) {
        for (int i = 0; i < word.length(); i++) {
            if (word.charAt(i) == guess) {
                guessedLetters[i] = guess;
            }
        }
    }

    private static boolean isWordGuessed(char[] guessedLetters) {
        for (char letter : guessedLetters) {
            if (letter == 0) {
                return false;
            }
        }
        return true;
    }
}
