Exemplo n.º 1
0
        // Metodo para verificar os possiveis movimentos do Peão Branco e Preto
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas]; // Criar uma matriz de linhas e colunas igual ao do tabuleiro especificado

            Posicao posicao = new Posicao(0, 0);

            if (Cor == Cor.Branca)
            {
                posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna); // Peça branca só anda para cima
                if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao))    // Se a posição está ok e está livre
                {
                    matriz[posicao.Linha, posicao.Coluna] = true;

                    if (QtdMovimentos == 0)
                    {
                        posicao.DefinirValores(Posicao.Linha - 2, Posicao.Coluna);
                        if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao))    // Se a posição está ok e está livre e se for o primeiro movimento do peão
                        {
                            matriz[posicao.Linha, posicao.Coluna] = true;
                        }
                    }
                }

                // Verificar o lado superior esquerdo se existe inimigo

                posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
                if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao))
                {
                    matriz[posicao.Linha, posicao.Coluna] = true;
                }

                // Verificar o lado superior direito se existe inimigo

                posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
                if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao))
                {
                    matriz[posicao.Linha, posicao.Coluna] = true;
                }

                // En Passant

                if (Posicao.Linha == 3)  // o en passant da branca só acontece na linha 3, contando de cima para baixo
                {
                    Posicao posicaoEsquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    if (Tabuleiro.TestarPosicao(posicaoEsquerda) && ExisteInimigo(posicaoEsquerda) && Tabuleiro.Peca(posicaoEsquerda) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel
                    {
                        matriz[posicaoEsquerda.Linha - 1, posicaoEsquerda.Coluna] = true;
                    }
                    Posicao posicaoDireita = new Posicao(posicao.Linha, posicao.Coluna + 1);
                    if (Tabuleiro.TestarPosicao(posicaoDireita) && ExisteInimigo(posicaoDireita) && Tabuleiro.Peca(posicaoDireita) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel
                    {
                        matriz[posicaoDireita.Linha - 1, posicaoDireita.Coluna] = true;
                    }
                }
            }

            else
            {
                posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna); // Peça branca só anda para baixo
                if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao))    // Se a posição está ok e está livre
                {
                    matriz[posicao.Linha, posicao.Coluna] = true;

                    if (QtdMovimentos == 0)
                    {
                        posicao.DefinirValores(Posicao.Linha + 2, Posicao.Coluna);
                        if (Tabuleiro.TestarPosicao(posicao) && Livre(posicao))    // Se a posição está ok e está livre e se for o primeiro movimento do peão
                        {
                            matriz[posicao.Linha, posicao.Coluna] = true;
                        }
                    }
                }

                // Verificar o lado superior esquerdo se existe inimigo

                posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
                if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao))
                {
                    matriz[posicao.Linha, posicao.Coluna] = true;
                }

                // Verificar o lado superior direito se existe inimigo

                posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
                if (Tabuleiro.TestarPosicao(posicao) && ExisteInimigo(posicao))
                {
                    matriz[posicao.Linha, posicao.Coluna] = true;
                }

                // En Passant

                if (Posicao.Linha == 4) // o en passant da preta só acontece na linha 4, contando de cima para baixo
                {
                    Posicao posicaEsquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    if (Tabuleiro.TestarPosicao(posicaEsquerda) && ExisteInimigo(posicaEsquerda) && Tabuleiro.Peca(posicaEsquerda) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel
                    {
                        matriz[posicaEsquerda.Linha + 1, posicaEsquerda.Coluna] = true;
                    }
                    Posicao posicaoDireita = new Posicao(posicao.Linha, posicao.Coluna + 1);
                    if (Tabuleiro.TestarPosicao(posicaoDireita) && ExisteInimigo(posicaoDireita) && Tabuleiro.Peca(posicaoDireita) == Partida.VulneravelEnPassant) // Testa se a posição é valida, se tem um inimigo la e se a peca é a peca que está vulneravel, no caso somente o peao pode ficar vulneravel
                    {
                        matriz[posicaoDireita.Linha + 1, posicaoDireita.Coluna] = true;
                    }
                }
            }

            return(matriz);
        }
