예제 #1
0
        //funcao de avaliacao que considera a quantidade de pecas e o lugar onde estao
        //cada peca tem um valor associado peao, peao perto de virar dama e dama
        //cada posicao do tabuleiro tem um valor associado
        public static int evalMaterial(Estado estado)
        {
            int i, j, peca, valorPeca, valorPos, sum1 = 0, sum2 = 0;

            for (i = 0; i < 8; i++)
            {
                for (j = 0; j < 8; j++)
                {
                    peca     = estado.tabuleiro[i, j];
                    valorPos = valoracao[i, j];

                    if (Tipos.isDama(peca))
                    {
                        valorPeca = 10;
                    }
                    else if (((i == 1) && Tipos.isJogador1(peca)) || ((i == 6) && Tipos.isJogador2(peca)))
                    {
                        valorPeca = 7;
                    }
                    else
                    {
                        valorPeca = 5;
                    }

                    if (Tipos.isJogador1(peca))
                    {
                        sum1 += valorPeca * valorPos;
                    }
                    else if (Tipos.isJogador2(peca))
                    {
                        sum2 += valorPeca * valorPos;
                    }
                }
            }

            if (estado.jogadorAtual == 1)
            {
                return(sum1 - sum2);
            }
            else
            {
                return(sum2 - sum1);
            }
        }
예제 #2
0
        public static Estado result(Estado antigo, Jogada acao)
        {
            Estado novo = new Estado(antigo.tabuleiro, antigo.jogadorAtual, antigo.ultimaJogada, antigo.contaJogadas);

            novo.jogadorAtual = novo.jogadorAtual == 1 ? 2 : 1;
            novo.ultimaJogada = acao;

            int size = acao.movimentos.Count;
            int pecaSendoMovimentada = antigo.tabuleiro[acao.posInicial[0], acao.posInicial[1]];

            novo.tabuleiro[acao.ultimoMovimento()[0], acao.ultimoMovimento()[1]] = novo.tabuleiro[acao.posInicial[0], acao.posInicial[1]];
            novo.tabuleiro[acao.posInicial[0], acao.posInicial[1]] = Tipos.vazio;

            foreach (int[] peca in acao.pecasComidas)
            {
                novo.tabuleiro[peca[0], peca[1]] = Tipos.vazio;
            }

            // if (acao.virouDama)
            // {
            //     int jogadorAtual = Tipos.pegaJogador(novo.tabuleiro[acao.ultimoMovimento()[0], acao.ultimoMovimento()[1]]);
            //     novo.tabuleiro[acao.ultimoMovimento()[0], acao.ultimoMovimento()[1]] = Tipos.getPecaJogadorX(Tipos.dama, jogadorAtual);
            // }

            if (acao.pecasComidas.Count == 0 && Tipos.isDama(pecaSendoMovimentada))
            {
                novo.jogadasCondicaoEmpate++;
            }
            else
            {
                novo.jogadasCondicaoEmpate = 0;
            }
            novo.contaJogadas++;

            return(novo);
        }
예제 #3
0
    public int verificaVitoriaEmpate(Estado estado)
    {
        // 0: não está em vitória nem em empate
        // 1: vitória do jogador 1
        // 2: vitória do jogador 2
        // 3: empate
        int resultado = 0;

        int qtdPecasJogador1, qtdPecasjogador2, qtdDamasJogador1, qtdDamasJogador2, qtdPecasNormaisJogador1, qtdPecasNormaisJogador2;

        qtdPecasJogador1 = qtdPecasjogador2 = qtdDamasJogador1 = qtdDamasJogador2 = qtdPecasNormaisJogador1 = qtdPecasNormaisJogador2 = 0;
        foreach (int peca in estado.tabuleiro)
        {
            if (Tipos.isJogador1(peca))
            {
                if (Tipos.isDama(peca))
                {
                    qtdDamasJogador1++;
                }
                qtdPecasJogador1++;
            }
            else if (Tipos.isJogador2(peca))
            {
                if (Tipos.isDama(peca))
                {
                    qtdDamasJogador2++;
                }
                qtdPecasjogador2++;
            }
        }

        if (qtdPecasJogador1 == 0)
        {
            mudaTexto("JOGADOR 2 GANHOU!!");
            return(2); //jogador 1 sem peças, vitoria do jogador 2
        }
        else if (qtdPecasjogador2 == 0)
        {
            mudaTexto("JOGADOR 1 GANHOU!!");
            return(1);//jogador 2 sem peças, vitoria do jogador 1
        }

        qtdPecasNormaisJogador1 = qtdPecasJogador1 - qtdDamasJogador1;
        qtdPecasNormaisJogador2 = qtdPecasjogador2 - qtdDamasJogador2;
        int qtdPecasNormais = qtdPecasNormaisJogador1 + qtdPecasNormaisJogador2;

        // 2 damas contra 2 damas;
        // 2 damas contra uma;
        // 2 damas contra uma dama e uma pedra;
        // uma dama contra uma dama e uma dama contra uma dama e uma pedra, são declarados empatados após 5 lances de cada jogador.

        if (estado.jogadasCondicaoEmpate >= 20 ||
            ((qtdDamasJogador1 == 2 && qtdDamasJogador2 == 2) && qtdPecasNormais == 0) ||
            ((qtdDamasJogador1 == 2 && qtdDamasJogador2 == 1) && qtdPecasNormais == 0) ||
            ((qtdDamasJogador1 == 1 && qtdDamasJogador2 == 2) && qtdPecasNormais == 0) ||
            ((qtdDamasJogador1 == 2 && qtdDamasJogador2 == 1) && qtdPecasNormaisJogador2 == 1) ||
            ((qtdDamasJogador1 == 1 && qtdDamasJogador2 == 2) && qtdPecasNormaisJogador1 == 1) ||
            ((qtdDamasJogador1 == 1 && qtdDamasJogador2 == 1 && qtdPecasNormais == 0) && estado.jogadasCondicaoEmpate >= 5) ||
            ((qtdDamasJogador1 == 1 && qtdDamasJogador2 == 1 && qtdPecasNormais == 1) && estado.jogadasCondicaoEmpate >= 5))
        {
            mudaTexto("EMPATE!!");
            return(3);
        }

        Debug.Log("Qtd Pecas Jogador 1: " + qtdPecasJogador1 + " Qtd Pecas Jogador 2: " + qtdPecasjogador2);
        return(resultado);
    }
