Primeiro commit
This commit is contained in:
parent
b1d1c0c8f5
commit
a1495d6175
|
@ -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
|
|
@ -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!
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue