Primeiro commit

This commit is contained in:
enqfila 2021-08-15 21:13:18 +00:00
parent b1d1c0c8f5
commit a1495d6175
4 changed files with 391 additions and 0 deletions

17
Descricao.txt Normal file
View File

@ -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

36
Devlog Normal file
View File

@ -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!

331
testes.cpp Normal file
View File

@ -0,0 +1,331 @@
// Hajam includes...
#include "Objects\Tiles\Tile.h"
#include "Objects\Map\HexMap.h"
#include <fstream>
#include <iomanip>
#include <random>
#include <iostream>
#include <sstream>
#include <array>
#include <iterator>
#include <time.h>
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<unsigned,5> sequence;
seed.generate(sequence.begin(),sequence.end());
cout << "Semente utilizada \"" << SEED << "\" gerou a semente aleatoria " << sequence.at(0) << endl;
std::ostream_iterator<char> 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"<<endl;
cout << "Comando: ";
cin >> 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);"<<endl;
char comando = '.';
cin >> comando;
if (comando == 'c'){
int index = -2;
while ((index+1)){
system("cls");
cout <<colormap->reset<< "Cores atuais: Texto comum(0)\n"
<< colormap->unkn << "Desconhecido(1)\t" <<colormap->reset<<colormap->unknMark << "Desc. Marcado(2)\n"<<colormap->reset
<< colormap->kn <<colormap->reset<< "Conhecido(3)\t" <<colormap->reset<< colormap->knMark << "Con. Marcado(4)\n"<<colormap->reset
<< colormap->occup << "Ocupado(5)\t" <<colormap->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;
}

7
tiles.txt Normal file
View File

@ -0,0 +1,7 @@
f floresta
h area_urbana
_ planicie
= deserto
^ montanha
m morro
: ilha