Duvidas em jogo de Dama!

Bom dia pessoal!

Estou trabalhando em um projeto de dama e estou enroscado em como criar e movimentar a dama.
Alguem poderia me dar umas dicas?

    package tabuleiro;

public class Tabuleiro {
	public char[][] matriz;

	public char[][] getMatriz() {
		return matriz;
	}

	public void setMatriz(char[][] matriz) {
		this.matriz = matriz;
	}

	private static final int tamanho = 10;

	public Tabuleiro() {
		this.matriz = new char[tamanho][tamanho];
		for (int i = 0; i < tamanho; i++) {
			for (int j = 0; j < tamanho; j++) {
				this.matriz[i][j] = '-';
			}
		}
	}

	public int getTamanho() {
		return tamanho;
	}

	public void imprimirTabuleiro() {
		System.out.println("\n            1   2   3   4   5   6   7   8");
		System.out.println("");

		for (int linha = tamanho - 2; linha > 0; linha--) {
			System.out.print("       " + linha + " ");

			for (int coluna = 1; coluna < tamanho - 1; coluna++) {
				System.out.print("   " + matriz[linha][coluna]);
			}

			System.out.println();
		}

	}

	public void colocarPecaNoTabuleiro() {

		// Preenchendo fileiras
		for (int i = 1; i < Tabuleiro.tamanho; i++) {
			matriz[1][i] = (char) ('O');

			for (int j = 1; j < Tabuleiro.tamanho; j++) {
				matriz[2][j] = (char) ('O');
			}

			for (int h = 1; h < Tabuleiro.tamanho; h++) {
				matriz[7][h] = (char) ('O');
			}
			for (int b = 1; b < Tabuleiro.tamanho; b++) {
				matriz[8][b] = (char) ('O');
			}

		}

	}
	
	public boolean moverPecaCorretamente(int posicaoAnteriorL, int posicaoAnteriorC, int posicaoPosteriorL,
			int posicaoPosteriorC) {
		if(posicaoPosteriorL >= posicaoAnteriorL + 2 && posicaoPosteriorC >= posicaoAnteriorC + 1) {
			return true; //Regra para mover, nao serve pra dama.
		}
		else return false;
	}

	public boolean verificarExistenciaPeca(int posicaoL, int posicaoC) {
		if (matriz[posicaoL][posicaoC] == '-') { //Verifica se existe peça na posição origem.
			return false;
		} else
			return true;
	}
	
	public boolean validarPosicaoTabuleiro(int posicaoL, int posicaoC) {
		if (posicaoL >= 0 && posicaoL < 8 && posicaoC >= 0 && posicaoC < 8) {
			return true; //Verifica se a posição não é maior que o tabuleiro.
		} else {
			return false;
		}
	}

	public void movimentarPeca(int posicaoAnteriorL, int posicaoAnteriorC, int posicaoPosteriorL,
			int posicaoPosteriorC) {
		if (!validarPosicaoTabuleiro(posicaoAnteriorL, posicaoAnteriorC)) {
			throw new TabuleiroException("Posição fora das margens do tabuleiro");
		}

		if (!validarPosicaoTabuleiro(posicaoPosteriorL, posicaoPosteriorC)) {
			throw new TabuleiroException("Posição fora das margens do tabuleiro");
		}
		if (!verificarExistenciaPeca(posicaoAnteriorL, posicaoAnteriorC)) {
			throw new TabuleiroException("Não existe peça na posição de origem!");
		}

		if (verificarExistenciaPeca(posicaoPosteriorL, posicaoPosteriorC)) {
			throw new TabuleiroException("Peça na posição destino!");
		}
		
		if (moverPecaCorretamente(posicaoAnteriorL, posicaoAnteriorC, posicaoPosteriorL, posicaoPosteriorC)) {
			throw new TabuleiroException("Movimentação invalida! Você só pode mover 1 casa no tabuleiro.");
		}
		
		
		char aux = matriz[posicaoAnteriorL][posicaoAnteriorC];
		matriz[posicaoAnteriorL][posicaoAnteriorC] = matriz[posicaoPosteriorL][posicaoPosteriorC];
		matriz[posicaoPosteriorL][posicaoPosteriorC] = aux; //move as peças
	}

	
}
    package programa;

