diff --git a/libs/jogador.c b/libs/jogador.c
index 2110ad531972b670fcabc9d4346994f1ef04e465..d9fc9efcf20c4634fb2732532923e3d24f47a601 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 ec8ae9ae0988e8b11551745b40f799c244481115..a5470c40cb320f31d605ae1af70923460d54cb2d 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