diff --git a/Makefile b/Makefile
index 595e6e7886df1f8f992f27e83e2feb345b922627..19e58f7ffc6e9f735fc0c2044608c5dd943a7c03 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ test: main
 	chmod +x runTests.sh; \
 	./runTests.sh
 
-main: main.c libs/tabuleiro.o libs/grafo.o libs/vertice.o libs/filha.o libs/lista.o libs/no.o
+main: main.c libs/jogador.o libs/tabuleiro.o libs/grafo.o libs/vertice.o libs/filha.o libs/lista.o libs/no.o
 	$(CC) $(CFLAGS) -o $@ $^
 
 clean:
diff --git a/libs/jogador.c b/libs/jogador.c
index d5260557197e29f0c3bc8d7201af57e88a0a356e..33ee8cec874a5250f5fbd75192bd1ef21dd6728e 100644
--- a/libs/jogador.c
+++ b/libs/jogador.c
@@ -2,60 +2,22 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include "jogador.h"
+#include "lista.h"
+#include "grafo.h"
 
-struct Nodo {
-    // Jogada que foi tomada para chegar neste nodo (ou seja, cor do grupo de posicoes atual)
-    int jogada;
-    // Filhos deste nodo, sera um array de structs Nodo
-    Nodo * filhos;
-    // "Quadrados pintados" ate aquele nodo(que sera um vetor contendo certas posicoes do vetor "celulas")
-    int * quadradosPintados;
-    // peso eh a quantidade de quadrados pintados deste grupo
-    int peso;
-};
-
-int checaCor(Tblr t, int posicao){
-	return (t->celulas[posicao]->cor);
-}
-
-int * verAdjacentes(Tblr t, int posicao, int cor){
-	//TODO: criar algoritmo que encontra quais sao os quadrados adjacentes a este dado quadrado
-}
-
-void alocaFilhos(Nodo n){
-	//TODO: criar algoritmo que, dado um nodo, aloca seus filhos
-}
-
-Nodo criaGrafo(Tblr t){
-	Nodo n = malloc(sizeof(struct Nodo));
-	if(!n) return NULL;
-
-	n->jogada = checaCor(t, 0);
-	if(n->jogada == -1) return NULL;
-
-	// Ver quais sao os quadrados pintados deste nodo(grupo de quadrados adjacentes da mesma cor, dada uma posicao)
-	n->quadradosPintados = verAdjacentes(t, 0, n->jogada);
-	if(n->quadradosPintados == NULL) return NULL;
-	n->peso = (sizeof(n->quadradosPintados)/sizeof(int));
-
-	// Ver qual e a quantidade de filhos deste Nodo e aloca espaco para eles
-	alocaFilhos(n);
-	if(n->filhos == NULL) return NULL;
-
-	return n; 
-}
-
-int * Joga(Nodo n, Tblr t){
+Lista Joga(Grafo g, Lista grupo){
 	//TODO: A Logica toda do jogo vai ficar aqui
 
-      // printf("Enquanto pilha não vazia:\n");
-      // printf("\tPega os adjacentes do grupo (retorna os pesos dos filhos = montar o grafo)\n");
-      // printf("\tEscolhe filho de maior peso\n");
-      // printf("\tEmpilha os outros filhos\n");
-      // printf("\tSE tamanho do caminho atual + filhos do nodo atual >= menor caminho: VOLTA!\n");
-      // printf("\tSE soma do peso total = tamanho do tabuleiro: VOLTA! Retorna o caminho encontrado\n");
-      // printf("\n\n\n##BONUS##\n");
-      // printf("Olhar os vizinhos dos vizinhos no estado atual e atribuir bônus:\n");
-      // printf("\tSe vizinho tem vizinho que não tenho: adicionar valor do vizinho do vizinho como bônus\n");
-      // printf("\tSe vizinho tem vizinho que tenho, mas em número maior: adicionar diferença\n");
+    // Pega os filhos do 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
+    // 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:
+    //      - 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
+    return constroiLista();
 }
diff --git a/libs/jogador.h b/libs/jogador.h
index e8844e2baf2f04bd244f9c837f766c2529601f9e..1dd92d0f6b3aa04a010dbd3fe9856f657ede4c42 100644
--- a/libs/jogador.h
+++ b/libs/jogador.h
@@ -1,27 +1,11 @@
 #ifndef _PLAYER_
 #define _PLAYER_
 #include <stdbool.h>
-#include "tabuleiro.h"
+#include "grafo.h"
+#include "lista.h"
 
-// Nodo do grafo que permitira encontrar o menor numero de jogadas
-typedef struct Nodo *Nodo;
+// Pega os vizinhos da lista Grupo e seleciona o melhor filho baseado no peso e no bônus
+//      até consumir todos os vértices do grafo. Retorna a lista de jogadas
+Lista Joga(Grafo g, Lista grupo);
 
-// Cria um grafo ponderado com o primeiro nodo e retorna
-Nodo criaGrafo(Tblr t);
-
-// Encontra o menor caminho no grafo de pesos (ate que a soma dos pesos bruta seja igual ao numero de casas na matriz) 
-// e retorna este menor caminho em um vetor de inteiros
-int * Joga(Nodo n, Tblr t);
-
-// ------- Funcoes auxiliares --------
-
-// Checa cor de uma posicao da matriz.
-int checaCor(Tblr t, int posicao);
-
-// Checa quais sao os quadrados adjacentes a um quadrado especifico, e retorna as posicoes dos adjacentes no vetor
-// que representa a matriz do jogo. 
-int * verAdjacentes(Tblr t, int posicao, int cor);
-
-// Ve quais sao os filhos deste nodo, ou seja, os grupos de cores que estao ligados ao grupo de quadrados referentes a este nodo. 
-void alocaFilhos(Nodo n);
 #endif
diff --git a/main.c b/main.c
index 50c6c7fe77cbd5d3b9d5393646d45847760b26ec..2c8128b4813f879e45cd6a7c66ebc40db311d88e 100644
--- a/main.c
+++ b/main.c
@@ -7,6 +7,7 @@
 #include "libs/no.h"
 #include "libs/lista.h"
 #include "libs/grafo.h"
+#include "libs/jogador.h"
 
 int main() {
     Tblr t = criaTblr();
@@ -26,11 +27,10 @@ int main() {
     // Desaloca tabuleiro
     destroiTblr(t);
 
-    Lista jogadas = constroiLista();
+    Lista jogadas = Joga(g, grupo);
 
     // PARA DEBUGAR: Imprime o grafo tabuleiro em formato dot com os vértices já
     // "consumidos" pintados de vermelho
-    printf("Número de grupos: %d\n", tamanhoLista(g->vertices));
     FILE* debug = fopen("./debug.out", "w+");
     if(debug) {
         grafoParaDot(g, grupo, debug);