Curtir Curtir:  0
Resultados 1 a 3 de 3

Tópico: Algoritmo Minimax para Conecta 4

  1. #1
    Avatar de bruxo
    Registro
    19-09-2004
    Localização
    Porto Alegre
    Idade
    35
    Posts
    4.746
    Conquistas / PrêmiosAtividadeCurtidas / Tagging InfoPersonagem - TibiaPersonagem - TibiaME
    Peso da Avaliação
    0

    Padrão Algoritmo Minimax para Conecta 4

    Gente, pesquisei por muitos lugares, e não achei quase nada.

    Gostaria de uma ajuda de como seria uma heuristica boa para o jogo Conecta4

    E se alguém tem algum exemplo ou possa me dar uma mao para implementar um algoritmo desses.

    Não sei se tá certo, mas eu acredito que o minimax possa ser implementado como uma BFS certo? E após chegar ao fundo maximo, eu retorno atualizando os valores dos nodos até chegar na raiz?

    Se alguém tiver um exemplo em C, ou um pseudo-algoritmo decente eu agradeceria(não entendi nada daquele da wikipedia)

    Publicidade:


    Jogue Tibia sem mensalidades!
    Taleon Online - Otserv apoiado pelo TibiaBR.
    https://taleon.online

  2. #2
    Avatar de Bob Joe
    Registro
    25-05-2007
    Posts
    8.845
    Conquistas / PrêmiosAtividadeCurtidas / Tagging InfoPersonagem - TibiaPersonagem - TibiaME
    Peso da Avaliação
    0

    Padrão

    Cara, eu tenho um exemplo de execução do minimax em um caderno meu da graduação, se eu achar aqui posto.
    Liga das Lendas: Vintas


    https://upload.wikimedia.org/wikipedia/commons/0/07/Motto_frederick_douglass_2.jpg

  3. #3
    Avatar de bruxo
    Registro
    19-09-2004
    Localização
    Porto Alegre
    Idade
    35
    Posts
    4.746
    Conquistas / PrêmiosAtividadeCurtidas / Tagging InfoPersonagem - TibiaPersonagem - TibiaME
    Peso da Avaliação
    0

    Padrão

    Opa, valeu BoB

    O que eu fiz até agora:

    Criei o básico, inicialização da raíz, do tabuleiro, regra pra quando acaba, como joga.

    Meu problema tá no conceito mesmo, implementar nunca é o difícil, o difícil é descobrir o que implementar hehe. E em pensar numa heuristica boa.

    Eu criei uma heuristica que ele pesquisa todo tabuleiro em busca de 1's(ou 2).

    Quando ele encontra o 1, ele procura verticalmente e horizontalmente(num raio 4) por outros 1's e soma, se encontrar um 2, ele descarta toda a soma.

    No final essas somas darão o valor da heuristica, ficou meio difícil de explicar, mas aqui vai o código:
    int calculaHeuristica(Tabuleiro *p,int minimax){
    int i, j, valor, z, soma;
    //1 é max
    //2 é min
    if(verificaVitoria(p)==minimax && minimax==1) return 9999;
    if(verificaVitoria(p)==minimax && minimax==2) return -9999;
    valor = 0;
    for(i=0;i<7;i++){
    for(j=0;j<10;j++){

    if(j<=6){
    soma =0;
    z=0;
    if(p->tab[i][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i][j]!=minimax && p->tab[i][j]!=0){
    z++;
    }

    if(p->tab[i][j+1]==minimax && z==0){
    soma++;

    }else if(p->tab[i][j+1]!=minimax && p->tab[i][j+1]!=0){
    z++;
    }

    if(p->tab[i][j+2]==minimax && z==0){
    soma++;
    }else if(p->tab[i][j+2]!=minimax && p->tab[i][j+2]!=0){
    z++;
    }

    if(p->tab[i][j+3]==minimax && z==0){
    soma++;
    }else if(p->tab[i][j+3]!=minimax && p->tab[i][j+3]!=0){
    z++;
    }

    if(z==0){
    valor = valor+soma;
    //printf("hor - %d %d %d\n", valor, i, j);
    }

    }
    if(i<=3){
    soma = 0;
    z=0;
    if(p->tab[i][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i][j]!=minimax && p->tab[i][j]!=0){
    z++;
    }

    if(p->tab[i+1][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i+1][j]!=minimax && p->tab[i+1][j]!=0){
    z++;
    }

    if(p->tab[i+2][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i+2][j]!=minimax && p->tab[i+2][j]!=0){
    z++;
    }

    if(p->tab[i+3][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i+3][j]!=minimax && p->tab[i+3][j]!=0){
    z++;
    }
    if(z==0){
    //printf("vert - %d %d %d\n", valor, i, j);
    valor = valor+soma;
    }
    }




    if(i-4>=0 && j+4<=9){
    soma =0;
    z=0;
    if(p->tab[i][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i][j]!=minimax && p->tab[i][j]!=0){
    z++;
    }

    if(p->tab[i-1][j+1]==minimax && z==0){
    soma++;

    }else if(p->tab[i-1][j+1]!=minimax && p->tab[i-1][j+1]!=0){
    z++;
    }

    if(p->tab[i-2][j+2]==minimax && z==0){
    soma++;

    }else if(p->tab[i-2][j+2]!=minimax && p->tab[i-2][j+2]!=0){
    z++;
    }

    if(p->tab[i-3][j+3]==minimax && z==0){
    soma++;

    }else if(p->tab[i-3][j+3]!=minimax && p->tab[i-3][j+3]!=0){
    z++;
    }
    if(z==0){
    //printf("sup dir - %d %d %d\n", valor, i, j);
    valor = valor+soma;
    }
    }

    if(i-4>=0 && j-4>=0){
    soma =0;
    z=0;
    if(p->tab[i][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i][j]!=minimax && p->tab[i][j]!=0){
    z++;
    }

    if(p->tab[i-1][j-1]==minimax && z==0){
    soma++;

    }else if(p->tab[i-1][j-1]!=minimax && p->tab[i-1][j-1]!=0){
    z++;
    }

    if(p->tab[i-2][j-2]==minimax && z==0){
    soma++;

    }else if(p->tab[i-2][j-2]!=minimax && p->tab[i-2][j-2]!=0){
    z++;
    }

    if(p->tab[i-3][j-3]==minimax && z==0){
    soma++;

    }else if(p->tab[i-3][j-3]!=minimax && p->tab[i-3][j-3]!=0){
    z++;
    }
    if(z==0){
    //printf("sup esq - %d %d %d\n", valor, i, j);
    valor = valor+soma;
    }
    }

    /*if(i+4<=7 && j-4>=0){
    soma =0;
    z=0;
    if(p->tab[i][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i][j]!=minimax && p->tab[i][j]!=0){
    z++;
    }

    if(p->tab[i+1][j-1]==minimax && z==0){
    soma++;

    }else if(p->tab[i+1][j-1]!=minimax && p->tab[i+1][j-1]!=0){
    z++;
    }

    if(p->tab[i+2][j-2]==minimax && z==0){
    soma++;

    }else if(p->tab[i+2][j-2]!=minimax && p->tab[i+2][j-2]!=0){
    z++;
    }

    if(p->tab[i+3][j-3]==minimax && z==0){
    soma++;

    }else if(p->tab[i+3][j-3]!=minimax && p->tab[i+3][j-3]!=0){
    z++;
    }
    if(z==0){
    printf("inf esq - %d %d %d\n", valor, i, j);
    valor = valor+soma;
    }
    }

    if(i+4<=7 && j+4<=9){
    soma =0;
    z=0;
    if(p->tab[i][j]==minimax && z==0){
    soma++;

    }else if(p->tab[i][j]!=minimax && p->tab[i][j]!=0){
    z++;
    }

    if(p->tab[i+1][j+1]==minimax && z==0){
    soma++;

    }else if(p->tab[i+1][j+1]!=minimax && p->tab[i+1][j+1]!=0){
    z++;
    }

    if(p->tab[i+2][j+2]==minimax && z==0){
    soma++;

    }else if(p->tab[i+2][j+2]!=minimax && p->tab[i+2][j+2]!=0){
    z++;
    }

    if(p->tab[i+3][j+3]==minimax && z==0){
    soma++;

    }else if(p->tab[i+3][j+3]!=minimax && p->tab[i+3][j+3]!=0){
    z++;
    }
    if(z==0){
    printf("Inf dir - %d %d %d\n", valor, i, j);
    valor = valor+soma;
    }
    }*/
    }
    }
    if(minimax==2) return -valor;
    return valor;
    }
    Tem uma parte comentada, porque percebi que não era necessário calcular o valor de duas diagonais iguais, visto que não tem direção.



    Edit:

    Olha o que eu pensei, não sei se o conceito tá certo.

    Mas eu poderia implementar uma BFS, abrir todos os filhos até uma determinada profundidade, colocá-los num vetor, calcular o max e o min, comparar 7 a 7, e jogar o valor max e min para cima, até chegar no topo, não sei se o conceito tá certo, mas acho que é isso né?
    Copiei e colei do outro forum que participo hehe

    Melhor ainda, eu tenho uma busca iterativa já implementada, acho que vou transformar ela no minimax, será que tem como?
    Última edição por bruxo; 15-02-2014 às 19:15.



Tópicos Similares

  1. Tecnologia | Estudante de 17 anos cria algoritmo de busca mais preciso que o Google
    Por Cobion no fórum Fora do Tibia - Off Topic
    Respostas: 14
    Último Post: 17-06-2012, 17:57
  2. [RESOLVIDO] Qual o algoritmo de experiencia do tibia?
    Por carlosssj3 no fórum Suporte Geral
    Respostas: 3
    Último Post: 19-11-2011, 19:10
  3. Tecnologia | Exercicio algoritmo em pascal
    Por Binho Rulez no fórum Fora do Tibia - Off Topic
    Respostas: 1
    Último Post: 03-06-2010, 18:44
  4. Tecnologia | Ts não Conecta
    Por Muskull no fórum Fora do Tibia - Off Topic
    Respostas: 4
    Último Post: 14-03-2009, 20:10

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •