示例#1
0
 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);
 }
示例#2
0
        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);
        }
示例#3
0
        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;
            }
        }
示例#4
0
 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();
 }
示例#5
0
        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);
                }
            }
        }
示例#6
0
        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);
        }
示例#7
0
 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(" ");
     }
 }
示例#8
0
        private bool testeTorreParaRoque(Position pos)
        {
            Piace p = tab.peca(pos);

            return(p != null && p is Tower && p.cor == cor && p.qteMovimentos == 0);
        }
示例#9
0
        private bool podeMover(Position pos)
        {
            Piace p = tab.peca(pos);

            return(p == null || p.cor != this.cor);
        }
示例#10
0
 public void colocarNovaPeca(char coluna, int linha, Piace peca)
 {
     tab.colocarPeca(peca, new PositionChass(coluna, linha).toPosicao());
     pecas.Add(peca);
 }
示例#11
0
        public bool podeMover(Position pos)
        {
            Piace p = tab.peca(pos);

            return(p == null || p.cor != cor);
        }
示例#12
0
        private bool existeInimigo(Position pos)
        {
            Piace p = tab.peca(pos);

            return(p != null && p.cor != cor);
        }