Exemplo n.º 2
0
        public bool PodeMover(Posicao pos)
        {
            Peca p = Tabuleiro.Peca(pos);

            return(p == null || p.Cor != Cor);
        }
Exemplo n.º 3
0
        private bool TesteTorreParaRoque(Posicao posicao)
        {
            Peca peca = Tabuleiro.Peca(posicao);

            return(peca != null && peca is Torre && peca.Cor == Cor && peca.QtdMovimentos == 0);
        }
Exemplo n.º 4
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] movimentosPossiveis = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];
            Posicao p = new Posicao(0, 0);

            if (Cor == Cor.Branca)
            {
                p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p))
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                p.DefinirValores(Posicao.Linha - 2, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p) && QuantidadeMovimentos == 0)
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
                if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p))
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
                if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p))
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                //Jogada Especial En Passant
                if (Posicao.Linha == 3)
                {
                    Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    Posicao direita  = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(esquerda) && ExisteAdversario(esquerda) && Tabuleiro.Peca(esquerda) == _partida.VulneravelEnPassant)
                    {
                        movimentosPossiveis[esquerda.Linha - 1, esquerda.Coluna] = true;
                    }
                    if (Tabuleiro.PosicaoValida(direita) && ExisteAdversario(direita) && Tabuleiro.Peca(direita) == _partida.VulneravelEnPassant)
                    {
                        movimentosPossiveis[direita.Linha - 1, direita.Coluna] = true;
                    }
                }
            }
            else
            {
                p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p))
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                p.DefinirValores(Posicao.Linha + 2, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(p) && PosicaoLivre(p) && QuantidadeMovimentos == 0)
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
                if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p))
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
                if (Tabuleiro.PosicaoValida(p) && ExisteAdversario(p))
                {
                    movimentosPossiveis[p.Linha, p.Coluna] = true;
                }

                //Jogada Especial En Passant
                if (Posicao.Linha == 4)
                {
                    Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    Posicao direita  = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(esquerda) && ExisteAdversario(esquerda) && Tabuleiro.Peca(esquerda) == _partida.VulneravelEnPassant)
                    {
                        movimentosPossiveis[esquerda.Linha + 1, esquerda.Coluna] = true;
                    }
                    if (Tabuleiro.PosicaoValida(direita) && ExisteAdversario(direita) && Tabuleiro.Peca(direita) == _partida.VulneravelEnPassant)
                    {
                        movimentosPossiveis[direita.Linha + 1, direita.Coluna] = true;
                    }
                }
            }


            return(movimentosPossiveis);
        }
Exemplo n.º 5
0
 private bool Livre(Posicao pos)
 {
     return(Tabuleiro.Peca(pos) == null);
 }
        private bool TesteTorreParaRoque(Posicao pos)
        {
            Peca p = Tabuleiro.Peca(pos);

            return(p != null && p is Torre && p.Cor == Cor && p.QuantidadeDeMovimentos == 0);
        }
Exemplo n.º 7
0
        private bool ExisteAdversario(Posicao posicaoDesejada)
        {
            Peca pecaPosicaoDesejada = Tabuleiro.Peca(posicaoDesejada);

            return(pecaPosicaoDesejada != null && pecaPosicaoDesejada.Cor != Cor);
        }
Exemplo n.º 8
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] movimentosPossiveis = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];
            Posicao p = new Posicao(0, 0);

            //Norte
            p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Linha -= 1;
            }

            //Leste
            p.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Coluna += 1;
            }

            //Sul
            p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Linha += 1;
            }

            //Oeste
            p.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Coluna -= 1;
            }

            //Nordeste
            p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Linha  -= 1;
                p.Coluna += 1;
            }

            //Sudeste
            p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Linha  += 1;
                p.Coluna += 1;
            }

            //Sudoeste
            p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Linha  += 1;
                p.Coluna -= 1;
            }

            //Noroeste
            p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
                if (Tabuleiro.Peca(p) != null && Tabuleiro.Peca(p).Cor != Cor)
                {
                    break;
                }
                p.Linha  -= 1;
                p.Coluna -= 1;
            }

            return(movimentosPossiveis);
        }
