/*
 * PROGRAMA..... : Jogo da Forca
 * AUTOR........ : Bruno Dadalt Zambiazi
 * DATA......... : 20/03/2007
 * UTILIDADE.... : Jogo da Forca
 */

import java.math.*;
public class Forca {
    public static void main(String args[]) {
        boolean jogar = true;
        do {
            // TENTA RODAR O CÓDIGO, CASO NÃO ENCONTRE O ERRO 'StringIndexOutOfBoundsException'
            try {
                System.out.println("* JOGO DA FORCA *");
                // ARRAY CONTENDO AS PALAVRAS
                String array[] = {
                    "GREMIO", "SISTEMAS", "INFORMAÇAO", "FUTEBOL", "SEXO", "CERVEJA", "GOSTOSAS", "ALGORITMOS", "PROGRAMAÇAO",
                    "TECNICAS", "ADMINISTRAÇÃO", "ORGANIZAÇÃO", "METODOS", "CALCULO", "COMPUTADOR", "VADIAS", "BEBER", "PROGRAMAR",
                    "FODER"
                };
                // STRING QUE SORTEIA O ÍNDICE DO ARRAY
                String palavra = array[(int)(Math.random()*array.length)];
                // VARIÁVEL QUE ARMAZENA O TAMANHO DA PALAVRA
                int tamPal = palavra.length();
                System.out.println("\nINSTRUÇÕES: Você deve digitar uma letra de cada vez. Se a palavra contiver a letra que você ");
                System.out.println("digitou, os respectivos caracteres serão mostrados. Você tem direito a 6 erros.");
                System.out.println("Dica: a palavra contém "+tamPal+" letras. Boa sorte!");
                System.out.println("Obs.: digite todas as letras em MAIÚSCULO.");
                // VARIÁVEL INDICANDO A SITUAÇÃO DO JOGO (SE AINDA ESTÁ "VALENDO" OU NÃO)
                boolean jogo = true;
                do {
                    // ARRAY PARA CONTER AS LETRAS DA PALAVRA SORTEADA E LOOP PARA ARMAZENAR AS LETRAS NO MESMO
                    char letras[] = new char[tamPal];
                    for (int x = 0; x < tamPal; x++) {
                        letras[x] = palavra.charAt(x);
                        System.out.print(" _ ");
                    }
                    // BOOLEANO SETANDO PARA 'true' A VARIÁVEL QUE PERMITE, AO JOGADOR, DIGITAR UMA LETRA
                    boolean tentativa = true;
                    int erro = 0;
                    // ARRAY PARA ARMAZENAMENTO DAS LETRAS CORRETAS (AS QUE O JOGADOR DIGITA E ESTÃO NA PALAVRA SORTEADA)
                    char letraCerta[] = new char[tamPal];
                    while (tentativa) {
                        if (erro < 6) {
                            System.out.println("\n\nDigite uma letra.");
                            /* A LETRA DIGITADA ('char letra', LOGO ABAIXO) PERCORRERÁ OS VALORES DE UM ARRAY (letras[]), UM A UM, PARA
                             ENCONTRAR CARACTERES IGUAIS. PORTANTO, VARIÁVEL 'erroLet' ARMAZENA O VALOR QUANDO A LETRA NÃO SE
                             ENCONTRA NO ARRAY */
                            int erroLet = 0;
                            char letra = Keyboard.readChar();
                            // CRIA VARIÁVEL PARA ARMAZENAR OS VALORES ACERTADOS PELO JOGADOR
                            String novaPalavra = "";
                            for (int x = 0; x < tamPal; x++) {
                                /* SE A LETRA DIGITADA SE ENCONTRA NA POSIÇÃO x DO ARRAY 'letras[]', O VALOR É ARMAZENADO NO MESMO
                                 ÍNDICE DO ARRAY 'letraCerta'. CASO CONTRÁRIO, INCREMENTA O VALOR 'erroLet' */
                                if (letra == letras[x]) {
                                    letraCerta[x] = letra;
                                } else {
                                    erroLet++;
                                }
                                /* SE JÁ CONTIVER A LETRA CERTA NA MESMA POSIÇÃO EM QUE A LETRA SE ENCONTRA NA PALAVRA SORTEADA, A
                                 LETRA É IMPRESSA E SEU VALOR É ADICIONADO À VARIÁVEL QUE CONTÉM OS DADOS CERTOS DIGITADOS PELO
                                 JOGADOR ('novaPalavra'). CASO CONTRÁRIO, IMPRIME UMA UNDERLINE (_) */
                                if (letraCerta[x] == letras[x]) {
                                    novaPalavra += letraCerta[x];
                                    System.out.print(" "+letraCerta[x]+" ");
                                } else {
                                    System.out.print(" _ ");
                                }
                            }
                            if (erroLet >= tamPal) {
                                erro++;
                            }
                            /* CASO AS LETRAS DIGITADAS FORMEM A PALAVRA CORRETA, É MOSTRADA UMA PARABENIZAÇÃO E É SETADA A VARIÁVEL
                             'tentativa' PARA 'false', TERMINANDO O JOGO ATUAL */
                            if (palavra.equals(novaPalavra)) {
                                System.out.println("\n\nPARABÉNS! VOCÊ CONSEGUIU ACERTAR A PALAVRA '"+palavra+"'.");
                                tentativa = false;
                            } else {
                                if (erro == 0) {
                                    System.out.println("\n+----------+");
                                    System.out.println("|          |");
                                    System.out.println("|         ---");
                                    System.out.println("|");
                                    System.out.println("|");
                                    System.out.println("|");
                                    System.out.println("+");
                                } else if (erro == 1) {
                                    System.out.println("\n+----------+");
                                    System.out.println("|          |");
                                    System.out.println("|         ---");
                                    System.out.println("|          Ô");
                                    System.out.println("|");
                                    System.out.println("|");
                                    System.out.println("+");
                                } else if (erro == 2) {
                                    System.out.println("\n+----------+");
                                    System.out.println("|          |");
                                    System.out.println("|         ---");
                                    System.out.println("|          Ô");
                                    System.out.println("|          |");
                                    System.out.println("|");
                                    System.out.println("+");
                                } else if (erro == 3) {
                                    System.out.println("\n+----------+");
                                    System.out.println("|          |");
                                    System.out.println("|         ---");
                                    System.out.println("|          Ô");
                                    System.out.println("|         /|");
                                    System.out.println("|");
                                    System.out.println("+");
                                } else if (erro == 4) {
                                    System.out.println("\n+----------+");
                                    System.out.println("|          |");
                                    System.out.println("|         ---");
                                    System.out.println("|          Ô");
                                    System.out.println("|         /|\\");
                                    System.out.println("|");
                                    System.out.println("+");
                                } else if (erro == 5) {
                                    System.out.println("\n+----------+");
                                    System.out.println("|          |");
                                    System.out.println("|         ---");
                                    System.out.println("|          Ô");
                                    System.out.println("|         /|\\");
                                    System.out.println("|         /");
                                    System.out.println("+");
                                } else if (erro == 6) {
                                    System.out.println("\n+----------+");
                                    System.out.println("|          |");
                                    System.out.println("|         ---");
                                    System.out.println("|          Ô");
                                    System.out.println("|         /|\\");
                                    System.out.println("|         / \\");
                                    System.out.println("+");
                                }
                                System.out.println("Erros possíveis: "+(6-erro));
                            }
                        } else {
                            System.out.println("\n\n+----------------------------------------+");
                            System.out.println("|                                        |");
                            System.out.println("|    Y O U  L O O S E ,  B I T C H  !    |");
                            System.out.println("|                                        |");
                            System.out.println("     A PALAVRA CORRETA ERA '"+palavra+"'");
                            System.out.println("|                                        |");
                            System.out.println("+----------------------------------------+");
                            tentativa = false;
                        }
                    }
                    // TERMINA O JOGO ATUAL
                    jogo = false;
                } while (jogo);
            } catch (StringIndexOutOfBoundsException e) {
                System.out.println("\nErro no programa. Possivelmente, você digitou algum comando inválido.");
            }
            // PEDE SE O JOGADOR QUER JOGAR DE NOVO
            System.out.println("\nVocê quer jogar novamente ('S' para jogar e 'N' para não jogar)?");
            char jogarNovamente = Keyboard.readChar();
            if (jogarNovamente == 'S' || jogarNovamente == 's') {
                jogar = true;
            } else {
                jogar = false;
                System.out.println("\n   FIM DE JOGO   \n");
            }
        } while (jogar);
    }
}