sábado, 27 de novembro de 2010

Jogo da Forca em Java

Olá pessoas!
Voltando a postar no Blog.
Desta vez, vou postar um joguinho que tivemos que fazer para a aula de Java, um jogo da Forca. Não é muito complicado, visual bonitinho e funciona \o/
Vou colocar as telas e o código abaixo.

Tela Inicial:

 Nesta tela, temos o desenho da forca e onde será colocado as letras para verificação e aparecem as dicas. Para jogar, é necessário ir em Arquivo, Novo Jogo, que habilitará as caixas de texto e ja sorteara uma palavra. Claro que pode não haver nenhuma palavra cadastrada, então o usuário terá que ir no menu Cadastrar, Palavras e Dicas, que será explicado depois.
Voltando ao jogo, uma palavra foi sorteada, como na imagem abaixo, mostrando a dica:
Após aparecer a dica, o usuário pode testar as letras, embaixo aparecerão riscos, mostrando quantas letras a palavra possui.
Testarei a letra E:
 Como a letra não existe na palavra, ele ja mostra uma parte da figura que formará o corpo do enforcado.
Vou agora inserir a letra A:
Como esta letra existe na palavra, ela aparece em seu(s) respectivo(s) lugar(es) nos riscos abaixo.
Completando com as letras C e S:
Como eu acertei a palavra, o programa exibe uma mensagem de que eu venci o jogo e me pede se eu quero jogar novamente. Se eu escolher Sim, ele sorteará uma nova palavra; se eu escolher Não, o programa será fechado.
Vou colocar agora os códigos para ver como funciona.
O Primeiro código será do botão Novo Jogo:




private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
   lblDigite.enable(true);//habilita os campos do jogo
   CampoTentar.enable(true);
   // btVerifica.enable(true); não desabilitar botão pq depois não habilita        TxtDica.enable(true);
   PalavraForca.enable(true);
   // Dá um reset no jogo:
   PalavraForca.setText("");//limpa os campos
   Tentativas.clear();//limpa as tentativas
   sortearpalavra(); //pega uma palavra do Txt e sorteia
   FimDoJogo=false; //Como ainda não é o fim do jogo, a opção se torna falsa
   LabelImagem.setIcon(icon0); //seta o ícone normal, do desenho da forca
   NumTentativas=0; // zera o numero de tentativas
   desenharpalavra(false);//a palavra só será desenhada se o usuário perder o jogo
}

O próximo código, é o do botao verificar:

private void btVerificaActionPerformed(java.awt.event.ActionEvent evt) {                                           
   if(!FimDoJogo){//verifica se não é o fim do jogo
      tentarletra(CampoTentar.getText());//se não for, pega a letra escrita e verifica se tem na palavra
      CampoTentar.setText("");//deixa o campo onde são digitadas as letras vazio
   }

}

Agora, vou colocar os métodos utilizados, que são chamados no menu e botão:


public class principal extends javax.swing.JFrame { //criacao de variáveis e definição das imagens e cria os vetores
    String PalavraSorteada = new String();
    ArrayList Tentativas = new ArrayList();
    int MaxTentativas = 6 ;
    int NumTentativas = 0 ;
    boolean FimDoJogo = true;
    ImageIcon icon0 = new ImageIcon("forca00.jpg");
    ImageIcon icon1 = new ImageIcon("forca11.jpg");
    ImageIcon icon2 = new ImageIcon("forca22.jpg");
    ImageIcon icon3 = new ImageIcon("forca33.jpg");
    ImageIcon icon4 = new ImageIcon("forca44.jpg");
    ImageIcon icon5 = new ImageIcon("forca55.jpg");
    ImageIcon icon6 = new ImageIcon("forca66.jpg");
    ArrayList PalavrasArquivo = new ArrayList();
    ArrayList DicasArquivo = new ArrayList();

Essas são as declarações no começo da classe; é necessário importar:


import java.awt.Image;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JDialog;


Abaixo, o método que faz o sorteio da palavra:

public void sortearpalavra() {
   try {
        File Arquivo = new File("Palavras.txt"); //lê o arquivo Txt
        FileReader leitor = new FileReader(Arquivo);
        BufferedReader leitorBuf = new BufferedReader(leitor);
        PalavrasArquivo.clear(); //limpa o temporario que armazena as palavras
        DicasArquivo.clear(); //limpa o temporaio que aramzena a dica

        String linha=null;

        while((linha = leitorBuf.readLine()) !=null){
              String colunas[] = linha.split("#"); //lê a linha contendo a palavra e a dica, sabendo q as mesmas sao separadas pelo
              PalavrasArquivo.add(colunas[0]);//caractere #
              DicasArquivo.add(colunas[1]);
        }

        leitorBuf.close();

        int TotalPalavras = PalavrasArquivo.size();//lê o tamanho da palavra para desenhar os traços
        int CodPalavraSorteada = (int) (Math.random()*(TotalPalavras)) ;//sorteia uma palavra randomicamente
        PalavraSorteada = (String) PalavrasArquivo.get(CodPalavraSorteada);//pega a plavra sorteada
        PalavraSorteada= PalavraSorteada.toUpperCase();//coloca em maiusculo
        TxtDica.setText("DICA: "+(String) DicasArquivo.get(CodPalavraSorteada));//pega a dica e exibe
   }
   catch(Exception ex) {
       System.out.println("Erro: "+ ex.toString());};
} 

O próximo método, é o que desenha a palavra na tela, nos riscos, quando o usuário acerta a palavra:

public void desenharpalavra(boolean MostrarTodaAPalavra){
    String tempTexto = new String();
    boolean faltauma = false;
    for(int n=1;n<=PalavraSorteada.length();n++){ //pega o tamanho da palavra e cria os tracinhos
        if((MostrarTodaAPalavra) || (Tentativas.contains(PalavraSorteada.substring(n-1, n)))){
            tempTexto=tempTexto+PalavraSorteada.substring(n-1, n);
        }else{
            tempTexto=tempTexto+"_";
            faltauma=true;
        }
        tempTexto=tempTexto+" ";
    }

    PalavraForca.setText(tempTexto);

    if(!faltauma){
       FimDoJogo=true;
           if ((NumTentativas)<6){ //verifica se o num de tentativas é menor q 6; se for, o usuario ganhou
                joga_nov.pack(); //abre a mensagem q pede se o usuário quer jogar novamente
                joga_nov.setLocationRelativeTo(null);
                joga_nov.setVisible(true);
           }
            
       // Dá pra mostrar uma outra mensagem aqui.
    }
}

O próximo método, é o qe verifica as letras se existem na palavra:

