diff --git a/Descricao.txt b/Descricao.txt new file mode 100644 index 0000000..e86756a --- /dev/null +++ b/Descricao.txt @@ -0,0 +1,17 @@ +Projeto: Mapa hexagonal gerado randomicamente + +O que precisamos fazer: +- Gerar atributos para *um* hexagono (classe abstrata: hexagono) ++-- Armazenar esses hexagonos ++-- OPCIONAL: Permitir criar "tipos" de hexagono modificando um arquivo (xml, por exemplo) +- Gerar varios hexagonos aleatoriamente (mapa) ++-- Armazenar esse mapa de uma maneira apropriada ++-- Operar algoritmos de uma maneira apropriada mas que permita ocultar informacoes (estimar melhores caminhos sem dar um definitivo) ++-- OPCIONAL: Armazenar o estado do mapa em um arquivo (save/load) ++--+-- OPCIONAL: Permitir compartilhamento e acesso a partir de um codigo (hash do arquivo) +- Permitir ocultar/mostrar hexagonos (diminui poluicao visual) + +Geração: +1. Defina uma célula semente em uma posição aleatória. +2. Defina, dentre suas adjacências possíveis em uma direção aleatória, uma célula adjacente. +3. Siga para a próxima célula, populando Depth-first o mapa \ No newline at end of file diff --git a/Devlog b/Devlog new file mode 100644 index 0000000..214ccee --- /dev/null +++ b/Devlog @@ -0,0 +1,36 @@ +2021/07/31: + - Primeira descrição da classe "Hexagono". + - Implementação da classe abstrata "Hexagono". + +2021/08/04: + - Criado o Devlog. + - Feita a classe "Tile". Pode ser mergida com a classe Hexagono, se pá. + - Aprendi a fazer coisa colorida no terminal, uhul (so funciona no PowerShell) + - Agora as tiles podem ser "Reveladas/Não Reveladas" e "Marcadas/Não Marcadas" + - Implementada a divisao debug/producao do código. Por enquanto é inútil, mas é bom ter. + +2021/08/05: + - Implementado um "makefile" (?) que compila em modo debug/producao e roda ou não + - Tentei implementar o "HexMap". Fiz de um jeito meio confuso, não gostei. + - Classes guardadas em pastas. Melhor organizado. + - Feita uma classe "HashTable" só porque sim. Pode ser que seja útil para endereçar os hexágonos. + - Adicionei a parte de "Geração" no descrição.txt + +2021/08/08: + - Produzido a maneira de geração de eventos e geração de descritores de um Hex. + +2021/08/09: + - Implementada adjacências. + - Classe "HexMap" modificada para utilizar arrays de arrays. + - Implementada visualização, preenchimento, marcação e revelação de tiles em um HexMap. + - Implementado o inicio do acesso à informação de cada Tile. Atualmente só é possível acessar o nome. + - Implementada geração aleatória: sementes predefinidas, sementes aleatórias, visualização de semente. + +2021/08/14: + - Corrigido um bug na aquisição da semente aleatória. + - Adicionadas features de "desenhar Linha" e "ver adjacencias". + - Corrigido um bug onde as adjacencias para a ultima linha de tiles não são adicionadas corretamente. + - TODO: Fazer geração procedural (em vez de puramente aleatória). + +2021/08/15: + - TODO: Comentar o código! \ No newline at end of file diff --git a/testes.cpp b/testes.cpp new file mode 100644 index 0000000..dd80d96 --- /dev/null +++ b/testes.cpp @@ -0,0 +1,331 @@ +// Hajam includes... +#include "Objects\Tiles\Tile.h" +#include "Objects\Map\HexMap.h" +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + + +const char seedlings[36] = {'A','B','C','D','E','F', + 'G','H','I','J','K','L', + 'M','N','O','P','Q','R', + 'S','T','U','V','W','X', + 'Y','Z','0','1','2','3', + '4','5','6','7','8','9'}; + +static string mapFile = "tiles.txt"; +static Colors* colormap; +static int qtdTiles; + +string getQtdTiles(); + +// Pagina inicial +bool welcomePage(); + +// NAO IMPLEMENTADA +// Lida com o processo de iniciar o jogo +void start(); + +// Configuracoes +void config(); + + +int main(){ + + // Inicializa o mapa + colormap = new Colors(); + + // Troca de cores "Debug". Recomendadas se for utilizar as funcoes drawLine e pingAdj + // colormap->changeColor(3, colormap->invert); + // colormap->changeColor(2, colormap->cross); + + if (welcomePage()) return 0; + + // SEED de geracao de mapa + + system("cls"); + cout<< "Insira uma semente de geracao: "; + // cout << "adj" << endl; DEBUG + string preseed; + cin.sync(); + getline(cin,preseed); + // preseed = "adj"; DEBUG + + // Caso nao queira uma seed especifica + if (preseed.empty()){ + srand(time(NULL)); + for(int i = 0; i < 8; i++){ + preseed += ( seedlings[((rand() % (36)))]); + cout << preseed[i]; + } + cout << endl; + } + string SEED; + + SEED.assign(preseed); + + + std::seed_seq seed (SEED.begin(), SEED.end()); + std::array sequence; + seed.generate(sequence.begin(),sequence.end()); + + cout << "Semente utilizada \"" << SEED << "\" gerou a semente aleatoria " << sequence.at(0) << endl; + std::ostream_iterator iterato (std::cout,""); + cout << "Semente: "; + seed.param(iterato); + cout << endl; + std::mt19937 gen; // seed the generator + gen.seed(seed); + std::uniform_int_distribution<> distr(1, 95); // define the range + + + // Definicao do tamanho do mapa + int size = -1; + bool passou = 0; + while(size < 0 || size > 25){ + if (passou) cout << endl<< "O mapa deve ter tamanho entre 0 e 25 !" << endl; + cout << "Defina o tamanho do mapa: "; + cin >> size; + // size = 5; DEBUG + // cout << "5" << endl; DEBUG + passou = 1; + } + cout << endl; + + HexMap teste (size); + teste.initialize(mapFile); + + // Geracao aleatoria do mapa + for(int r = -size; r <=size; r++){ + // cout << setw(4)<< r << "| "; + for(int q = -size; q <= size; q++){ + teste.insertTile(new Tile(1,0,teste.getChar(distr(gen)), colormap), r, q); + } + cout << endl; + } + + // system("pause"); DEBUG + system("cls"); + + // Controle da UI + bool moveu = 0; + char lastCom; + int lastR, lastQ; + bool info = 0; + bool semente = 0; + string informacao; + while(true){ + + teste.printMap(); + char comando = '.'; + if (moveu) cout << "Ultimo comando: " << lastCom << ' ' << lastR << ' ' << lastQ << endl; + if (info) cout << "O hexagono [" << lastR << ',' << lastQ << "] representa um(a) " << informacao << endl; + if (semente) cout << "A semente do mapa atual eh \"" << informacao <<'\"'<< endl; + + cout << "Comandos possiveis:\n(r)evelar {coordenadaR} {coordenadaQ};\n(m)arcar {coordenadaR} {coordenadaQ};\n(i)nformacao {coordenadaR} {coordenadaQ};\nMostrar (s)emente;\n(q)uit"<> comando; + // Single input + if (comando == 'q') { + system("cls"); + break; + } else if (comando == 's'){ + semente = !semente; + info = 0; + informacao = SEED; + } + // comandos com + else{ + + int r = size+1; + int q = size+1; + cin >> r; + cin >> q; + if(comando == 'r'){ + lastCom = 'r'; + lastR = r; + lastQ = q; + teste.reveal(r,q); + moveu = 1; + info = 0; + } else if(comando == 'm'){ + lastCom = 'm'; + lastR = r; + lastQ = q; + teste.mark(r,q); + moveu = 1; + info = 0; + } else if(comando == 'i'){ + lastCom = 'i'; + lastR = r; + lastQ = q; + moveu = 1; + info = 1; + informacao = teste.getAmb(r,q); + } else if(comando == 'p'){ + lastCom = 'p'; + lastR = r; + lastQ = q; + moveu = 1; + + teste.pingAdj(r,q); + + } else if (comando == 'l'){ + for(int i = 0; i < 6; i++){ + teste.drawLine(i,r,q); + } + } + } + system("cls"); + } + // */ + colormap->returnDefault(); + cout<< colormap->reset; + return 0; +} + +bool welcomePage(){ + bool inicia = 0; + while(!inicia){ + system("cls"); + cout << "Bem vinde a [NomeDoNegocio]!\n Selecione um dos comandos abaixo:\n"; + cout << "(start): Iniciar o sistema\n(advanced): Iniciar o sistema (parametros avancados)\n(config):Configuracoes\n(quit): Sair do sistema" << endl; + string comando; + cin >> comando; + if (comando == "start"){ + // start(); + inicia = 1; + }else if (comando == "config"){ + config(); + } else{ + return 1; + } + } + cin.clear(); + return 0; +} + +void config(){ + bool configurando = 1; + while(configurando){ + system("cls"); + cout << "Selecione um comando:\n Configurar (c)ores;\nConfigurar (g)eracao;\nSair (q);"<> comando; + + if (comando == 'c'){ + + int index = -2; + while ((index+1)){ + system("cls"); + cout <reset<< "Cores atuais: Texto comum(0)\n" + << colormap->unkn << "Desconhecido(1)\t" <reset<unknMark << "Desc. Marcado(2)\n"<reset + << colormap->kn <reset<< "Conhecido(3)\t" <reset<< colormap->knMark << "Con. Marcado(4)\n"<reset + << colormap->occup << "Ocupado(5)\t" <reset<< colormap->occupMark << "Ocup. Marcado(6)\n" + << colormap->reset << endl; + cout << "Selecione qual cor alterar (-1 para sair, -3 para retornar ao padrao): "; + cin >> index; + if(index >= 0 && index < 7){ + int r,g,b; + cout << "Insira o codigo rgb da cor que deseja (0~16,0~16,0~16)" + << "\nr:"; cin >> r; + cout <<"g:"; cin >> g; + cout <<"b:"; cin >> b; + + stringstream colorstream; + colorstream << "\x1b[38;2;" << r*16 << ';' << g*16 << ';' << b*16 << 'm'; + string colore; + colorstream >> colore; + cout << colormap->reset << "Cor selecionada: " << colore << "exemplo?!:;._-=" << colormap->reset << endl; + cout << "Esta cor esta correta?(1 para sim, 0 para nao)"; + bool acepto; + cin >> acepto; + if(acepto){ + colormap->changeColor(index,colore); + cout << "Cores atualizadas." << endl; + } else{ + cout << "Cores nao alteradas." << endl; + } + } + else if (index == -3){ + colormap->returnDefault(); + } + } + } + if (comando == 'g'){ + + string theTiles = getQtdTiles(); + + int digitos = stoi(theTiles.substr(0,1)); + int tamanho = stoi(theTiles.substr(1, digitos)); + system("cls"); + cout << "Arquivo de informacoes de tiles: " << mapFile << endl; + + cout << theTiles << endl; + system("pause"); + cout << colormap->reset << "pesos: "; + for(int i = digitos+1; i < tamanho+digitos; i++){ + cout << colormap->occup << theTiles[i] << ' ' << colormap->reset; + } + cout << endl; + for(int i = digitos+1; i < tamanho+digitos; i++){ + cout << colormap->kn << theTiles[i] << colormap->reset << " : " << "1 1 1 1 1 1 1 1 " << endl; + } + system("pause"); + } + + + else if (comando == 'q') configurando = 0; + + } + // welcomePage(); + + return; +} + +string getQtdTiles(){ + cout << "Leitura" << endl; + qtdTiles = 0; + ifstream arquivo; + arquivo.open(mapFile); + stringstream tilesStream; + string tiles; + if (!(arquivo.good())) return 0; + else{ + while (arquivo.good()){ + if (arquivo.eof()) break; + char line[30]; + arquivo.getline(line, 30); + cout << line <<' ' << (arquivo.fail() || arquivo.bad()) << endl; + if (arquivo.fail() || arquivo.bad()) break; + if (line[0] == '\n') continue; + else{ + tiles += line[0]; + qtdTiles += 1; + } + + } + } + int digits = 0; + for(int aux = qtdTiles; aux > 0; aux = aux / 10){ + cout << aux << "->" << digits << endl; + digits++; + } + tilesStream << digits; + tilesStream << qtdTiles; + tilesStream << tiles; + string output; + tilesStream >> output; + cout << "output -> " << output << endl; + return output; +} + +void start(){ + return; +} \ No newline at end of file diff --git a/tiles.txt b/tiles.txt new file mode 100644 index 0000000..576284f --- /dev/null +++ b/tiles.txt @@ -0,0 +1,7 @@ +f floresta +h area_urbana +_ planicie += deserto +^ montanha +m morro +: ilha \ No newline at end of file