diff --git a/libs/jogador.c b/libs/jogador.c index 48b507e47211e49caaefdcd235d5278b15e6fe01..e96b375eec791f9fbcb5f239314ec6a319017e1a 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -8,25 +8,56 @@ Lista Joga(Grafo g, Lista grupo){ Lista jogadas = constroiLista(); //TODO: A Logica toda do jogo vai ficar aqui + int counter; + do { + // Pega os filhos do grupo + Lista filhos = filhosGrupo(grupo); + // Monta a árvore de busca: + // - RAIZ: grupo + // - FILHOS: Cores alcancáveis a partir da raiz + // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz + // Só é necessário para calcular o bônus de cada filho + Lista coresFilhos = agrupaCores(filhos); + // Seleciona o melhor filho baseado em peso(filho) + bônus(filho) // (filho com a maior soma de filho e peso) + // O bônus é calculado da seguinte forma: + // - Soma o valor de cada neto (que não é alcançável pela raiz) + // - Em caso de empate da soma peso + bônus: + // - Escolher o filho que tem mais netos da mesma cor de um filho + // Após escolher um filho, repete o algoritmo até não terem mais filhos fora do grupo - // Pega os filhos do grupo - Lista filhos = filhosGrupo(grupo); - // Monta a árvore de busca: - // - RAIZ: grupo - // - FILHOS: Cores alcancáveis a partir da raiz - // - NETOS: Cores alcançáveis a partir dos filhos que NÃO são alcançáveis a partir da raiz - // Só é necessário para calcular o bônus de cada filho - Lista coresFilhos = agrupaCores(filhos); - // Seleciona o melhor filho baseado em peso(filho) + bônus(filho) // (filho com a maior soma de filho e peso) - // O bônus é calculado da seguinte forma: - // - Soma o valor de cada neto (que não é alcançável pela raiz) - // - Em caso de empate da soma peso + bônus: - // - Escolher o filho que tem mais netos da mesma cor de um filho - // Após escolher um filho, repete o algoritmo até não terem mais filhos do grupo + Vertice maior = (Vertice) getConteudo(primeiroNoLista(coresFilhos)); + for(No n = primeiroNoLista(coresFilhos); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + // TODO: tratar empates! + if((v->peso + v->bonus) > (maior->peso + maior->bonus)) { + maior = v; + } + } + insereLista(maior->cor, jogadas); + // "Pinta o tablueiro" + for(No n = primeiroNoLista(filhos); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + if(v->cor == maior->cor && !v->grupo) { + insereUnicoLista(v, grupo); + v->grupo = true; + } + } + + // Limpa as coisas + destroiLista(filhos, NULL); + destroiLista(coresFilhos, destroiVertice); + + // PARA DEBUG!! Imprime as últimas 10 jogadas em um arquivo + // char str[32]; + // sprintf(str, "./jogada%d.out", counter % 10); + // FILE* debug = fopen(str, "w+"); + // if(debug) { + // grafoParaDot(g, grupo, debug); + // } + // fclose(debug); + // ++counter; + } while(tamanhoLista(grupo) < tamanhoLista(g->vertices)); - // Limpa as coisas - destroiLista(filhos, NULL); - destroiLista(coresFilhos, destroiVertice); return jogadas; } @@ -36,7 +67,9 @@ Lista filhosGrupo(Lista grupoPai) { Vertice pai = (Vertice) getConteudo(n); for(No m = primeiroNoLista(pai->filhos); m; m = getSucessorNo(m)) { Vertice filho = (Vertice) getConteudo(m); - insereUnicoLista(filho, filhos); + if(!filho->grupo) { + insereUnicoLista(filho, filhos); + } } } return filhos; diff --git a/main.c b/main.c index 2c8128b4813f879e45cd6a7c66ebc40db311d88e..4c9588b08d53c21c962d0b18013cb9b91394ed1b 100644 --- a/main.c +++ b/main.c @@ -29,13 +29,12 @@ int main() { Lista jogadas = Joga(g, grupo); - // PARA DEBUGAR: Imprime o grafo tabuleiro em formato dot com os vértices já - // "consumidos" pintados de vermelho - FILE* debug = fopen("./debug.out", "w+"); - if(debug) { - grafoParaDot(g, grupo, debug); + printf("%d\n", tamanhoLista(jogadas)); + for(No n = primeiroNoLista(jogadas); n; n = getSucessorNo(n)) { + int cor = (int) getConteudo(n); + printf("%d ", cor); } - fclose(debug); + puts(""); destroiLista(jogadas, NULL); // Desaloca lista do grupo