Ajuda pra consertar o jogo da velha

15 respostas
java
D

**Galera, o jogo não fica alternando entre jogador um e jogador dois,testem ai por favor,se alguém puder me ajudar a consertar isso eu ficarei muito grato…são 2 classes, a principal e a dos métodos **

public class Main {

public static void main(String[] args) {
	Scanner s = new Scanner(System.in);

	JogoVelha jogoVelha = new JogoVelha();

	String simbolo = "";
	String posicao;
	int valida = 0;
	int jogadas = 0;
	boolean alternarJogador = false; // flag para controlar a vez de jogar
	boolean terminarJogo = false;

	do { // loop principal para rodar o game

		if (alternarJogador == false) {

			do {// loop para alternar entre o jogador um e dois

				System.out.println("Vez do jogador 1! ");
				System.out.println("Escolha uma posição: ");
				jogoVelha.mostrarTabuleiro();
				posicao = s.next();

				if (posicao != null) {
					jogoVelha.validarJogada(posicao);

					if (jogoVelha.validarJogada(posicao)) {
						jogadas++;
						simbolo = "X";
						jogoVelha.substituirJogada(posicao, simbolo);
						jogoVelha.mostrarTabuleiro();
						alternarJogador = true;
						// valor da flag muda para encerrar a jogada do player1 e iniciar a vez do
						// player2
					}
				}
			} while (alternarJogador == false);
		}

		if (alternarJogador == true) {
			do {
				if (alternarJogador == true) {

					System.out.println("Vez do jogador 2! ");
					System.out.println("Escolha uma posição: ");
					jogoVelha.mostrarTabuleiro();
					posicao = s.next();
					if (posicao != null) {
						jogoVelha.validarJogada(posicao);
						if (jogoVelha.validarJogada(posicao)) {
							jogadas++;
							simbolo = "O";
							jogoVelha.substituirJogada(posicao, simbolo);
							jogoVelha.mostrarTabuleiro();
							alternarJogador = false;
						}

					}
				}
			} while (alternarJogador == true); // termina a vez do jogador 2 e passa a flag pro jogador 1
		}

		jogoVelha.testarVencendor(jogadas);

		if (jogoVelha.testarVencendor(jogadas) == null) {
			terminarJogo = true;

		}

	} while (terminarJogo == true); // termina o loop principal do game
}

}

public class JogoVelha {
private String[][] m = { { “1”, “2”, “3” }, { “4”, “5”, “6” }, { “7”, “8”, “9” } };

public void menu() {

}

public String mostrarTabuleiro() {
	for (int li = 0; li < 3; li++) {
		for (int col = 0; col < 3; col++) {
			System.out.printf("   " + m[li][col]);
		}
		System.out.println();

	}
	return null;

}

public boolean validarJogada(String p) { /*
											 * Se a posição informada pelo usuário for equivalente a posição do
											 * tabuleiro, será retornado um true
											 */

	for (int li = 0; li < 3; li++) {
		for (int col = 0; col < 3; col++) {
			if (m[li][col].equals(p)) {
				return true;
			}
		}

	}
	return false;
}

public void substituirJogada(String p, String s) {
	/*
	 * A função recebe a posição(p) da jogada e o símbolo do jogador(s) "O" ou "X".
	 * A matriz recebe o símbolo do jogador, e caso a posição p escolhida seja
	 * equivalente a uma posição do tabuleiro,irá ocorrer a substituição do número
	 * pelo símbolo do jogador.
	 */

	if (p.equals("1")) {
		m[0][0] = s;

	} else if (p.equals("2")) {
		m[0][1] = s;

	} else if (p.equals("3")) {
		m[0][2] = s;

	} else if (p.equals("4")) {
		m[1][0] = s;

	} else if (p.equals("5")) {
		m[1][1] = s;

	} else if (p.equals("6")) {
		m[1][2] = s;

	} else if (p.equals("7")) {
		m[2][0] = s;

	} else if (p.equals("8")) {
		m[2][1] = s;

	} else if (p.equals("9")) {
		m[2][2] = s;

	}

}

public String testarVencendor(int jogadas) {
	String[] V = new String[8];
	String vencedor = "null";
	if (jogadas == 9) { // 9 esgota as possibilidades de vitória, significando que ninguém ganhou
		vencedor = "EMPATE";
	}

	// Cada posição do vetor V recebe uma possibilidade de vitória
	V[0] = m[0][0] + m[0][1] + m[0][2]; // linhas
	V[1] = m[1][0] + m[1][1] + m[1][2];
	V[2] = m[2][0] + m[2][1] + m[2][2];

	V[3] = m[0][0] + m[1][0] + m[2][0]; // colunas
	V[4] = m[0][1] + m[1][1] + m[2][2];
	V[5] = m[0][2] + m[1][2] + m[2][2];

	V[6] = m[0][0] + m[1][1] + m[2][2]; // diagonais
	V[7] = m[0][2] + m[1][1] + m[2][0];

	for (int i = 0; i < V.length; i++) {
		if (V[i].equals("XXX")) {
			vencedor = "Jogador 1";

		} else if (V[i].equals("OOO")) {
			vencedor = "Jogador 2";
		}
	}
	return vencedor;

}

}

