- Sobre o projeto
- Sobre o tabuleiro
- Impressão do tabuleiro no console
- A exceção tabuleiroException
- Sobre as peças
- Peças presentes no tabuleiro
- Método para colocar as peças no tabuleiro
- Como foi criada a restrição de movimento para cada peça
- Validar posição de origem
- Validar posição de destino
- Jogadas especiais
- Contato
Este projeto foi feito durante o curso de C# ministrado por Nélio Alves. O objetivo central é empregar os conhecimentos adquiridos na linguagem C# para desenvolver um jogo de Xadrez funcional que possa ser executado via console. Embora possa parecer uma tarefa simples à primeira vista, a complexidade subjacente a este projeto é significativa.
A impressão do tabuleiro foi uma parte simples, porém essencial, do projeto. Utilizou-se um loop for para criar uma representação visual do tabuleiro no console, composta por um padrão de "-" com espaços entre eles, formando um tabuleiro de oito por oito casas, totalizando sessenta e quatro espaços, conforme o tamanho padrão de um tabuleiro de Xadrez.
public static void imprimirTabuleiro(Tabuleiro tab, bool[,] posicoesPossiveis)
{
ConsoleColor fundoOriginal = Console.BackgroundColor;
ConsoleColor fundoAlterado = ConsoleColor.DarkGray;
for (int i = 0; i < tab.linhas; i++)
{
Console.Write(8 - i + " ");
for (int j = 0; j < tab.colunas; j++)
{
if (posicoesPossiveis[i, j])
{
Console.BackgroundColor = fundoAlterado;
}
else
{
Console.BackgroundColor = fundoOriginal;
}
imprimirPeca(tab.peca(i, j));
Console.BackgroundColor = fundoOriginal;
}
Console.WriteLine();
}
Console.WriteLine(" a b c d e f g h");
Console.BackgroundColor = fundoOriginal;
}
Com o resultado final:
Durante o desenvolvimento do jogo, foi essencial criar uma exceção específica para lidar com situações em que uma casa inválida é selecionada pelo jogador. Essa exceção é chamada TabuleiroException
.
- Quando não existe uma peça na posição de origem selecionada:
throw new TabuleiroException("Não existe peça na posição de origem escolhida!");
- Quando a peça selecionada não pertence ao jogador atual:
throw new TabuleiroException("A peça de origem escolhida não é sua!");
- Quando não há movimentos possíveis para a peça selecionada:
throw new TabuleiroException("Atencao: Não há movimentos possíveis para a peça de origem escolhida!");
- Quando a posição de destino escolhida é inválida:
throw new TabuleiroException("Posição de destino inválida!");
Essa exceção é fundamental para manter a integridade e a lógica do jogo, garantindo que o jogador receba feedback adequado caso tente realizar movimentos inválidos.
No tabuleiro de Xadrez, existem diferentes tipos de peças, cada uma com suas próprias características e movimentos específicos. Abaixo estão as peças presentes no jogo, indicando a quantidade de peças de cada tipo e como são representadas:
- Rei: Uma única peça de cada cor (branca e preta), representada pela letra R.
- Dama: Uma única peça de cada cor (branca e preta), representada pela letra D.
- Bispo: Duas peças de cada cor (branca e preta), representadas pela letra B.
- Cavalo: Uma única peça de cada cor (branca e preta), representada pela letra C.
- Torre: Uma única peça de cada cor (branca e preta), representada pela letra T.
- Peão: Oito peças de cada cor (branca e preta), representadas pela letra P.
Essas peças compõem o conjunto básico do Xadrez e cada uma desempenha um papel fundamental na estratégia e na dinâmica do jogo.
Imagem do tabuleiro com as peças:
Durante o desenvolvimento do jogo de Xadrez em C#, foi implementado um método para colocar novas peças em posições específicas do tabuleiro. Esse método é essencial para configurar o tabuleiro com as peças necessárias para iniciar uma partida.
Aqui está o método colocarNovaPeca
:
public void colocarNovaPeca(char coluna, int linha, Peca peca)
{
tab.colocarPeca(peca, new PosicaoXadrez(coluna, linha).toPosicao());
pecas.Add(peca);
}
Este método recebe três parâmetros:
coluna
: A coluna onde a peça será colocada, representada por um caractere.linha
: A linha onde a peça será colocada, representada por um número.peca
: A peça que será colocada no tabuleiro.
Internamente, o método converte a posição da peça (coluna
e linha
) em uma posição de matriz utilizando a classe PosicaoXadrez
e, em seguida, utiliza o método colocarPeca
do tabuleiro para colocar a peça na posição desejada. Além disso, a peça é adicionada à lista de peças (pecas
) para acompanhamento e controle durante a partida.
Esse método é crucial para configurar o tabuleiro com as peças necessárias para iniciar o jogo de Xadrez, permitindo que as partidas sejam inicializadas com qualquer disposição desejada das peças.
- Converte a posição informada (coluna e linha) em uma posição válida do tabuleiro, utilizando a classe
PosicaoXadrez
e seu métodotoPosicao()
. - Coloca a peça na posição calculada no passo anterior, utilizando o método
colocarPeca
do objetotabuleiro
. - Adiciona a peça à lista de peças (
pecas
).
Este método é essencial para configurar o tabuleiro com as peças corretas antes do início de uma partida de Xadrez.
Durante o desenvolvimento do jogo de Xadrez em C#, foram criados métodos específicos na classe PartidaXadrez
para validar as posições de origem e destino das peças, aplicando as restrições de movimento adequadas para cada tipo de peça.
Este método é responsável por verificar se a posição de origem selecionada pelo jogador é válida para movimentar uma peça. Ele realiza as seguintes verificações:
- Posição nula: Verifica se não há uma peça na posição de origem escolhida.
if (tab.peca(pos) == null)
{
throw new TabuleiroException("Não existe peça na posição de origem escolhida!");
}
- Cor da peça: Verifica se a peça selecionada pertence ao jogador atual, garantindo que o jogador só possa mover suas próprias peças.
if (jogadorAtual != tab.peca(pos).cor)
{
throw new TabuleiroException("A peça na posição de origem escolhida não é sua!");
}
- Movimentos possíveis: Verifica se a peça selecionada possui movimentos possíveis. Se não houver movimentos disponíveis para a peça selecionada, uma exceção é lançada.
if (!tab.peca(pos).existeMovimentosPossiveis())
{
throw new TabuleiroException("Atencao: Não há movimentos possíveis para a peça de origem escolhida!");
}
Este método é responsável por validar se a posição de destino escolhida pelo jogador é válida para mover a peça selecionada. Ele realiza a seguinte verificação:
- Movimento válido: Verifica se a peça selecionada pode se mover para a posição de destino especificada. Se a peça não puder se mover para a posição de destino, uma exceção é lançada.
if (!tab.peca(origem).movimentoPossivel(destino))
{
throw new TabuleiroException("Posição de destino inválida!");
}
Esses métodos garantem que as peças só possam ser movidas de acordo com as regras do jogo de Xadrez, mantendo a integridade e a lógica do jogo durante as partidas.
Neste tópico, serão detalhadas as jogadas especiais implementadas no jogo de Xadrez em C#.
-
Roque Pequeno: O roque pequeno ocorre quando o rei e uma torre ainda não se moveram na partida, e entre eles existem duas casas vazias. O código para esta jogada especial é o seguinte:
// #jogadaespecial roque pequeno if (p is Rei && destino.coluna == origem.coluna + 2) { Posicao origemT = new Posicao(origem.linha, origem.coluna + 3); Posicao destinoT = new Posicao(origem.linha, origem.coluna + 1); Peca T = tab.retirarPeca(origemT); T.incrementarQteMovimentos(); tab.colocarPeca(T, destinoT); }
-
Roque Grande: O roque grande ocorre quando o rei e uma torre ainda não se moveram na partida, e entre eles existem quatro casas vazias. O código para esta jogada especial é o seguinte:
// #jogadaespecial roque grande if (p is Rei && destino.coluna == origem.coluna - 2) { Posicao origemT = new Posicao(origem.linha, origem.coluna - 4); Posicao destinoT = new Posicao(origem.linha, origem.coluna - 1); Peca T = tab.retirarPeca(origemT); T.incrementarQteMovimentos(); tab.colocarPeca(T, destinoT); }
-
En Passant: O En Passant ocorre quando um peão adversário avança duas casas em seu primeiro movimento para evitar um confronto com um peão avançado. Um peão pode realizar a captura do peão adversário da mesma forma. O código para esta jogada especial é o seguinte:
//#jogadaespecial en passant if (p is Peao) { if (origem.coluna != destino.coluna && pecaCapturada == null) { Posicao posP; if (p.cor == Cor.Branca) { posP = new Posicao(destino.linha + 1, destino.coluna); } else { posP = new Posicao(destino.linha - 1, destino.coluna); } pecaCapturada = tab.retirarPeca(posP); capturadas.Add(pecaCapturada); } }
-
Promoção: A jogada de promoção ocorre quando um peão alcança a última fileira do tabuleiro adversário. Neste caso, virará uma Dama.
// #jogadaespecial promocao if (p is Peao) { if ((p.cor == Cor.Branca && destino.linha == 0) || (p.cor == Cor.Preta && destino.linha == 7)) { p = tab.retirarPeca(destino); pecas.Remove(p); Peca dama = new Dama(tab, p.cor); tab.colocarPeca(dama, destino); pecas.Add(dama); } }
- Email: contatovictorvinicius05@gmail.com
- LinkedIn: Victor Vinicius