Exemplo n.º 9
0
        private bool PodeMover(Posicao posicaoDesejada)
        {
            Peca pecaMovida = Tabuleiro.Peca(posicaoDesejada);

            return(pecaMovida == null || pecaMovida.Cor != Cor);
        }
Exemplo n.º 10
0
        private bool TesteTorreRoque(Posicao posicaoTorre)
        {
            Peca torre = Tabuleiro.Peca(posicaoTorre);

            return(torre != null && torre is Torre && torre.Cor == Cor && torre.QuantidadeMovimentos == 0);
        }
Exemplo n.º 11
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] movimentosPossiveis = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];
            Posicao p = new Posicao(0, 0);

            //Norte
            p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //Nordeste
            p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //Leste
            p.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //Sudeste
            p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //Sul
            p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //Sudoeste
            p.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //Oeste
            p.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //Noroeste
            p.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentosPossiveis[p.Linha, p.Coluna] = true;
            }

            //#Jogada Especial Roque
            if (QuantidadeMovimentos == 0 && _partida.Xeque == false)
            {
                //Pequeno
                Posicao posicaoTorreCurta = new Posicao(Posicao.Linha, Posicao.Coluna + 3);
                if (TesteTorreRoque(posicaoTorreCurta))
                {
                    Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2);
                    if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null)
                    {
                        movimentosPossiveis[Posicao.Linha, Posicao.Coluna + 2] = true;
                    }
                }
                //Grande
                Posicao posicaoTorreLonga = new Posicao(Posicao.Linha, Posicao.Coluna - 4);
                if (TesteTorreRoque(posicaoTorreLonga))
                {
                    Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2);
                    Posicao p3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3);
                    if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null && Tabuleiro.Peca(p3) == null)
                    {
                        movimentosPossiveis[Posicao.Linha, Posicao.Coluna - 2] = true;
                    }
                }
            }
            return(movimentosPossiveis);
        }
Exemplo n.º 12
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            Posicao pos = new Posicao(0, 0);

            //acima
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor)
                {
                    break;
                }
                pos.Linha = pos.Linha - 1;
            }

            //abaixo
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor)
                {
                    break;
                }
                pos.Linha = pos.Linha + 1;
            }

            //direita
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor)
                {
                    break;
                }
                pos.Coluna = pos.Coluna + 1;
            }

            //esquerda
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != this.Cor)
                {
                    break;
                }
                pos.Coluna = pos.Coluna - 1;
            }

            //Noroeste
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha - 1, pos.Coluna - 1);
            }

            //Nordeste
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha - 1, pos.Coluna + 1);
            }

            //Sudeste
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha + 1, pos.Coluna + 1);
            }

            //Sudoeste
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha + 1, pos.Coluna - 1);
            }

            return(mat);
        }
Exemplo n.º 13
0
        public void Jogada(Posicao origem, Posicao destino)
        {
            Peca captura = MoverPeca(origem, destino);

            if (EmXeque(JogadorAtual))
            {
                ReverterJogada(origem, destino, captura);
                throw new TabuleiroException("Impossível se colocar em cheque!");
            }

            Peca p = Tabuleiro.Peca(destino);

            //PROMOÇÃO DE PEÇA
            if (p is Peao)
            {
                if (p.Cor == Cor.Branco && destino.Linha == 0 || p.Cor == Cor.Preto && destino.Linha == 7)
                {
                    Console.WriteLine();
                    Console.WriteLine("Possível promoção!");
                    Console.Write("Escolha [T]Torre, [B]Bispo, [C]Cavalo ou [D]Dama: ");
                    string promo = Console.ReadLine().ToLower();

                    switch (promo)
                    {
                    case "t":
                        Peca T = new Torre(Tabuleiro, p.Cor);
                        Tabuleiro.RetirarPeca(destino);
                        pecas.Remove(p);
                        Tabuleiro.ColocarPeca(T, destino);
                        pecas.Add(T);
                        break;

                    case "b":
                        Peca B = new Bispo(Tabuleiro, p.Cor);
                        Tabuleiro.RetirarPeca(destino);
                        pecas.Remove(p);
                        Tabuleiro.ColocarPeca(B, destino);
                        pecas.Add(B);
                        break;

                    case "c":
                        Peca C = new Cavalo(Tabuleiro, p.Cor);
                        Tabuleiro.RetirarPeca(destino);
                        pecas.Remove(p);
                        Tabuleiro.ColocarPeca(C, destino);
                        pecas.Add(C);
                        break;

                    case "d":
                        Peca D = new Dama(Tabuleiro, p.Cor);
                        Tabuleiro.RetirarPeca(destino);
                        pecas.Remove(p);
                        Tabuleiro.ColocarPeca(D, destino);
                        pecas.Add(D);
                        break;
                    }
                }
            }

            if (EmXeque(GetCorAdversaria(JogadorAtual)))
            {
                JogadorEmXeque = true;
            }

            else
            {
                JogadorEmXeque = false;
            }

            if (XequeMate(GetCorAdversaria(JogadorAtual)))
            {
                Finalizada = true;
            }

            else
            {
                Turno++;
                MudarJogador();
            }

            //EN PASSANT
            if (p is Peao && (destino.Linha == origem.Linha + 2 || destino.Linha == origem.Linha - 2))
            {
                EnPassant = p;
            }
            else
            {
                EnPassant = null;
            }
        }
