Ejemplo n.º 1
0
        public int max_value(Estado estado, int alfa, int beta)
        {
            if (cut(estado) || estado.gameIsOver())
            {
                return(eval(estado));
            }

            int           v = Int32.MinValue;
            int           temp;
            List <Jogada> jogadas = MaquinaDeRegras.PossiveisMovimentos(estado);

            foreach (var jogada in jogadas)
            {
                //MAX(v,min_value(result(s,a),alfa,beta))
                temp = min_value(Estado.result(estado, jogada), alfa, beta);
                if (v < temp)
                {
                    v = temp;
                }

                if (v >= beta)
                {
                    return(v);
                }

                //MAX(alfa,v)
                if (alfa < v)
                {
                    alfa = v;
                }
            }
            return(v);
        }
Ejemplo n.º 2
0
    private void mostraHighlight(GameObject peca_go)
    {
        List <int[]>          posicoesPecasJogadorAtual = GameController.instance.posicoes_jogador_atual();
        List <List <Jogada> > jogadas = MaquinaDeRegras.PossiveisMovimentosUmJogador(
            GameController.instance.estadoAtual.tabuleiro,
            posicoesPecasJogadorAtual);
        Peca pecaSelecionada = peca_go.GetComponent <Peca>();

        foreach (List <Jogada> jogadas_peca in jogadas)
        {
            // verifica se lista sendo avaliada neste momento é a lista de jogadas da peça que eu quero movimentar agora
            if (jogadas_peca[0].posInicial[0] == pecaSelecionada.posicao.lin &&
                jogadas_peca[0].posInicial[1] == pecaSelecionada.posicao.col)
            {
                int linFinalAtual, colFinalAtual, linFinalDestino, colFinalDestino;
                foreach (Jogada jogada in jogadas_peca)
                {
                    if (jogada != null)
                    {
                        linFinalAtual = jogada.ultimoMovimento()[0];
                        colFinalAtual = jogada.ultimoMovimento()[1];
                        GameObject posicao       = Tabuleiro.instance.matrizTabuleiroPosicoes[linFinalAtual, colFinalAtual];
                        GameObject new_highlight = Instantiate(highlightParticleSystem, posicao.transform) as GameObject;
                        this.listaHighlight.Add(new_highlight);
                    }
                }
            }
        }
    }
Ejemplo n.º 3
0
        public Jogada alpha_beta_search(Estado estado)
        {
            int v    = Int32.MinValue;
            int alfa = Int32.MinValue;
            int beta = Int32.MaxValue;

            List <Jogada> jogadas = MaquinaDeRegras.PossiveisMovimentos(estado);
            int           i = 0, temp, jogadaIndex = 0;

            foreach (var jogada in jogadas)
            {
                //MAX(v,min_value(result(s,a),alfa,beta))
                temp = min_value(Estado.result(estado, jogada), alfa, beta);
                if (v < temp)
                {
                    v           = temp;
                    jogadaIndex = i;
                }

                if (v >= beta)
                {
                    return(jogada);
                }

                //MAX(alfa,v)
                if (alfa < v)
                {
                    alfa = v;
                }

                i++;
            }

            List <Jogada> .Enumerator e = jogadas.GetEnumerator();
            for (i = 0; i < jogadaIndex + 1; i++)
            {
                e.MoveNext();
            }
            return(e.Current);
        }
Ejemplo n.º 4
0
        //fun��o de avaliacao sobre a quantidade de movimentos possiveis
        //retorna a qtd de movimentos possiveis
        public static int evalMobility(Estado estado)
        {
            List <Jogada> jogadas = MaquinaDeRegras.PossiveisMovimentos(estado);

            return(jogadas.Count);
        }
Ejemplo n.º 5
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;
        }
    }