public bool testeXequemate(Color cor) { if (!estaEmXeque(cor)) { return(false); } foreach (Piace x in pecasEmJogo(cor)) { bool[,] mat = x.movimentosPossiveis(); for (int i = 0; i < tab.linhas; i++) { for (int j = 0; j < tab.colunas; j++) { if (mat[i, j]) { Position origem = x.posicao; Position destino = new Position(i, j); Piace pecaCapturada = executaMovimento(origem, destino); bool testeXeque = estaEmXeque(cor); desfazMovimento(origem, destino, pecaCapturada); if (!testeXeque) { return(false); } } } } } return(true); }
public Piace executaMovimento(Position origem, Position destino) { Piace p = tab.retirarPeca(origem); p.incrementarQteMovimentos(); Piace pecaCapturada = tab.retirarPeca(destino); tab.colocarPeca(p, destino); if (pecaCapturada != null) { capturadas.Add(pecaCapturada); } // #jogadaespecial roque pequeno if (p is King && destino.coluna == origem.coluna + 2) { Position origemT = new Position(origem.linha, origem.coluna + 3); Position destinoT = new Position(origem.linha, origem.coluna + 1); Piace T = tab.retirarPeca(origemT); T.incrementarQteMovimentos(); tab.colocarPeca(T, destinoT); } // #jogadaespecial roque grande if (p is King && destino.coluna == origem.coluna - 2) { Position origemT = new Position(origem.linha, origem.coluna - 4); Position destinoT = new Position(origem.linha, origem.coluna - 1); Piace T = tab.retirarPeca(origemT); T.incrementarQteMovimentos(); tab.colocarPeca(T, destinoT); } // #jogadaespecial en Passant if (p is Peon) { if (origem.coluna != destino.coluna && pecaCapturada == null) { Position posP; if (p.cor == Color.Branca) { posP = new Position(destino.linha + 1, destino.coluna); } else { posP = new Position(destino.linha - 1, destino.coluna); } pecaCapturada = tab.retirarPeca(posP); capturadas.Add(pecaCapturada); } } return(pecaCapturada); }
public void realizaJogada(Position origem, Position destino) { Piace pecaCapturada = executaMovimento(origem, destino); if (estaEmXeque(jogadorAtual)) { desfazMovimento(origem, destino, pecaCapturada); throw new BoardExceptions("Você não pode se colocar em xeque!"); } Piace p = tab.peca(destino); // #jogadaespecial promocao if (p is Peon) { if ((p.cor == Color.Branca && destino.linha == 0) || (p.cor == Color.Preta && destino.linha == 7)) { p = tab.retirarPeca(destino); pecas.Remove(p); Piace dama = new Queen(tab, p.cor); tab.colocarPeca(dama, destino); pecas.Add(dama); } } if (estaEmXeque(adversaria(jogadorAtual))) { xeque = true; } else { xeque = false; } if (testeXequemate(adversaria(jogadorAtual))) { terminada = true; } else { turno++; mudaJogador(); } // #jogadaespecial en passant if (p is Peon && (destino.linha == origem.linha - 2) || destino.linha == origem.linha + 2) { vulneravelEnPassant = p; } else { vulneravelEnPassant = null; } }
public MatchChess() { tab = new Board(8, 8); turno = 1; jogadorAtual = Color.Branca; terminada = false; xeque = false; vulneravelEnPassant = null; pecas = new HashSet <Piace>(); capturadas = new HashSet <Piace>(); colocarPecas(); }
public void desfazMovimento(Position origem, Position destino, Piace pecaCapturada) { Piace p = tab.retirarPeca(destino); p.decrementarQteMovimentos(); if (pecaCapturada != null) { tab.colocarPeca(pecaCapturada, destino); capturadas.Remove(pecaCapturada); } tab.colocarPeca(p, origem); // #jogadaespecial roque pequeno if (p is King && destino.coluna == origem.coluna + 2) { Position origemT = new Position(origem.linha, origem.coluna + 3); Position destinoT = new Position(origem.linha, origem.coluna + 1); Piace T = tab.retirarPeca(destinoT); T.decrementarQteMovimentos(); tab.colocarPeca(T, origemT); } // #jogadaespecial roque grande if (p is King && destino.coluna == origem.coluna - 2) { Position origemT = new Position(origem.linha, origem.coluna - 4); Position destinoT = new Position(origem.linha, origem.coluna - 1); Piace T = tab.retirarPeca(destinoT); T.incrementarQteMovimentos(); tab.colocarPeca(T, origemT); } // #jogadaespecial en Passant if (p is Peon) { if (origem.coluna != destino.coluna && pecaCapturada == vulneravelEnPassant) { Piace peao = tab.retirarPeca(destino); Position posP; if (p.cor == Color.Branca) { posP = new Position(3, destino.coluna); } else { posP = new Position(4, destino.coluna); } tab.colocarPeca(peao, posP); } } }
public bool estaEmXeque(Color cor) { Piace R = rei(cor); if (R == null) { throw new BoardExceptions("Não tem rei da cor " + cor + " no tabuleiro"); } foreach (Piace x in pecasEmJogo(adversaria(cor))) { bool[,] mat = x.movimentosPossiveis(); if (mat[R.posicao.linha, R.posicao.coluna]) { return(true); } } return(false); }
public static void imprimirPeca(Piace peca) { if (peca == null) { Console.Write("- "); } else { if (peca.cor == Color.Branca) { Console.Write(peca); } else { ConsoleColor aux = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Yellow; Console.Write(peca); Console.ForegroundColor = aux; } Console.Write(" "); } }
private bool testeTorreParaRoque(Position pos) { Piace p = tab.peca(pos); return(p != null && p is Tower && p.cor == cor && p.qteMovimentos == 0); }
private bool podeMover(Position pos) { Piace p = tab.peca(pos); return(p == null || p.cor != this.cor); }
public void colocarNovaPeca(char coluna, int linha, Piace peca) { tab.colocarPeca(peca, new PositionChass(coluna, linha).toPosicao()); pecas.Add(peca); }
public bool podeMover(Position pos) { Piace p = tab.peca(pos); return(p == null || p.cor != cor); }
private bool existeInimigo(Position pos) { Piace p = tab.peca(pos); return(p != null && p.cor != cor); }