예제 #4
0
    private void processaClique()
    {
        if (this.jogo != 0)
        {
            return;
        }
        if (Input.GetMouseButtonUp(0) && !clickFlag)
        {
            clickFlag = true;
            if (!GameController.instance.getTurnoJogador())
            {
                return;                                                         //turno IA
            }
            GameObject objeto_resposta = checaClique();
            if (objeto_resposta != null)
            {
                if (isPeca(objeto_resposta))
                {
                    seleciona_pedra(objeto_resposta);
                    mostraHighlight(objeto_resposta);
                }
                else if (isPosicao(objeto_resposta) && this.pedraSelecionada)
                {
                    Jogada       jogadaASerExecutada       = null;
                    Peca         pecaSelecionada           = pedraSelecionada.GetComponent <Peca>();
                    List <int[]> posicoesPecasJogadorAtual = GameController.instance.posicoes_jogador_atual();

                    // otimizar para chamar a máquina de regras uma vez apenas quando mudar o turno, pegando todos os movimentos possiveis do jogador atual
                    List <List <Jogada> > jogadas = MaquinaDeRegras.PossiveisMovimentosUmJogador(
                        GameController.instance.estadoAtual.tabuleiro,
                        posicoesPecasJogadorAtual);
                    foreach (List <Jogada> lista in jogadas)
                    {
                        // verifica se lista sendo avaliada neste momento é a lista de jogadas da peça que eu quero movimentar agora
                        if (lista[0].posInicial[0] == pecaSelecionada.posicao.lin &&
                            lista[0].posInicial[1] == pecaSelecionada.posicao.col)
                        {
                            // se for a lista de jogadas da peça que eu quero mover tenho que achar a Jogada que tem como ultimo movimento
                            // a posicao que quero mover a peca
                            int linFinalAtual, colFinalAtual, linFinalDestino, colFinalDestino;
                            foreach (Jogada jogada in lista)                            // as jogadas para encontrar qual é a jogada que quero fazer
                            {
                                linFinalAtual = jogada.ultimoMovimento()[0];
                                colFinalAtual = jogada.ultimoMovimento()[1];
                                Posicao posicaoDestino = objeto_resposta.GetComponent <Posicao>();
                                linFinalDestino = posicaoDestino.lin;
                                colFinalDestino = posicaoDestino.col;
                                if (linFinalAtual == linFinalDestino && colFinalAtual == colFinalDestino)
                                // Encontrando a jogada procurada temos que a jogada que queríamos fazer é válida, portando mudamos a variavel jogadaASerExecutada
                                {
                                    jogadaASerExecutada = jogada;
                                    if (jogadaASerExecutada.pecasComidas.Count == 0 && Tipos.isDama(pecaSelecionada.tipo))
                                    {
                                        GameController.instance.estadoAtual.jogadasCondicaoEmpate++;
                                    }
                                    else
                                    {
                                        GameController.instance.estadoAtual.jogadasCondicaoEmpate = 0;
                                    }
                                }
                            }
                        }
                    }

                    if (jogadaASerExecutada != null) //se a jogada for valida posso movimentar, alterar matriz, passar turno e descelecionar e atualizar o estadoAtual
                    {
                        // executar movimento visual
                        if (jogadaASerExecutada.pecasComidas.Count == 0)
                        {
                            movimenta(this.pedraSelecionada, objeto_resposta);
                        }
                        else
                        {
                            comePecasGraphical(this.pedraSelecionada, jogadaASerExecutada);
                        }

                        if (jogadaASerExecutada.virouDama)
                        {
                            if (GameController.instance.estadoAtual.getJogadorAtual() == 1)
                            {
                                pedraSelecionada.GetComponent <SpriteRenderer>().sprite = damaPreta;
                            }
                            else
                            {
                                pedraSelecionada.GetComponent <SpriteRenderer>().sprite = damaVermelha;
                            }
                        }
                        descelecionarPedraAtual();
                        GameController.instance.estadoAtual.tabuleiro    = alteraMatriz(GameController.instance.estadoAtual.tabuleiro, jogadaASerExecutada);
                        GameController.instance.estadoAtual.ultimaJogada = jogadaASerExecutada; // VERIFICAR
                        GameController.instance.passarTurno();
                    }
                    else
                    {
                        marcaXVermelhoNoTransform(objeto_resposta.transform);
                    }
                }
            }
            else
            {
                descelecionarPedraAtual();
            }
            clickFlag = false;
        }
    }