import java.util.Scanner;

import tabuleiro.Tabuleiro;

public class Program {
	public static void main(String[] args) {
		jogar();
	}

	public static void jogar() {
		Scanner sc = new Scanner(System.in);
		Tabuleiro tabuleiro = new Tabuleiro();

		tabuleiro.colocarPecaNoTabuleiro();
		tabuleiro.imprimirTabuleiro();
		do {
			int vL = sc.nextInt();
			sc.nextLine();
			int vC = sc.nextInt();
			sc.nextLine();
			int pvL = sc.nextInt();
			sc.nextLine();
			int pvC = sc.nextInt();

			tabuleiro.movimentarPeca(vL, vC, pvL, pvC);
			tabuleiro.imprimirTabuleiro();
		} while (true);
	}

}

O codigo ainda é bem primitivo… Estou aprendendo ainda :slight_smile:

Qual dificuldade você está tendo exatamente? Consegue descrever?

Olhando por cima, no seu método moverPecaCorretamente, você anotou que não serve pra dama. É esse o problema?

Também não notei onde você diferencia peças normais de damas. Se não existe essa possibilidade, considere já adicioná-la.

Abraço.

Bom dia.

Estou com dificuldade em implementar um metodo para quando a peça for promovida a dama. O metodo moverPecaCorretamente() é regrado a mover uma peça com um limite de casas, e a dama têm um limite bem maior.
Então, estou com dificuldade nesta parte.

E se você usar um caractere diferente para a dama?
Atualmente vc usa O para as peças, certo?
Coloca um D (de dama) ou qualquer outra coisa.
E no método de movimentar você pode verificar se é a dama e processar de modo diferente.

1 curtida

<palpiteiro-mode>

Um detalhe é que em um tabuleiro de damas as peças só se movimentam sobre as casas pretas, então metade do tabuleiro não é de fato utilizado.

Sendo assim, você só precisa guardar as posições pretas (ou seja, não precisa ter uma matriz com todas as 64 casas).

Na verdade não entendi para que o tabuleiro precisa ser 10 x 10. E também não está tendo uma diferenciação entre as peças de cada jogador (todas são 'O').

E eu chamaria o método colocarPecaNoTabuleiro dentro do construtor do Tabuleiro. Afinal, faz sentido criar um tabuleiro sem as peças? Eu acho que o mais “lógico” é já colocar as peças na criação do tabuleiro (assim new Tabuleiro() já cria um tabuleiro com as peças no devido lugar). Senão quem cria o tabuleiro tem que lembrar de também colocar as peças para que funcione (a princípio, me parece não fazer sentido criar um tabuleiro sem as peças, mas enfim, veja aí se faz sentido).

</palpiteiro-mode>

2 curtidas

Quando eu criei as classes, eu não sabia nem como eu ia fazer pra colocar as peças no tabuleiro :smile:
Ai fui aprendendo coisa por coisa, depois quando resolver as coisas principais, eu venho e arrumo os detalhes.

Sim, seria otimo.

Mas estou pensando ainda o que vou implementar para considerar uma peça dama. É ai que estou travado kkk

Você tem diversas abordagens possíveis, dependendo da complexidade que quer aplicar, como classes, enums, etc.

Uma abordagem possível, se quiser controlar isso direto na matriz, é usar um números diferentes para indicar peças diferentes (ex: 0 para casa vazia, 1 para casa ocupada por peça normal, 2 para casa ocupada por dama). Assim sua função que verifica se um movimento é válido, terá a informação do tipo da peça, e você poderá criar a verificação de acordo.

Abraço.

2 curtidas