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