Exemplo n.º 14
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] movimentos = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            Posicao p = new Posicao(Posicao.Linha, Posicao.Coluna);

            //ACIMA(PEÇAS BRANCAS)
            if (Cor == Cor.Branco)
            {
                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                p.SetPosicao(p.Linha - 1, p.Coluna);
                if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
                {
                    movimentos[p.Linha, p.Coluna] = true;

                    p.SetPosicao(p.Linha - 1, p.Coluna);
                    if (Tabuleiro.PosicaoValida(p) && PodeMover(p) && QtdeMovimentos == 0)
                    {
                        movimentos[p.Linha, p.Coluna] = true;
                    }
                }

                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                p.SetPosicao(p.Linha - 1, p.Coluna - 1);
                if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Preto && PodeMover(p))
                {
                    movimentos[p.Linha, p.Coluna] = true;
                }

                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                p.SetPosicao(p.Linha - 1, p.Coluna + 1);
                if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Preto && PodeMover(p))
                {
                    movimentos[p.Linha, p.Coluna] = true;
                }

                //En Passant Branca

                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                if (p.Linha == 3)
                {
                    Posicao esquerda = new Posicao(p.Linha, p.Coluna - 1);
                    if (Tabuleiro.PosicaoValida(esquerda) && Tabuleiro.ExistePeca(esquerda) && Tabuleiro.Peca(esquerda).Cor == Cor.Preto &&
                        Tabuleiro.Peca(esquerda) == partida.EnPassant)
                    {
                        movimentos[esquerda.Linha - 1, esquerda.Coluna] = true;
                    }

                    Posicao direita = new Posicao(p.Linha, p.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(direita) && Tabuleiro.ExistePeca(direita) && Tabuleiro.Peca(direita).Cor == Cor.Preto &&
                        Tabuleiro.Peca(direita) == partida.EnPassant)
                    {
                        movimentos[direita.Linha - 1, direita.Coluna] = true;
                    }
                }
            }

            //ABAIXO(PEÇAS PRETAS)
            else if (Cor == Cor.Preto)
            {
                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                p.SetPosicao(p.Linha + 1, p.Coluna);
                if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
                {
                    movimentos[p.Linha, p.Coluna] = true;

                    p.SetPosicao(p.Linha + 1, p.Coluna);
                    if (Tabuleiro.PosicaoValida(p) && PodeMover(p) && QtdeMovimentos == 0)
                    {
                        movimentos[p.Linha, p.Coluna] = true;
                    }
                }

                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                p.SetPosicao(p.Linha + 1, p.Coluna - 1);
                if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Branco && PodeMover(p))
                {
                    movimentos[p.Linha, p.Coluna] = true;
                }

                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                p.SetPosicao(p.Linha + 1, p.Coluna + 1);
                if (Tabuleiro.PosicaoValida(p) && Tabuleiro.ExistePeca(p) && Tabuleiro.Peca(p).Cor == Cor.Branco && PodeMover(p))
                {
                    movimentos[p.Linha, p.Coluna] = true;
                }

                //En Passant Preta

                p.SetPosicao(Posicao.Linha, Posicao.Coluna);
                if (p.Linha == 4)
                {
                    Posicao esquerda = new Posicao(p.Linha, p.Coluna - 1);
                    if (Tabuleiro.PosicaoValida(esquerda) && Tabuleiro.ExistePeca(esquerda) && Tabuleiro.Peca(esquerda).Cor == Cor.Branco &&
                        Tabuleiro.Peca(esquerda) == partida.EnPassant)
                    {
                        movimentos[esquerda.Linha + 1, esquerda.Coluna] = true;
                    }

                    Posicao direita = new Posicao(p.Linha, p.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(direita) && Tabuleiro.ExistePeca(direita) && Tabuleiro.Peca(direita).Cor == Cor.Branco &&
                        Tabuleiro.Peca(direita) == partida.EnPassant)
                    {
                        movimentos[direita.Linha + 1, direita.Coluna] = true;
                    }
                }
            }
            return(movimentos);
        }
