Programação em Java - Exemplo Jogo da Velha

De Aulas

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}