15 Respostas

L

Uma característica muito comum em iniciantes (e as vezes pessoas com experiência) é não separar direito os conceitos dentro do código.

A sua função main, por exemplo, está fazendo umas 20 coisas diferentes. Isso dificulta muito o processo de entendimento do código. O problema pode estar em qualquer lugar, e é difícil tentar diminuir a área onde ele pode estar.

Sabe aqueles filmes onde a polícia está tentando localizar alguém pelo sinal de celular? Cada vez eles restringem mais e mais a possível área onde o suspeito está. Com código é parecido, e é mais difícil restringir a área de busca quando todo seu código está praticamente numa função só.

Não vou procurar onde está o problema, mas vou te falar como encontrá-lo. Separe melhor as responsabilidades, crie mais classes e implemente partes específicas do programa em classes específicas.

Por exemplo, você pode ter uma classe Tabuleiro, que tem apenas a responsabilidade de manter um tabuleiro do jogo da velha, com as 9 posições e qual símbolo está em cada posição (X, O ou vazio). Outro exemplo, você pode ter uma classe ControladorDeVez, que gerencia de qual jogador é a vez em um determinado momento. Uma outra ideia é ter uma classe que pergunta aos jogadores qual é o símbolo e a posição onde o jogador da vez deseja jogar.

No final, você pode ter uma classe JogoDaVelha, com um método muito simples, algo como:

public void jogar() {
    while(!tabuleiro.isFinalizado()) {
        Jogador proximo = controladorDeVez.proximoJogador();
        Jogada jogada = controladorDeJogada.perguntarQualAJogada(proximo, tabuleiro);
        tabuleiro.executar(jogada);
    }
    imprimirVencedor(tabuleiro);
}

Essas separações vão facilitar a localização do erro, já que você provavelmente não vai fazer testes automatizados.

Se não quiser fazer isso, vai ter que debugar o programa do jeito que está, ir anotando os valores da variáveis até entender onde está o bug.

D

Obrigado pelas dicas !! Vou tentar aqui

G

Entra nesta página e cadastra que tem um excelente curso de java básico totalmente gratuito que ensina o jogo da velha, ainda não cheguei nesta aula, mas você pode ir direto nela pra entender passo a passo o que significa cada linha. https://loiane.training/

D

Eu estava fazendo esse ai, e parei nesse exercício pra tentar fazer sozinho e depois voltar pro curso pra ver a maneira correta, mas valeu !!!

G

Eu fiquei conhecendo esta página aqui através da Loiane e recomendo que você assista todas as aulas dela, mesmo eu que sou iniciante, pouco conhecimento estou aprendendo muito com as aulas dela. Boa sorte pra gente nos estudos!!! No youtube também estão todas as aulas dela sem precisar de cadastro, é só pesquisar dentro da página do youtube … Curso de Java 01: Introdução e Dicas para quem está Começando

S

n sei se ajuda mas… http://www.javaprogressivo.net/2012/10/Como-fazer-um-Jogo-da-Velha-em-Java.html

D

Eu to em orientação a objetos nas aulas dela, mas eu sempre volto os conteúdos pra fixar mais, boa sorte ai também kkkk

D

Vou dar uma lida,obrigado

D

Oi pessoal, obrigado a todos ! Consegui arrumar meu jogo, só falta eu organizar algumas coisas e adicionar algumas funcionalidades extras para brincar, se quiser, posso postar aqui depois

F

É sempre legal que poste, afinal sua dúvida pode ser a de outros, assim como sua solução :slight_smile:

S

Alguém me pode ajuda no meu tópico pff

D

Vou tentar

D

O MAIN FICOU ASSIM

package jogo.velha;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

	Scanner s = new Scanner(System.in);
	JogoVelha jogoVelha = new JogoVelha();

	int jogadas = 0;
	int controlarPartida = 0;
	String posicao;

	System.out.println("  Jogo da Velha");
	System.out.println("");
	jogoVelha.mostrarTabuleiro();

	do {
		while (jogoVelha.jogador1() == true) {
			jogoVelha.jogador1();

		}
		if (!jogoVelha.testarVencedor(jogadas).equals("null")) {
			break;

		}

		while (jogoVelha.jogador2() == false) {
			jogoVelha.jogador2();

		}
		if (!jogoVelha.testarVencedor(jogadas).equals("null")) {
			break;

		}

	} while (controlarPartida == 0);
    
	System.out.println(jogoVelha.testarVencedor(jogadas));
	jogoVelha.mostrarTabuleiro();

}

}