Exemplo n.º 15
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            // Verificação das possíveis posições de movimentação desta peça (Rei)
            Posicao pos = new Posicao(0, 0);

            // Rainha = Movimentos da Torre + Movimentos do Bisco

            // Movimentos da Torre:
            // Acima
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha--;
            }
            // Lateral direita
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Coluna++;
            }
            // Abaixo
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha++;
            }
            // Lateral esquerda
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Coluna--;
            }

            // Movimentos do Bispo:
            // Diagonal superior direita (Nordeste)
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha--;
                pos.Coluna++;
            }

            // Diagonal inferior direita (Sudeste)
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha++;
                pos.Coluna++;
            }

            // Diagonal inferior esquerda (Sudoeste)
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha++;
                pos.Coluna--;
            }

            // Diagonal superior esquerda (Noroeste)
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matriz[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha--;
                pos.Coluna--;
            }

            return(matriz);
        }
Exemplo n.º 16
0
        private bool TorreElegivelRoque(Posicao P)
        {
            Peca T = Tabuleiro.Peca(P);

            return(T != null && T is Torre && T.QtdeMovimentos == 0 && T.Cor == Cor);
        }
Exemplo n.º 17
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            Posicao pos = new Posicao(0, 0);

            //acima
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);

            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;

                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }

                pos.Linha -= 1; // faz subir a linha
            }

            //abaixo
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);

            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;

                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }

                pos.Linha += 1; // faz descer a linha
            }

            //direita
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);

            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;

                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }

                pos.Coluna += 1; // faz ir a direita
            }

            //esquerda
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);

            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;

                if (Tabuleiro.Peca(pos) != null && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }

                pos.Coluna -= 1; // faz ir a esquerda
            }

            return(mat);
        }
