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); }
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); } } } } }
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); }
//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); }
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; } }