Ejemplo n.º 1
0
    protected bool PodeRoque(Torre torre, Rei rei, Tabuleiro tabuleiro, Movimento movrei, Movimento movtorre)
    {
        if (torre == null || rei == null || movrei == null || movtorre == null)
        {
            return(false);
        }
        // lembrando que as condições de roque são:



        // rei não pode ter se movimentado nenhuma vez
        // torre não pode ter se movimentado nenhuma vez
        if (!torre.primeiraJogada || !rei.primeiraJogada)
        {
            //	Debug.Log("NÃO É A PRIMEIRA JOGADA!");
            return(false);
        }


        // nao pode haver peças entre o rei e a torre
        int linha = rei.CasaAtual.PosY;
//		Debug.Log("linha rei:");
//		Debug.Log(linha);
        int torrepos = torre.PosX;
        int reipos   = rei.PosX;
//		Debug.Log("Coluna torre:");
//		Debug.Log(torrepos);
//		Debug.Log("Coluna rei:");
//		Debug.Log(reipos);
        int i, f;

        if (torrepos < reipos)
        {
            //	Debug.Log("a posição entre torre e rei caracteriza um roque maior(ou era para caracterizar)");
            i = torrepos;
            f = reipos;
        }
        else
        {
            //	Debug.Log("a posição entre torre e rei caracteriza um roque menor(ou era para caracterizar)");
            i = reipos;
            f = torrepos;
        }
        for (int p = i + 1; p < f; p++)
        {
            if (tabuleiro.GetCasa(p, linha).EstaOcupada())
            {
                //Debug.Log(p);
                //		Debug.Log("TEM CASAS OCUPADAS NO CAMINHO!");
                return(false);
            }
        }

        // rei nao pode estar em xeque
        if (rei.jDono.EmXeque(false))
        {
            //	Debug.Log("Rei está em xeque!");
            return(false);
        }

        // rei não pode passar nem terminar em uma casa que está sendo atacada por peça adversaria(rei entraria em xeque)
        //dependendo de quem se mova primeiro (torre ou rei ) antes de chamar a função CausaAutoXeque() sempre teremos um rei em xeque
        // mesmo se a torre o proteger(bloquear o ataque)
        // então o movimento da torre será "simulado"
        Peca movida;

        movida = movtorre.origem.PopPeca();
        // lembrando que se chegamos até aqui não há ninguem ocupando essa casa! (eu acho...), podemos colocar a peça sem receio
        movtorre.destino.ColocarPeca(movida);
        if (movrei.CausaAutoXeque())
        {
            //	Debug.Log("rei esta indo para casa sob ataque!(entraria em xeque)");
            // voltar para a torre para a poisção original
            movtorre.destino.PopPeca();
            movtorre.origem.ColocarPeca(movida);
            return(false);
        }
        // voltar para a torre para a poisção original
        movida = movtorre.destino.PopPeca();
        movtorre.origem.ColocarPeca(movida);



        return(true);
    }
Ejemplo n.º 2
0
    // Propaga um movimento na direção dada.
    public static List <Movimento> SeguindoDirecao(Casa origem, int x, int y, int passos = int.MaxValue, Tipo tipo = Tipo.Normal, bool bloqueavel = true, bool verificaXeque = true)
    {
        var possibilidades = new List <Movimento>();
        //Debug.Log(origem.PosX + x);

        Tabuleiro tabuleiro = origem.Tabuleiro;
        Casa      seguinte  = tabuleiro.GetCasa(origem.PosX + x, origem.PosY + y);

        while (seguinte != null && passos > 0)
        {
            Movimento novo = new Movimento(origem: origem, destino: seguinte, tipo: tipo);

            if (seguinte.EstaOcupada())
            {
                if (tipo != Tipo.SemCaptura)
                {
                    if (origem.PecaAtual.PodeCapturar(seguinte.PecaAtual))
                    {
                        if (verificaXeque)
                        {
                            if (novo.CausaAutoXeque() == false)
                            {
                                novo.pecaCapturada = seguinte.PecaAtual;
                                possibilidades.Add(novo);
                            }
                        }
                        else
                        {
                            novo.pecaCapturada = seguinte.PecaAtual;
                            possibilidades.Add(novo);
                        }
                    }
                }

                // Se for "bloqueável", o movimento não permite atravessar outras peças. (O cavalo "pula", não "atravessa", depois explico melhor)
                if (bloqueavel)
                {
                    return(possibilidades);
                }
            }
            else
            {
                if (tipo != Tipo.SomenteCaptura)
                {
                    if (verificaXeque)
                    {
                        if (novo.CausaAutoXeque() == false)
                        {
                            possibilidades.Add(novo);
                        }
                    }
                    else
                    {
                        possibilidades.Add(novo);
                    }
                }
            }

            seguinte = tabuleiro.GetCasa(seguinte.PosX + x, seguinte.PosY + y);
            passos--;
        }

        return(possibilidades);
    }