Exemplo n.º 18
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] movimentos = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];
            Posicao inicial = Posicao;
            Posicao p       = new Posicao(Posicao.Linha, Posicao.Coluna);

            //N
            p.SetPosicao(p.Linha - 1, p.Coluna);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            ////NE
            p.SetPosicao(Posicao.Linha, Posicao.Coluna);
            p.SetPosicao(p.Linha - 1, p.Coluna + 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            //L
            p.SetPosicao(Posicao.Linha, Posicao.Coluna);
            p.SetPosicao(p.Linha, p.Coluna + 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            //SE
            p.SetPosicao(Posicao.Linha, Posicao.Coluna);
            p.SetPosicao(p.Linha + 1, p.Coluna + 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            //S
            p.SetPosicao(Posicao.Linha, Posicao.Coluna);
            p.SetPosicao(p.Linha + 1, p.Coluna);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            //SO
            p.SetPosicao(Posicao.Linha, Posicao.Coluna);
            p.SetPosicao(p.Linha + 1, p.Coluna - 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            //O
            p.SetPosicao(Posicao.Linha, Posicao.Coluna);
            p.SetPosicao(p.Linha, p.Coluna - 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            //NO
            p.SetPosicao(Posicao.Linha, Posicao.Coluna);
            p.SetPosicao(p.Linha - 1, p.Coluna - 1);
            if (Tabuleiro.PosicaoValida(p) && PodeMover(p))
            {
                movimentos[p.Linha, p.Coluna] = true;
            }

            //ROQUE PEQUENO
            if (QtdeMovimentos == 0 && !partida.JogadorEmXeque)
            {
                Posicao T1 = new Posicao(this.Posicao.Linha, this.Posicao.Coluna + 3);
                if (Tabuleiro.PosicaoValida(T1) && TorreElegivelRoque(T1))
                {
                    Posicao P1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    Posicao P2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2);

                    if (Tabuleiro.PosicaoValida(P1) && Tabuleiro.PosicaoValida(P2))
                    {
                        if (Tabuleiro.Peca(P1) == null && Tabuleiro.Peca(P2) == null)
                        {
                            movimentos[Posicao.Linha, Posicao.Coluna + 2] = true;
                        }
                    }
                }
            }

            ////ROQUE GRANDE
            if (QtdeMovimentos == 0 && !partida.JogadorEmXeque)
            {
                Posicao T2 = new Posicao(Posicao.Linha, Posicao.Coluna - 4);
                if (Tabuleiro.PosicaoValida(T2) && TorreElegivelRoque(T2))
                {
                    Posicao P1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    Posicao P2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2);
                    Posicao P3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3);
                    if (Tabuleiro.PosicaoValida(P1) && Tabuleiro.PosicaoValida(P2) && Tabuleiro.PosicaoValida(P3))
                    {
                        if (Tabuleiro.Peca(P1) == null && Tabuleiro.Peca(P2) == null && Tabuleiro.Peca(P3) == null)
                        {
                            movimentos[Posicao.Linha, Posicao.Coluna - 2] = true;
                        }
                    }
                }
            }

            return(movimentos);
        }
Exemplo n.º 19
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            Posicao posicao = new Posicao(0, 0);

            // Esquerda
            posicao.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha, posicao.Coluna - 1);
            }

            // Direita
            posicao.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha, posicao.Coluna + 1);
            }

            // Acima
            posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha - 1, posicao.Coluna);
            }

            // Abaixo
            posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha + 1, posicao.Coluna);
            }

            // Noroeste
            posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha - 1, posicao.Coluna - 1);
            }

            // Nordeste
            posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha - 1, posicao.Coluna + 1);
            }

            // Sudeste
            posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha + 1, posicao.Coluna + 1);
            }

            // Sudoeste
            posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;

                if (Tabuleiro.Peca(posicao) != null && Tabuleiro.Peca(posicao).Cor != Cor)
                {
                    break;
                }

                posicao.DefinirValores(posicao.Linha + 1, posicao.Coluna - 1);
            }

            return(matriz);
        }
Exemplo n.º 20
0
        private bool podeMover(Posicao pos)
        {
            Peca p = Tabuleiro.Peca(pos);

            return(p == null || p.Cor != Cor);
        }
Exemplo n.º 21
0
 private bool PosicaoLivre(Posicao posicaoDesejada)
 {
     return(Tabuleiro.Peca(posicaoDesejada) == null);
 }
Exemplo n.º 22
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] matrizDeMovimentos = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];
            Posicao pos = new Posicao(0, 0);

            //Esquerda
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Coluna--;
            }

            //Direita
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Coluna++;
            }

            //Acima
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha--;
            }

            //Abaixo
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.Linha++;
            }

            //NO
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha - 1, pos.Coluna - 1);
            }

            //NE
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha - 1, pos.Coluna + 1);
            }

            //SE
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha + 1, pos.Coluna + 1);
            }

            //SO
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            while (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                matrizDeMovimentos[pos.Linha, pos.Coluna] = true;
                if (Tabuleiro.ExistePeca(pos) && Tabuleiro.Peca(pos).Cor != Cor)
                {
                    break;
                }
                pos.DefinirValores(pos.Linha + 1, pos.Coluna - 1);
            }

            return(matrizDeMovimentos);
        }
Exemplo n.º 23
0
        private bool ExisteInimigo(Posicao pos)
        {
            Peca p = Tabuleiro.Peca(pos);

            return(p != null && p.Cor != this.Cor);
        }