D

A CLASSE DOS METODOS FICOU ASSIM

package jogo.velha;

import java.util.Scanner;

public class JogoVelha {

Scanner s = new Scanner(System.in);

private String[][] m = { { "1", "2", "3" }, { "4", "5", "6" }, { "7", "8", "9" } };

void menuPrincipal() {

}

void reiniciarPartida() {

}

void sairDoGame() {

}

public boolean jogador1() { // controla a vez do jogador,validando a jogada e testando se ele venceu ou não

	int jogadas = 0;
	String posicao;

	System.out.println("Vez do jogador 1! Escolha uma posição: ");
	mostrarTabuleiro();
	posicao = s.next();

	if (!validarJogada(posicao)) {

		while (!validarJogada(posicao)) {
			System.out.println("Jogada invalida,escolha uma posicao vazia");
			mostrarTabuleiro();
			posicao = s.next();
		}
	}

	else
		substituirJogada(posicao, "X");
	jogadas++;

	return false;

}

public boolean jogador2() {

	int jogadas = 0;
	String posicao;

	System.out.println("Vez do jogador 2! Escolha uma posição: ");
	mostrarTabuleiro();
	posicao = s.next();

	if (!validarJogada(posicao)) {

		while (!validarJogada(posicao)) {
			System.out.println("Jogada invalida,escolha uma posição vazia");
			mostrarTabuleiro();
			posicao = s.next();
		}
	} else
		substituirJogada(posicao, "O");
	jogadas++;

	return true;
}

public String mostrarTabuleiro() {

	for (int li = 0; li < 3; li++) {
		for (int col = 0; col < 3; col++) {
			System.out.printf("   " + m[li][col]);
		}
		System.out.println();
		System.out.println();

	}
	return null;

}

public boolean validarJogada(String posicao) { /*
												 * Se a posição informada pelo usuário for equivalente a posição do
												 * tabuleiro, será retornado um true
												 */

	for (int li = 0; li < 3; li++) {
		for (int col = 0; col < 3; col++) {
			if (m[li][col].equals(posicao)) {
				return true;
			}
		}

	}
	return false;
}

public void substituirJogada(String posicao, String simbolo) {
	/*
	 * A função recebe a posição da jogada e o símbolo do jogador "O" ou "X". A
	 * matriz recebe o símbolo do jogador, e caso a posição p escolhida seja
	 * equivalente a uma posição do tabuleiro,irá ocorrer a substituição do número
	 * pelo símbolo do jogador.
	 */

	if (posicao.equals("1")) {
		m[0][0] = simbolo;

	} else if (posicao.equals("2")) {
		m[0][1] = simbolo;

	} else if (posicao.equals("3")) {
		m[0][2] = simbolo;

	} else if (posicao.equals("4")) {
		m[1][0] = simbolo;

	} else if (posicao.equals("5")) {
		m[1][1] = simbolo;

	} else if (posicao.equals("6")) {
		m[1][2] = simbolo;

	} else if (posicao.equals("7")) {
		m[2][0] = simbolo;

	} else if (posicao.equals("8")) {
		m[2][1] = simbolo;

	} else if (posicao.equals("9")) {
		m[2][2] = simbolo;

	}

}

public String testarVencedor(int jogadas) {
	String[] V = new String[8];
	String resultado = "null";
	if (jogadas == 9) { // 9 esgota as possibilidades de vitória, significando que ninguém ganhou
		resultado = "EMPATE";
	}

	// Cada posição do vetor V recebe uma possibilidade de vitória
	V[0] = m[0][0] + m[0][1] + m[0][2]; // linhas
	V[1] = m[1][0] + m[1][1] + m[1][2];
	V[2] = m[2][0] + m[2][1] + m[2][2];

	V[3] = m[0][0] + m[1][0] + m[2][0]; // colunas
	V[4] = m[0][1] + m[1][1] + m[2][2];
	V[5] = m[0][2] + m[1][2] + m[2][2];

	V[6] = m[0][0] + m[1][1] + m[2][2]; // diagonais
	V[7] = m[0][2] + m[1][1] + m[2][0];

	for (int i = 0; i < V.length; i++) {
		if (V[i].equals("XXX")) {
			resultado = "Jogador 1 venceu!";

		} else if (V[i].equals("OOO")) {
			resultado = "Jogador 2 venceu!";

		}
	}
	return resultado;

}

}

D

Eu consegui fazer funcionar tudo numa boa, mas depois que fui tentar quebrar o algoritmo em mais funcoes eu encontrei um bug e nao consigo resolver: o jogo nao ta conseguindo identificar quando eh empate, apenas identifica vitoria de um ou de outro

Criado 21 de outubro de 2018
Ultima resposta 23 de out. de 2018
Respostas 15
Participantes 5