Tutorial Forca #5 - Fazendo o jogo funcionar

Boa tarde pessoal!
Para começar a fazer o jogo funcionar, vamos implementar o método OnClickListener à nossa activity
public class GameActivity extends Activity implements OnClickListener {
Ao fazer isso, será preciso criar o seguinte método:
public void onClick(View v) {

}
Vamos declarar os objetos que tem no layout.
TextView tvPalavra;
ImageView forca;
Button bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM,
       bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ;
E vamos criar um método para instancia-los.
private void iniciarObjetos() {
    tvPalavra = (TextView) findViewById(R.id.tvPalavra);
    forca = (ImageView) findViewById(R.id.ivForca);

    bA = (Button) findViewById(R.id.bA);
    bB = (Button) findViewById(R.id.bB);
    bC = (Button) findViewById(R.id.bC);
    bD = (Button) findViewById(R.id.bD);
    bE = (Button) findViewById(R.id.bE);
    bF = (Button) findViewById(R.id.bF);
    bG = (Button) findViewById(R.id.bG);
    bH = (Button) findViewById(R.id.bH);
    bI = (Button) findViewById(R.id.bI);
    bJ = (Button) findViewById(R.id.bJ);
    bK = (Button) findViewById(R.id.bK);
    bL = (Button) findViewById(R.id.bL);
    bM = (Button) findViewById(R.id.bM);
    bN = (Button) findViewById(R.id.bN);
    bO = (Button) findViewById(R.id.bO);
    bP = (Button) findViewById(R.id.bP);
    bQ = (Button) findViewById(R.id.bQ);
    bR = (Button) findViewById(R.id.bR);
    bS = (Button) findViewById(R.id.bS);
    bT = (Button) findViewById(R.id.bT);
    bU = (Button) findViewById(R.id.bU);
    bV = (Button) findViewById(R.id.bV);
    bW = (Button) findViewById(R.id.bW);
    bX = (Button) findViewById(R.id.bX);
    bY = (Button) findViewById(R.id.bY);
    bZ = (Button) findViewById(R.id.bZ);
    bA.setOnClickListener(this);
    bB.setOnClickListener(this);
    bC.setOnClickListener(this);
    bD.setOnClickListener(this);
    bE.setOnClickListener(this);
    bF.setOnClickListener(this);
    bG.setOnClickListener(this);
    bH.setOnClickListener(this);
    bI.setOnClickListener(this);
    bJ.setOnClickListener(this);
    bK.setOnClickListener(this);
    bL.setOnClickListener(this);
    bM.setOnClickListener(this);
    bN.setOnClickListener(this);
    bO.setOnClickListener(this);
    bP.setOnClickListener(this);
    bQ.setOnClickListener(this);
    bR.setOnClickListener(this);
    bS.setOnClickListener(this);
    bT.setOnClickListener(this);
    bU.setOnClickListener(this);
    bV.setOnClickListener(this);
    bW.setOnClickListener(this);
    bX.setOnClickListener(this);
    bY.setOnClickListener(this);
    bZ.setOnClickListener(this);
}
Vamos declarar algumas variáveis que utilizaremos ao longo das próximas funções e instanciar a classe Palavras:
Palavras palavras = new Palavras();

private String palavraSecreta, tracos;
private int nTentativas;
private char letra;
Bom, agora precisamos identificar o click de cada botão no método onClick, e para isso vou criar um método chamado verificarClick(View v) e chamá-lo dentro do método onClick
public class onClick(View v) {
    verificarClick(v);
}

private void verificarClick(View v) {
    switch (v.getId()) {
    case R.id.bA:
        bA.setEnabled(false); letra = 'A'; break;
    case R.id.bB:
        bB.setEnabled(false); letra = 'B'; break;
    case R.id.bC:
        bC.setEnabled(false); letra = 'C'; break;
    case R.id.bD:
        bD.setEnabled(false); letra = 'D'; break;
    case R.id.bE:
        bE.setEnabled(false); letra = 'E'; break;
    case R.id.bF:
        bF.setEnabled(false); letra = 'F'; break;
    case R.id.bG:
        bG.setEnabled(false); letra = 'G'; break;
    case R.id.bH:
        bH.setEnabled(false); letra = 'H'; break;
    case R.id.bI:
        bI.setEnabled(false); letra = 'I'; break;
    case R.id.bJ:
        bJ.setEnabled(false); letra = 'J'; break;
    case R.id.bK:
        bK.setEnabled(false); letra = 'K'; break;
    case R.id.bL:
        bL.setEnabled(false); letra = 'L'; break;
    case R.id.bM:
        bM.setEnabled(false); letra = 'M'; break;
    case R.id.bN:
        bN.setEnabled(false); letra = 'N'; break;
    case R.id.bO:
        bO.setEnabled(false); letra = 'O'; break;
    case R.id.bP:
        bP.setEnabled(false); letra = 'P'; break;
    case R.id.bQ:
        bQ.setEnabled(false); letra = 'Q'; break;
    case R.id.bR:
        bR.setEnabled(false); letra = 'R'; break;
    case R.id.bS:
        bS.setEnabled(false); letra = 'S'; break;
    case R.id.bT:
        bT.setEnabled(false); letra = 'T'; break;
    case R.id.bU:
        bU.setEnabled(false); letra = 'U'; break;
    case R.id.bV:
        bV.setEnabled(false); letra = 'V'; break;
    case R.id.bW:
        bW.setEnabled(false); letra = 'W'; break;
    case R.id.bX:
        bX.setEnabled(false); letra = 'X'; break;
    case R.id.bY:
        bY.setEnabled(false); letra = 'Y'; break;
    case R.id.bZ:
        bZ.setEnabled(false); letra = 'Z'; break;
    }
}
Vamos criar mais dois métodos para auxiliar no funcionamento do jogo
private void habilitarBotoes() {
    bA.setEnabled(true);
    bB.setEnabled(true);
    bC.setEnabled(true);
    bD.setEnabled(true);
    bE.setEnabled(true);
    bF.setEnabled(true);
    bG.setEnabled(true);
    bH.setEnabled(true);
    bI.setEnabled(true);
    bJ.setEnabled(true);
    bK.setEnabled(true);
    bL.setEnabled(true);
    bM.setEnabled(true);
    bN.setEnabled(true);
    bO.setEnabled(true);
    bP.setEnabled(true);
    bQ.setEnabled(true);
    bR.setEnabled(true);
    bS.setEnabled(true);
    bT.setEnabled(true);
    bU.setEnabled(true);
    bV.setEnabled(true);
    bW.setEnabled(true);
    bX.setEnabled(true);
    bY.setEnabled(true);
    bZ.setEnabled(true);
}

private void desabilitarBotoes() {
    bA.setEnabled(false);
    bB.setEnabled(false);
    bC.setEnabled(false);
    bD.setEnabled(false);
    bE.setEnabled(false);
    bF.setEnabled(false);
    bG.setEnabled(false);
    bH.setEnabled(false);
    bI.setEnabled(false);
    bJ.setEnabled(false);
    bK.setEnabled(false);
    bL.setEnabled(false);
    bM.setEnabled(false);
    bN.setEnabled(false);
    bO.setEnabled(false);
    bP.setEnabled(false);
    bQ.setEnabled(false);
    bR.setEnabled(false);
    bS.setEnabled(false);
    bT.setEnabled(false);
    bU.setEnabled(false);
    bV.setEnabled(false);
    bW.setEnabled(false);
    bX.setEnabled(false);
    bY.setEnabled(false);
    bZ.setEnabled(false);
}
Precisamos criar também um método para iniciar o jogo, que também servirá para reiniciá-lo
private void iniciarJogo() {
    palavraSecreta = palavras.sorteio();
    nTentativas = 6;
    tracos = "";
    letra = ' ';
    for (int x = 0; x < palavraSecreta.length(); x++) {
        if (palavraSecreta.charAt(x) == '-') {
            tracos += " - ";
        } else if (palavraSecreta.charAt(x) == ' ') {
            tracos += "   ";
        } else {
            tracos += " _ ";
        }
    }

    habilitarBotoes();
    tvPalavra.setText(tracos);
    forca.setImageResource(R.drawable.forca_6);
}
O que a função acima faz? Ela "lê" a palavra que foi sorteada e substitui cada letra por um " _ " (underline), como forma de esconder a palavra que foi sorteada.
E para que ela tenha efeito, é preciso chamá-la no método onCreate
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    iniciarObjetos();
    iniciarJogo();
}
Calma... Estamos quase no final já...
Vamos criar um método para verificar a letra escolhida está certa
private boolean verificarAcerto() {
    boolean acerto = false;
    for (int x = 0; x < palavraSecreta.length(); x++) {
        char tmp = ' ';
        char vogal = palavraSecreta.charAt(x);
        if (vogal == 'Á') tmp = 'A';
        if (vogal == 'Ã') tmp = 'A';
        if (vogal == 'À') tmp = 'A';
        if (vogal == 'É') tmp = 'E';
        if (vogal == 'Í') tmp = 'I';
        if (vogal == 'Ó') tmp = 'O';
        if (vogal == 'Ô') tmp = 'O';
        if (vogal == 'Õ') tmp = 'O';
        if (vogal == 'Ú') tmp = 'U';
        if (vogal == 'Ç') tmp = 'C';
        if (vogal == letra || tmp == letra) {
            tracos = tracos.substring(0, 3 * x + 1) + vogal + tracos.substring(3 * x + 2);
            acerto = true;
        }
    }
    tvPalavra.setText(tracos);

    return acerto;
}
Antes que você pergunte o motivo de tantos ifs... Eles estão ali, para caso exista alguma palavra com algum caracter especial (acento por exemplo), ele seja substituído pelo seu equivalente não especial (ex.: Á = A)
E agora, para funcionar mesmo, basta adicionar o seguinte código ao método onClick
public void onClick(View v) {
    verificarClick(v);

    boolean acerto = verificarAcerto();

    if (!acerto) {
        nTentativas--;
        switch (nTentativas) {
        case 5:
            forca.setImageResource(R.drawable.forca_5);
            break;
        case 4:
            forca.setImageResource(R.drawable.forca_4);
            break;
        case 3:
            forca.setImageResource(R.drawable.forca_3);
            break;
        case 2:
            forca.setImageResource(R.drawable.forca_2);
            break;
        case 1:
            forca.setImageResource(R.drawable.forca_1);
            break;
        case 0:
            forca.setImageResource(R.drawable.forca_0);
            desabilitarBotoes();
            AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(GameActivity.this);
            dialogBuilder.setTitle("Perdeu!")
            .setMessage("Deseja jogar novamente?")
            .setCancelable(false)
            .setPositiveButton("Sim", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    iniciarJogo();
                }
            })
            .setNegativeButton("Não", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    finish();
                }
            });
            AlertDialog dialog = dialogBuilder.create();
            dialog.show();
        }
    }

    if (Replace.replaceAll(tracos, " ", "").equalsIgnoreCase(palavraSecreta)) {
        desabilitarBotoes();
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        dialogBuilder.setTitle("Parabéns!")
        .setMessage("Deseja jogar novamente?")
        .setCancelable(false)
        .setPositiveButton("Sim", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                iniciarJogo();
            }
        })
        .setNegativeButton("Não", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                finish();
            }
        });
        dialogBuilder.create().show();
    }
}
Por enquanto é isso... o jogo está funcionando.
Nos próximos post o que vamos fazer é ir aprimorando esse jogo, ir melhorando ele.
Caso alguém tenha alguma sugestão, é só postar aí!

Ah, para ver as alterações deste post você pode clicar aqui.

Sobre o autor

André Luís Batista Kunde
Técnico em Informática (2004), Bacharel em Administração com ênfase em Marketing (2009), buscando ser Engenheiro de Software, Trabalhando com software educacional e me aventurando pelo mundo da programação mobile.

4 comentários:

  1. Show de bola seu trabalho, to aprendendo bastante seguindo os seus posts ! !

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Vc poderia botar o nome de cada arquivo ou local dentro do código que tem que por cada bloco de códigos ( descrição de onde botar o que ) antes de cada imagem ia me ajudar mt a identificar onde fica

    ResponderExcluir

Copyright © 2013 Aprendendo Android and Blogger Themes.