Example #1
0
    public String EstadoAtual()
    {
        String str = "A jogar: " + JogadorDaVez().Cor + "\n";

        for (int i = 0; i < Tabuleiro.Tamanho; i++)
        {
            for (int j = 0; j < Tabuleiro.Tamanho; j++)
            {
                str += "Casa (" + i + "," + j + ") ";
                Peca peca = Tabuleiro.GetCasa(i, j).PecaAtual;

                if (peca == null)
                {
                    str += "__";
                }
                else
                {
                    if (peca is Torre)
                    {
                        str += "T";
                    }
                    else if (peca is Cavalo)
                    {
                        str += "C";
                    }
                    else if (peca is Bispo)
                    {
                        str += "B";
                    }
                    else if (peca is Rei)
                    {
                        str += "E";
                    }
                    else if (peca is Rainha)
                    {
                        str += "A";
                    }
                    else if (peca is Peao)
                    {
                        str += "P";
                    }
                    else
                    {
                        str += "?";
                        Debug.LogWarning("Tipo de peça desconhecido ao registrar no histórico.");
                    }

                    str += peca.Cor;
                    str += peca.ListaMovimentosToString();
                }
                str += "\n";
            }
            str += "\n";
        }

        return(str);
    }
Example #2
0
    void Start()
    {
        Tabuleiro tabuleiro = GetComponentInParent <UITabuleiro>().Tabuleiro;

        // Assume que o nome é no formato "Casa XY", em que X é qualquer letra e Y qualquer número.
        string coordenadas = this.name.Substring(startIndex: 5);

        casa     = tabuleiro.GetCasa(coordenadas);
        casa.uiC = this;
    }
Example #3
0
    public double pontuacao(Tabuleiro tab, char cor)
    {
        double pont = 0;
        Casa   atual;

        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                atual = tab.GetCasa(i, j);
                if (atual.PecaAtual != null)
                {
                    pont += valorCasa(atual, atual.PecaAtual, cor);
                }
            }
        }
        return(pont);
    }
Example #4
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);
    }
Example #5
0
    public override Movimento Roque(Tabuleiro tabuleiro, Torre torre = null)
    {
        //Rei rei = (Rei)this.jDono.conjuntoPecas[4];

        //OQUE ESTA COMENTADO FOI USADO PARA TESTES

        Rei rei = null;

        foreach (Peca p in this.jDono.conjuntoPecas)
        {
            if (p is Rei)
            {
                rei = (Rei)p;
                //Debug.Log("amem");
                break;
            }
        }
        if (rei.CasaAtual == null || this.CasaAtual == null)
        {
            return(null);
        }
        // criar "movimento" rei deve ser aproximar da torre andando 2 casas (tanto no roque pequeno quanto no grande)
        // a torre anda 3 casas em casos de roque grande (torre do lado esquerdo)
        // a torre anda 2 casas em casos de roque pequeno(torre do lado direito)
        // dependendo da torre escolhida o movimento pode mudar
        // note que esse metodõ poderia ser chamado pelo rei ou torre(O JOGADOR PODE ESCOLHER FAZER ROQUE CLICANDO NO REI ou TORRE)
        // como a torre que varia eu implementei que a chamada do metodo do rei direciona para o metodo da torre especifica

        Casa destinorei, destinotorre;
        //MUDANÇA POR CAUSA DO TABULEIRO
        //int linha = rei.CasaAtual.PosX;
        //int colunaTgrande = this.PosY+3, colunaTpequeno = this.PosY-2;
        //int colunaRgrande = rei.PosY-2, colunaRpequeno = rei.PosY+2;
        int linha = rei.CasaAtual.PosY;                                    // linha em que o rei está alinhado com a torre(que é na vdd a coluna da matriz)
        int colunaTgrande = this.PosX + 3, colunaTpequeno = this.PosX - 2; // coluna que o rei e torre devem se mover (que na vdd é a linha da matriz)
        int colunaRgrande = rei.PosX - 2, colunaRpequeno = rei.PosX + 2;

        //Debug.Log("select your roque");

/*
 *              Debug.Log("linha rei:");
 *              Debug.Log(linha);
 *              Debug.Log("Coluna rei:");
 *              Debug.Log(rei.CasaAtual.PosX);
 *              Debug.Log("Coluna torre:");
 *              Debug.Log(this.CasaAtual.PosX);
 */
        if (this.CasaAtual.PosX < rei.CasaAtual.PosX)        // roque grande
        {
            //	Debug.Log("Roque grande");

            /*
             *      Debug.Log("coluna Roque grande torre: ");
             *      Debug.Log(colunaTgrande);
             *      Debug.Log("coluna Roque grande rei: ");
             *      Debug.Log(colunaRgrande);
             */
            destinorei   = tabuleiro.GetCasa(colunaRgrande, linha);
            destinotorre = tabuleiro.GetCasa(colunaTgrande, linha);
        }
        else         // roque pequeno
        {
            //	Debug.Log("Roque pequeno");

            /*
             *      Debug.Log("coluna Roque pequeno torre: ");
             *      Debug.Log(colunaTpequeno);
             *      Debug.Log("coluna Roque pequeno rei: ");
             *      Debug.Log(colunaRpequeno);
             */
            destinorei   = tabuleiro.GetCasa(colunaRpequeno, linha);
            destinotorre = tabuleiro.GetCasa(colunaTpequeno, linha);
        }
        Movimento m  = new Movimento(origem: rei.CasaAtual, destino: destinorei);
        Movimento mt = new Movimento(origem: this.CasaAtual, destino: destinotorre);

        //Debug.Log(this.PodeRoque(this,rei,tabuleiro,m));
        if (this.PodeRoque(this, rei, tabuleiro, m, mt))
        {
            //Debug.Log("realizando roque...");
            m.movimentoExtra = mt;
            //this.RealizaMovimento(m);
            //this.RealizaMovimento(mt);
            return(m);
        }
        return(null);
    }
Example #6
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);
    }