From eb59c78c8aab65cbcc4e448c8c9c716c5a29e20d Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Tue, 16 May 2017 13:40:29 -0300 Subject: [PATCH] =?UTF-8?q?Add=20fun=C3=A7=C3=A3o=20que=20agrupa=20as=20co?= =?UTF-8?q?res=20dos=20filhos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/jogador.c | 34 ++++++++++++++++++++++++++++++++-- libs/jogador.h | 3 +++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/libs/jogador.c b/libs/jogador.c index 2110ad5..d9fc9ef 100644 --- a/libs/jogador.c +++ b/libs/jogador.c @@ -6,6 +6,7 @@ #include "grafo.h" Lista Joga(Grafo g, Lista grupo){ + Lista jogadas = constroiLista(); //TODO: A Logica toda do jogo vai ficar aqui // Pega os filhos do grupo @@ -14,8 +15,10 @@ Lista Joga(Grafo g, Lista grupo){ // - 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 e calculado da seguinte forma: + // 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 @@ -23,7 +26,8 @@ Lista Joga(Grafo g, Lista grupo){ // Limpa as coisas destroiLista(filhos, NULL); - return constroiLista(); + destroiLista(coresFilhos, destroiVertice); + return jogadas; } Lista filhosGrupo(Lista l) { @@ -37,3 +41,29 @@ Lista filhosGrupo(Lista l) { } return filhos; } + +Lista agrupaCores(Lista l) { + Lista agrupa = constroiLista(); + for(No n = primeiroNoLista(l); n; n = getSucessorNo(n)) { + Vertice v = (Vertice) getConteudo(n); + // Verifica se a cor já está na lista + bool estaNaLista = false; + for(No m = primeiroNoLista(agrupa); m; m = getSucessorNo(m)) { + Vertice w = (Vertice) getConteudo(m); + // Se está, soma o peso do vértice + if(w->cor == v->cor) { + w->peso += v->peso; + estaNaLista = true; + } + } + // Se não está, cria um vértice para a cor + if(!estaNaLista) { + Vertice w = criaVertice(); + w->cor = v->cor; + w->peso = v->peso; + insereLista(w, agrupa); + } + } + + return agrupa; +} diff --git a/libs/jogador.h b/libs/jogador.h index ec8ae9a..a5470c4 100644 --- a/libs/jogador.h +++ b/libs/jogador.h @@ -11,4 +11,7 @@ Lista Joga(Grafo g, Lista grupo); // Retorna todos os filhos de uma lista de vértices Lista filhosGrupo(Lista l); + +// Retorna uma lista de vértices com as cores e pesos agrupadas a partir de l +Lista agrupaCores(Lista l); #endif -- GitLab