Programação em Java - Exemplo Jogo da Velha
Voltar para Programação em Java
O Jogo da Velha é um jogo para dois jogadores e que deve ser jogado sobre um tabuleiro de 3x3 casas. Um dos jogadores escolhe uma casa e a marca com um círculo. Em seguida o outro escolhe outra casa e a marca com um xis. Os jogadores continuam se alternando desta forma, até que uma linha com os mesmos símbolos seja formada, na vertical, horizontal ou diagonal. No caso, o jogador que completou a linha, vence o jogo. O jogo também acaba se não houver mais jogadas possíveis, o que caracteriza um empate.
Para este exercício deve ser implementado um programa Java que permita a duas pessoas jogarem Jogo da Velha. Este exercício visa colocar em prática conhecimentos básicas de programação, como arrays, métodos, estruturas de controle de fluxo/repetição, classes, objetos e interação com o usuário.
O tabuleiro deve ser implementado como um array 3x3, onde cada posição do array representa uma casa no jogo. Cada casa do tabuleiro deve acomodar três estados possíveis: vazio, círculo e xis. Portanto o conteúdo do array pode ser int (0=vazio, 1=círculo, 2=xis), char (_=vazio, o=círculo, x=xis), enum, ou qualquer outra coisa que permita representar estes três estados distintos.
Deve ser criada uma classe para encapsular a lógica do jogo. Dentro desta classe deve ficar o tabuleiro, cujo acesso deve ser feito apenas através de métodos desta classe. Devem ser criados métodos para fazer uma jogada (indicando as coordenadas), checar se o jogo não acabou ainda, saber qual jogador ganhou (ou se deu empate), imprimir o tabuleiro na tela, e outros, conforme necessidade.
Durante a execução do programa, cada jogador deve escrever sua jogada (coordenadas) na linha de comando, e o jogo deve imprimir o tabuleiro e esperar pela jogada do próximo jogador. O programa não deve permitir que o jogador tente marcar uma casa que já esteja marcada, nem que tente jogar em casas que não existam (coordenadas negativas, ou maior que o tamanho do tabuleiro). A classe que encapsula a lógica do jogo deve conter métodos para testar se uma dada jogada é válida, que devem ser chamados antes de efetuar a jogada de fato. Ou pode-se fazer este tratamento de erro com exceções.
Resolução
1import java.util.Scanner;
2
3public class JogoDaVelha {
4 private int jogo[][] = new int[3][3];
5
6 public JogoDaVelha() {
7 for (int i = 0; i < 3; i++) {
8 for (int j = 0; j < 3; j++) {
9 jogo[i][j] = 0;
10 }
11 }
12 }
13
14 public void mostrar() {
15 for (int i = 0; i < 3; i++) {
16 for (int j = 0; j < 3; j++) {
17 System.out.print(jogo[i][j] + " ");
18 }
19 System.out.println();
20 }
21 }
22
23 public int verificarVencedor() {
24 for (int i = 0; i < 3; i++) {
25 if ((jogo[i][0] == jogo[i][1]) &&
26 (jogo[i][0] == jogo[i][2])) {
27 if (jogo[i][0] != 0) {
28 return jogo[i][0];
29 }
30 }
31 }
32 for (int j = 0; j < 3; j++) {
33 if ((jogo[0][j] == jogo[1][j]) &&
34 (jogo[0][j] == jogo[2][j]) &&
35 (jogo[0][j] != 0)) {
36 return jogo[0][j];
37 }
38 }
39 if ((jogo[0][0] == jogo[1][1]) &&
40 (jogo[0][0] == jogo[2][2]) &&
41 (jogo[0][0] != 0)) {
42 return jogo[0][0];
43 }
44 if ((jogo[0][2] == jogo[1][1]) &&
45 (jogo[0][2] == jogo[2][0]) &&
46 (jogo[0][2] != 0)) {
47 return jogo[0][2];
48 }
49 for (int i = 0; i < 3; i++) {
50 for (int j = 0; j < 3; j++) {
51 if (jogo[i][j] == 0) {
52 return 0;
53 }
54 }
55 }
56 return 3;
57 }
58
59 public boolean efetuarJogada(int jogador, int linha, int coluna) {
60 if ((linha < 0) || (linha > 2)) {
61 return false;
62 }
63 if ((coluna < 0) || (coluna > 2)) {
64 return false;
65 }
66 if (jogo[linha][coluna] != 0) {
67 return false;
68 }
69 jogo[linha][coluna] = jogador;
70 return true;
71 }
72
73 public static void main(String[] argumentos) {
74 Scanner teclado = new Scanner(System.in);
75 JogoDaVelha jogo = new JogoDaVelha();
76 int jogador = 1;
77 int vencedor = jogo.verificarVencedor();
78 jogo.mostrar();
79 while (vencedor == 0) {
80 System.out.println("Jogador " + jogador);
81 System.out.print("Linha: ");
82 int linha = teclado.nextInt();
83 System.out.print("Coluna: ");
84 int coluna = teclado.nextInt();
85 if (!jogo.efetuarJogada(jogador, linha-1, coluna-1)) {
86 System.out.println("Jogada inválida...");
87 } else {
88 jogador = (jogador == 1) ? 2 : 1;
89 }
90 jogo.mostrar();
91 vencedor = jogo.verificarVencedor();
92 }
93 switch (vencedor) {
94 case 1 :
95 System.out.println("Vencedor jogador 1");
96 break;
97 case 2:
98 System.out.println("Vencedor jogador 2");
99 break;
100 case 3:
101 System.out.println("Empate");
102 break;
103 }
104 }
105}
Resolução 2
1import java.util.Scanner;
2
3public class JogoDaVelha {
4 private int [][] tabuleiro = new int[3][3];
5 private int jogador = 1;
6
7 public boolean jogar(int x, int y) {
8 if ((x < 0) || (x > 2) || (y < 0) || (y > 2)) {
9 return false;
10 }
11 if (tabuleiro[x][y] != 0) {
12 return false;
13 }
14 tabuleiro[x][y] = jogador;
15 jogador = (jogador == 1) ? 2 : 1;
16 return true;
17 }
18
19 public int vencedor() {
20 for (int j = 1; j < 3; j++) {
21 // Testa as linhas
22 for (int linha = 0; linha < 3; linha++) {
23 boolean fechou = true;
24 for (int coluna = 0; coluna < 3; coluna++) {
25 if (tabuleiro[coluna][linha] != j) {
26 fechou = false;
27 }
28 }
29 if (fechou) {
30 return j;
31 }
32 }
33 // Testa as colunas
34 for (int coluna = 0; coluna < 3; coluna++) {
35 boolean fechou = true;
36 for (int linha = 0; linha < 3; linha++) {
37 if (tabuleiro[coluna][linha] != j) {
38 fechou = false;
39 }
40 }
41 if (fechou) {
42 return j;
43 }
44 }
45 // Testar as diagonais
46 boolean fechou = true;
47 for (int posicao = 0; posicao < 3; posicao++) {
48 if (tabuleiro[posicao][posicao] != j) {
49 fechou = false;
50 }
51 }
52 if (fechou) {
53 return j;
54 }
55 fechou = true;
56 for (int posicao = 2; posicao >= 0; posicao--) {
57 if (tabuleiro[posicao][2-posicao] != j) {
58 fechou = false;
59 }
60 }
61 if (fechou) {
62 return j;
63 }
64 }
65 boolean empate = true;
66 for (int linha = 0; linha < 3; linha++) {
67 for (int coluna = 0; coluna < 3; coluna++) {
68 if (tabuleiro[coluna][linha] == 0) {
69 empate = false;
70 }
71 }
72 }
73 if (empate) {
74 return 3;
75 }
76 return 0;
77 }
78
79 public String toString() {
80 String out = "";
81 for (int linha = 0; linha < 3; linha++) {
82 for (int coluna = 0; coluna < 3; coluna++) {
83 switch (tabuleiro[coluna][linha]) {
84 case 0 :
85 out += "_ ";
86 break;
87 case 1 :
88 out += "O ";
89 break;
90 case 2 :
91 out += "X ";
92 break;
93 }
94 }
95 out += "\n";
96 }
97 return out;
98 }
99
100 public void executar() {
101 Scanner entrada = new Scanner(System.in);
102 while (vencedor() == 0) {
103 System.out.println(this);
104 System.out.println("Jogador: " + jogador);
105 System.out.print("Coluna: ");
106 int coluna = entrada.nextInt();
107 System.out.print("Linha: ");
108 int linha = entrada.nextInt();
109 if (!jogar(coluna, linha)) {
110 System.out.println("Jogada invalida, tente novamente...");
111 }
112 }
113 System.out.println(this);
114 System.out.println(vencedor());
115 }
116
117 public static void main(String [] args) {
118 JogoDaVelha jogo = new JogoDaVelha();
119 jogo.executar();
120 }
121}