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