    public void tentarletra(String Letra){
        Letra= Letra.toUpperCase();
        if(Tentativas.contains(Letra)){
            // Mostrar mensagem de q já foi tentada esta letra
        }else{ 
            // Armazena a letra nova na lista de tentativas.
            Tentativas.add(Letra);
            if(PalavraSorteada.contains(Letra)){
                // Acertou
                desenharpalavra(false);
            }else{
                NumTentativas=NumTentativas+1;//vai adicionando o num de tentativas; se errar, adiciona o desenho
                switch(NumTentativas){
                    case(1):{
                        LabelImagem.setIcon(icon1);
                        break;
                    }
                    case(2):{
                        LabelImagem.setIcon(icon2);
                        break;
                    }
                    case(3):{
                        LabelImagem.setIcon(icon3);
                        break;
                    }
                    case(4):{
                        LabelImagem.setIcon(icon4);
                        break;
                    }
                    case(5):{
                        LabelImagem.setIcon(icon5);
                        break;
                    }
                    case(6):{
                        LabelImagem.setIcon(icon6);
                        FimDoJogo=true;
                        desenharpalavra(true);
                        FimDoJogo=true;
                        jogo_novo.pack();
                        jogo_novo.setLocationRelativeTo(null);
                        jogo_novo.setVisible(true);
                        break;
                    }
                }
            }
        }
    }

Esta é a tela que aparece se o usuário ganha o Jogo. Se clicar em Sim, o jogo recomeçará, com uma nova palavra; se Não, o jogo seá fechado.
O código no botão Sim é o seguinte:





private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // Dá um reset no jogo:
        PalavraForca.setText("");
        Tentativas.clear();
        sortearpalavra();
        FimDoJogo=false;
        LabelImagem.setIcon(icon0);
        NumTentativas=0;
        desenharpalavra(false);
        joga_nov.setVisible(false);
    }

E no botão Não:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        System.exit(0);
    }

Quando o usuário perde o jogo, as mensagens são as mesmas, com os mesmos códigos.

Vou passar agora para a parte do Cadastro. O post ta grandinho ja hehehe
Não estou explicando muito o código porque a maior parte está comentada. E acho que o código não é muito difícil de entender.
Continuando, a seguir a tela de Cadastro.

No primeiro Campo, o usuário digita a Palavra que ele quer que seja usada no jogo; na segunda, a Dica da palavra.
No botão Salvar, o código é o seguinte:










private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        BufferedWriter arquivo;
 String valores = txtpalavra.getText() + "#" + txtdica.getText();
 try {
  // abre o arquivo de texto para acrescentar linhas
  arquivo = new BufferedWriter(new FileWriter("Palavras.txt", true));
  // escreve a linha de texto
  arquivo.write(valores);
  // insere uma quebra de linha
  arquivo.newLine();
  // força a gravação dos dados em disco
  arquivo.flush();
  arquivo.close();
                txtpalavra.setText("");
                txtdica.setText("");
  }
 catch (IOException erro)
  {
  // trata o erro
  }
    } 

É claro que terá alguns imports também, nada muito complicado.

Bom, acho que no básico é isso.
Não sou uma grande Expert em Java, mas to aprendendo ^^
Faltou implementar algumas coisas também, quem sabe depois de modificar eu posto as mudanças aqui.

Eabaixo, segue o Link pra quem quiser fazer download do Jogo. Só não consegui fazer o .jar executável funcionar XD

http://www.4shared.com/file/NKEODY4G/FORCA.html


Fui! :D