Exemplo n.º 24
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            Posicao pos = new Posicao(0, 0);

            // acima
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // nordeste
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // direita
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // sudeste
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // abaixo
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // sudoeste
            pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // esquerda
            pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // nordeste
            pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(pos) && PodeMover(pos))
            {
                mat[pos.Linha, pos.Coluna] = true;
            }

            // #jogadaespecial roque
            if (QuantidadeMovimentos == 0 && !partida.Xeque)
            {
                // #jogadaespecial roque pequeno
                Posicao posT1 = new Posicao(Posicao.Linha, Posicao.Coluna + 3);
                if (TesteTorreParaRoque(posT1))
                {
                    Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2);
                    if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null)
                    {
                        mat[Posicao.Linha, Posicao.Coluna + 2] = true;
                    }
                }
                // #jogadaespecial roque grande
                Posicao posT2 = new Posicao(Posicao.Linha, Posicao.Coluna - 4);
                if (TesteTorreParaRoque(posT2))
                {
                    Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2);
                    Posicao p3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3);
                    if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null && Tabuleiro.Peca(p3) == null)
                    {
                        mat[Posicao.Linha, Posicao.Coluna - 2] = true;
                    }
                }
            }

            return(mat);
        }
Exemplo n.º 25
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] mat = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            Posicao pos = new Posicao(0, 0);

            if (Cor == Cor.Branca)
            {
                pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(pos) && Livre(pos))
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha - 2, Posicao.Coluna);
                Posicao p2 = new Posicao(Posicao.Linha - 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(p2) && Livre(p2) && Tabuleiro.PosicaoValida(pos) && Livre(pos) && QtdMovimentos == 0)
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }

                // enpassant
                if (Posicao.Linha == 3)
                {
                    Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    if (Tabuleiro.PosicaoValida(esquerda) && ExisteInimigo(esquerda) && Tabuleiro.Peca(esquerda) == partida.VulveravelEnPassant)
                    {
                        mat[esquerda.Linha - 1, esquerda.Coluna] = true;
                    }
                    Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(direita) && ExisteInimigo(direita) && Tabuleiro.Peca(direita) == partida.VulveravelEnPassant)
                    {
                        mat[direita.Linha - 1, direita.Coluna] = true;
                    }
                }
            }
            else
            {
                pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(pos) && Livre(pos))
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha + 2, Posicao.Coluna);
                Posicao p2 = new Posicao(Posicao.Linha + 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(p2) && Livre(p2) && Tabuleiro.PosicaoValida(pos) && Livre(pos) && QtdMovimentos == 0)
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    mat[pos.Linha, pos.Coluna] = true;
                }
                // enpassant
                if (Posicao.Linha == 4)
                {
                    Posicao esquerda = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    if (Tabuleiro.PosicaoValida(esquerda) && ExisteInimigo(esquerda) && Tabuleiro.Peca(esquerda) == partida.VulveravelEnPassant)
                    {
                        mat[esquerda.Linha + 1, esquerda.Coluna] = true;
                    }
                    Posicao direita = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(direita) && ExisteInimigo(direita) && Tabuleiro.Peca(direita) == partida.VulveravelEnPassant)
                    {
                        mat[direita.Linha + 1, direita.Coluna] = true;
                    }
                }
            }


            return(mat);
        }
Exemplo n.º 26
0
        private bool ExisteInimigo(Posicao posicao)
        {
            Peca peca = Tabuleiro.Peca(posicao);

            return(peca != null && peca.Cor != Cor);
        }
Exemplo n.º 27
0
        private bool PodeMover(Posicao posicao)
        {
            Peca peca = Tabuleiro.Peca(posicao);

            return(peca == null || peca.Cor != Cor);
        }
