DricomDragon 4 лет назад
Родитель
Сommit
60b8834b62
3 измененных файлов с 291 добавлено и 0 удалено
  1. 3 0
      asciiWorld/Structs/0.stc
  2. 2 0
      asciiWorld/Structs/1.stc
  3. 286 0
      asciiWorld/main.cpp

+ 3 - 0
asciiWorld/Structs/0.stc

@@ -0,0 +1,3 @@
+XXX
+XNX
+XXX

+ 2 - 0
asciiWorld/Structs/1.stc

@@ -0,0 +1,2 @@
+|>>>|<<|
+|>>|<<<|

+ 286 - 0
asciiWorld/main.cpp

@@ -0,0 +1,286 @@
+# include <iostream>
+# include <ctime>
+# include <cstdlib>
+# include <string>
+# include <fstream>
+
+/*
+Génère un monde automatiquement.
+*/
+
+using namespace std ;
+
+// Place un bloc en évitant la sortie de tableau
+void install( char** world, int w, int h, int y, int x, char blc )
+{
+	if ( x < 0 || x >= w || y < 0 || y >= h )
+		return ;
+	
+	world[y][x] = blc;
+}
+
+// Dessine une ligne verticale
+void drawVLine( char** world, int w, int h, int y1, int y2, int x, char blc )
+{
+	for ( int i(y1); i <= y2; i ++ )
+	{
+		install( world, w, h, i, x, blc ) ;
+	}
+}
+
+// Dessine un cube
+void drawCube( char** world, int w, int h, int y, int x, int lx, int ly, char blc )
+{
+	for ( int i(y); i < y + ly; i ++ )
+		for ( int j(x); j < x + lx; j ++ )
+			install( world, w, h, i, j, blc );
+}
+
+// Créer le terrain
+void create( char** &world, int w = 15, int h = 10 )
+{
+	// Création
+	world = new char*[h];
+	for ( int i(0); i < h; i ++ )
+	{
+		world[i] = new char[w];
+	}
+}
+
+// Réinitialise le terrain avec des espaces
+void empty( char** world, int w, int h )
+{
+	for ( int i(0); i < h; i ++ )
+		for ( int j(0); j < w; j++ )
+		{
+			world[i][j] = ' ';
+		}
+}
+
+// Réalise une bordure d'étoiles
+void putStar( char** world, int y, int x )
+{
+	if ( world[y][x] == ' ' )
+		world[y][x] = '*';
+}
+void border( char** world, int w, int h )
+{	
+	for ( int i(0); i < h; i ++ )
+	{
+		putStar(world, i, 0);
+		putStar(world, i, w - 1);
+	}
+	
+	for ( int j(1); j < w - 1 ; j ++ )
+	{
+		putStar(world, 0, j);
+		putStar(world, h - 1, j);
+	}
+}
+
+// Affiche le terrain
+void display( char** world, int w, int h )
+{
+	for ( int i(0); i < h; i ++ )
+	{
+		for ( int j(0); j < w; j++ )
+		{
+			cout << world[i][j];
+		}
+		cout << endl ;
+	}
+}
+
+// Plante des arbres
+void trees( char** world, int w, int h, int space = 10, int dec = 5, int maxray = 3, int maxtall = 7 )
+{
+	int j(0);
+	
+	do
+	{
+		// Où poser la graine
+		j += space ;
+		j += rand() % ( 2 * dec ) + 1 ;
+		j -= dec ;
+		
+		int i(h - 2);
+		
+		while ( i > 0 && world[i][j] != ' ' )
+			i -- ;
+		
+		// Créer un arbre
+		int ray( rand() % maxray + 1 );
+		int tall( rand() % maxtall + 1 );
+		
+		if ( world[i + 1][j] == 'M' )
+		{
+			drawCube( world, w, h, i - 2*ray - tall - 1, j - ray, 2*ray + 1, 2*ray + 1, 'o' );
+			drawVLine( world, w, h, i - tall - 1, i, j, 'H' );
+		}
+		
+		
+	} while ( j < w ) ;
+}
+
+// Créer une grotte carrée
+void caveSquare( char** world, int w, int h, int y, int x, int scale = 5, char blc = ' ' )
+{
+	drawCube( world, w, h, y - scale / 2, x - scale / 2, scale, scale, blc );
+}
+
+// Créer une grotte bombom
+void caveBomBom( char** world, int w, int h, int y, int x, int scale = 4, int burst = 4, char blc = ' ' )
+{
+	for ( int k(0); k < burst ; k ++ )
+	{
+		int s( scale );
+		int i(y), j(x);
+		
+		while( s > 0 )
+		{
+			i += rand() % ( s + 1 ) ;
+			i -= s / 2 ;
+			
+			j += rand() % ( s + 1 ) ;
+			j -= s / 2 ;
+			
+			caveSquare( world, w, h, i, j, s );
+			
+			s -- ;
+		}
+	}
+}
+
+// Créer les grottes
+void caves( char** world, int w, int h, char blc = ' ', int space = 20, int dec = 15 )
+{
+	int j(0);
+	
+	do
+	{
+		// Intervalle pour faire une cave
+		j += space ;
+		j += rand() % ( 2 * dec ) + 1 ;
+		j -= dec ;
+		
+		int i(0);
+		
+		while ( i < h - 2 && world[i][j] == ' ' )
+			i ++ ;
+		
+		if ( i == h )
+			return ;
+		
+		// Randomiser la hauteur de la cave
+		int y(0);
+		y = rand() % ( h - i ) + i;
+		
+		// Randomiser la taille
+		int scale( rand() % 6 + 1 );
+		
+		// Randomiser le type
+		switch( rand() % 2 )
+		{
+		case 0 :
+			caveBomBom( world, w, h, y, j, scale ); //2nd type
+			break;
+		case 1 :
+			caveBomBom( world, w, h, y, j, scale );
+			break;
+		default:
+			break;
+		}
+		
+	} while ( j < w ) ;
+}
+
+// Créer le sol avec une marche aléatoire
+void linear( char** world, int w, int h, int dec = 1, int grs = 2 )
+{
+	int l = h * 3 / 4 ;
+	
+	for ( int j(0); j < w; j++ )
+	{
+		// Variation de la hauteur
+		l += rand() % ( 2 * dec + 1 ) ;
+		l -= dec ;
+		
+		// Sécurité limite
+		if ( l >= h ) l = h - 1 ;
+		if ( l < 0 ) l = 0 ;
+		
+		// Herbe
+		for ( int i(l); i < h && i < l + grs ; i ++ )
+		{
+			world[i][j] = 'M';
+		}
+		
+		for ( int i(l + grs); i < h; i ++ )
+		{
+			world[i][j] = '#';
+		}
+	}
+}
+
+// Fait apparaître une structure
+void popStruct( char** world, int w, int h, int nb )
+{
+	// Localisation
+	int j( rand() % w );
+	int i( rand() % h );
+	
+	while( i < h - 1 && world[i][j] == ' ' )
+		i ++ ;
+	
+	// Ouvrir le flux
+	string filename("Structs/");
+	filename += char( nb + 48 );
+	filename += ".stc";
+	
+	ifstream flux( filename.c_str() );
+	
+	// Faire pop la structure
+	string line;
+	
+	while( getline( flux, line) )
+	{
+		for ( unsigned int k(0); k < line.size(); k ++ )
+		{
+			install( world, w, h, i, j + k, line[k] );
+		}
+		i++;
+	}
+}
+
+// Procédure
+int main()
+{
+	srand( time(0) );
+	
+	// Création standard
+	int w(105), h(32);
+	char** world(0x0);
+	create( world, w, h );
+	empty( world, w, h );
+	
+	// Sol
+	linear( world, w, h );
+	
+	// Caves
+	caves( world, w, h );
+	
+	// Structures
+	popStruct( world, w, h, 0 );
+	popStruct( world, w, h, 1 );
+	
+	// Arbres
+	trees( world, w, h );
+	
+	// Bordure
+	border( world, w, h );
+	
+	// Affichage
+	display( world, w, h );
+	
+	return 0;
+}