diff --git a/jogador.c b/jogador.c new file mode 100644 index 0000000000000000000000000000000000000000..6ae9cc37124d7732d945c0dda4c102b791d972cd --- /dev/null +++ b/jogador.c @@ -0,0 +1,61 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include "jogador.h" + +struct Nodo { + // Jogada que foi tomada para chegar neste nodo (ou seja, cor do grupo de posicoes atual) + int jogada; + // Filhos deste 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(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(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){ + //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"); +} diff --git a/jogador.h b/jogador.h new file mode 100644 index 0000000000000000000000000000000000000000..c26d91f944254049a0538183a8adbbe20baaa5d9 --- /dev/null +++ b/jogador.h @@ -0,0 +1,26 @@ +#ifndef _PLAYER_ +#define _PLAYER_ +#include <stdbool.h> + +// Nodo do grafo que permitira encontrar o menor numero de jogadas +typedef struct Nodo *Nodo; + +// 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 546c08628f397b140c5ad08d5d5b68d39920959d..d06e60b1811f5ff5cc6be04debcc1606e4ab6eeb 100644 --- a/main.c +++ b/main.c @@ -3,26 +3,28 @@ #include <stdio.h> #include <time.h> #include "tabuleiro.h" +#include "jogador.h" int main() { Tblr t = criaTblr(); + // Aloca o tabuleiro em um único array em vez de um "array de arrays" if(!leTblr(t)) { puts("Erro na leitura do tabuleiro"); return -1; } - // imprimeTblr(t); + imprimeTblr(t); + + // declara o grafo ponderado e seu primeiro nodo + grafo = criaGrafo(t); + if(grafo == NULL)) { + puts("Erro na criacao do grafo"); + return -1; + } + // faz o jogador jogar o jogo a partir do tabuleiro dado + // o retorno do jogador sera um vetor contendo os numeros referentes a menor jogada encontrada por ele + int *jogadas; + jogadas = Joga(grafo, t); - // printf("Ler o tabuleiro (em matriz?)\n"); - // 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"); return 0; }