Exemplo n.º 28
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            // Verificação das possíveis posições de movimentação desta peça (Rei)
            Posicao pos = new Posicao(0, 0);

            // Peao só anda pra "frente"

            // Se a cor for Branca só ando para as linhas menores
            if (Cor == Cor.Branca)
            {
                // O Peão só captura peças laterais, portando só ando para frente se tiver Livre
                pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos))
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha - 2, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos) && QtdeMovimentos == 0)  // Na 1ª jogada o Peao pode andar 2 casas
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }

                // O Peão só captura peças laterais, portando ando para a lateral se tiver Inimigo
                pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }
                // #JogadaEspecial EnPassant
                if (Posicao.Linha == 3)
                {
                    pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
                    if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant)
                    {
                        matriz[Posicao.Linha - 1, Posicao.Coluna - 1] = true;
                    }

                    pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant)
                    {
                        matriz[Posicao.Linha - 1, Posicao.Coluna + 1] = true;
                    }
                }
            }
            else
            {
                // O Peão só captura peças laterais, portando só ando para frente se tiver Livre
                pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos))
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha + 2, Posicao.Coluna);
                if (Tabuleiro.PosicaoValida(pos) && PosicaoLivre(pos) && QtdeMovimentos == 0)  // Na 1ª jogada o Peao pode andar 2 casas
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }

                // O Peão só captura peças laterais, portando ando para a lateral se tiver Inimigo
                pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }
                pos.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
                if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos))
                {
                    matriz[pos.Linha, pos.Coluna] = true;
                }
                // #JogadaEspecial EnPassant
                if (Posicao.Linha == 4)
                {
                    pos.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
                    if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant)
                    {
                        matriz[Posicao.Linha + 1, Posicao.Coluna - 1] = true;
                    }

                    pos.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
                    if (Tabuleiro.PosicaoValida(pos) && ExisteInimigo(pos) && Tabuleiro.Peca(pos) == _partida.VulneravemEnPassant)
                    {
                        matriz[Posicao.Linha + 1, Posicao.Coluna + 1] = true;
                    }
                }
            }

            return(matriz);
        }
Exemplo n.º 29
0
        public override bool[,] MovimentosPossiveis()
        {
            bool[,] matriz = new bool[Tabuleiro.Linhas, Tabuleiro.Colunas];

            Posicao posicao = new Posicao(0, 0);

            // Acima
            posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // Nordeste
            posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // Direita
            posicao.DefinirValores(Posicao.Linha, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // Sudeste
            posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna + 1);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // Abaixo
            posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // Sudoeste
            posicao.DefinirValores(Posicao.Linha + 1, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // Esquerda
            posicao.DefinirValores(Posicao.Linha, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // Noroestes
            posicao.DefinirValores(Posicao.Linha - 1, Posicao.Coluna - 1);
            if (Tabuleiro.PosicaoValida(posicao) && PodeMover(posicao))
            {
                matriz[posicao.Linha, posicao.Coluna] = true;
            }

            // #jogadaespecial Roque
            if (QtdMovimentos == 0 && !Partida.Xeque)
            {
                // #jogadaespecial Roque Pequeno
                Posicao posicaoTorreRoquePequeno = new Posicao(Posicao.Linha, Posicao.Coluna + 3);

                if (TesteTorreParaRoque(posicaoTorreRoquePequeno))
                {
                    Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna + 1);
                    Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna + 2);

                    if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null)
                    {
                        matriz[Posicao.Linha, Posicao.Coluna + 2] = true;
                    }
                }

                // #jogadaespecial Roque Grande
                Posicao posicaoTorreRoqueGrande = new Posicao(Posicao.Linha, Posicao.Coluna - 4);

                if (TesteTorreParaRoque(posicaoTorreRoqueGrande))
                {
                    Posicao p1 = new Posicao(Posicao.Linha, Posicao.Coluna - 1);
                    Posicao p2 = new Posicao(Posicao.Linha, Posicao.Coluna - 2);
                    Posicao p3 = new Posicao(Posicao.Linha, Posicao.Coluna - 3);

                    if (Tabuleiro.Peca(p1) == null && Tabuleiro.Peca(p2) == null && Tabuleiro.Peca(p3) == null)
                    {
                        matriz[Posicao.Linha, Posicao.Coluna - 2] = true;
                    }
                }
            }

            return(matriz);
        }
Exemplo n.º 30
0
 private bool Livre(Posicao posicao)
 {
     return(Tabuleiro.Peca(posicao) == null);   // Tem peça naquela possição?, se null true, não tem peça, se false false, tem peça
 }