main.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. # include <iostream>
  2. # include <ctime>
  3. # include <cstdlib>
  4. # include <string>
  5. # include <fstream>
  6. /*
  7. Génère un monde automatiquement.
  8. */
  9. using namespace std ;
  10. // Place un bloc en évitant la sortie de tableau
  11. void install( char** world, int w, int h, int y, int x, char blc )
  12. {
  13. if ( x < 0 || x >= w || y < 0 || y >= h )
  14. return ;
  15. world[y][x] = blc;
  16. }
  17. // Dessine une ligne verticale
  18. void drawVLine( char** world, int w, int h, int y1, int y2, int x, char blc )
  19. {
  20. for ( int i(y1); i <= y2; i ++ )
  21. {
  22. install( world, w, h, i, x, blc ) ;
  23. }
  24. }
  25. // Dessine un cube
  26. void drawCube( char** world, int w, int h, int y, int x, int lx, int ly, char blc )
  27. {
  28. for ( int i(y); i < y + ly; i ++ )
  29. for ( int j(x); j < x + lx; j ++ )
  30. install( world, w, h, i, j, blc );
  31. }
  32. // Créer le terrain
  33. void create( char** &world, int w = 15, int h = 10 )
  34. {
  35. // Création
  36. world = new char*[h];
  37. for ( int i(0); i < h; i ++ )
  38. {
  39. world[i] = new char[w];
  40. }
  41. }
  42. // Réinitialise le terrain avec des espaces
  43. void empty( char** world, int w, int h )
  44. {
  45. for ( int i(0); i < h; i ++ )
  46. for ( int j(0); j < w; j++ )
  47. {
  48. world[i][j] = ' ';
  49. }
  50. }
  51. // Réalise une bordure d'étoiles
  52. void putStar( char** world, int y, int x )
  53. {
  54. if ( world[y][x] == ' ' )
  55. world[y][x] = '*';
  56. }
  57. void border( char** world, int w, int h )
  58. {
  59. for ( int i(0); i < h; i ++ )
  60. {
  61. putStar(world, i, 0);
  62. putStar(world, i, w - 1);
  63. }
  64. for ( int j(1); j < w - 1 ; j ++ )
  65. {
  66. putStar(world, 0, j);
  67. putStar(world, h - 1, j);
  68. }
  69. }
  70. // Affiche le terrain
  71. void display( char** world, int w, int h )
  72. {
  73. for ( int i(0); i < h; i ++ )
  74. {
  75. for ( int j(0); j < w; j++ )
  76. {
  77. cout << world[i][j];
  78. }
  79. cout << endl ;
  80. }
  81. }
  82. // Plante des arbres
  83. void trees( char** world, int w, int h, int space = 10, int dec = 5, int maxray = 3, int maxtall = 7 )
  84. {
  85. int j(0);
  86. do
  87. {
  88. // Où poser la graine
  89. j += space ;
  90. j += rand() % ( 2 * dec ) + 1 ;
  91. j -= dec ;
  92. int i(h - 2);
  93. while ( i > 0 && world[i][j] != ' ' )
  94. i -- ;
  95. // Créer un arbre
  96. int ray( rand() % maxray + 1 );
  97. int tall( rand() % maxtall + 1 );
  98. if ( world[i + 1][j] == 'M' )
  99. {
  100. drawCube( world, w, h, i - 2*ray - tall - 1, j - ray, 2*ray + 1, 2*ray + 1, 'o' );
  101. drawVLine( world, w, h, i - tall - 1, i, j, 'H' );
  102. }
  103. } while ( j < w ) ;
  104. }
  105. // Créer une grotte carrée
  106. void caveSquare( char** world, int w, int h, int y, int x, int scale = 5, char blc = ' ' )
  107. {
  108. drawCube( world, w, h, y - scale / 2, x - scale / 2, scale, scale, blc );
  109. }
  110. // Créer une grotte bombom
  111. void caveBomBom( char** world, int w, int h, int y, int x, int scale = 4, int burst = 4, char blc = ' ' )
  112. {
  113. for ( int k(0); k < burst ; k ++ )
  114. {
  115. int s( scale );
  116. int i(y), j(x);
  117. while( s > 0 )
  118. {
  119. i += rand() % ( s + 1 ) ;
  120. i -= s / 2 ;
  121. j += rand() % ( s + 1 ) ;
  122. j -= s / 2 ;
  123. caveSquare( world, w, h, i, j, s );
  124. s -- ;
  125. }
  126. }
  127. }
  128. // Créer les grottes
  129. void caves( char** world, int w, int h, char blc = ' ', int space = 20, int dec = 15 )
  130. {
  131. int j(0);
  132. do
  133. {
  134. // Intervalle pour faire une cave
  135. j += space ;
  136. j += rand() % ( 2 * dec ) + 1 ;
  137. j -= dec ;
  138. int i(0);
  139. while ( i < h - 2 && world[i][j] == ' ' )
  140. i ++ ;
  141. if ( i == h )
  142. return ;
  143. // Randomiser la hauteur de la cave
  144. int y(0);
  145. y = rand() % ( h - i ) + i;
  146. // Randomiser la taille
  147. int scale( rand() % 6 + 1 );
  148. // Randomiser le type
  149. switch( rand() % 2 )
  150. {
  151. case 0 :
  152. caveBomBom( world, w, h, y, j, scale ); //2nd type
  153. break;
  154. case 1 :
  155. caveBomBom( world, w, h, y, j, scale );
  156. break;
  157. default:
  158. break;
  159. }
  160. } while ( j < w ) ;
  161. }
  162. // Créer le sol avec une marche aléatoire
  163. void linear( char** world, int w, int h, int dec = 1, int grs = 2 )
  164. {
  165. int l = h * 3 / 4 ;
  166. for ( int j(0); j < w; j++ )
  167. {
  168. // Variation de la hauteur
  169. l += rand() % ( 2 * dec + 1 ) ;
  170. l -= dec ;
  171. // Sécurité limite
  172. if ( l >= h ) l = h - 1 ;
  173. if ( l < 0 ) l = 0 ;
  174. // Herbe
  175. for ( int i(l); i < h && i < l + grs ; i ++ )
  176. {
  177. world[i][j] = 'M';
  178. }
  179. for ( int i(l + grs); i < h; i ++ )
  180. {
  181. world[i][j] = '#';
  182. }
  183. }
  184. }
  185. // Fait apparaître une structure
  186. void popStruct( char** world, int w, int h, int nb )
  187. {
  188. // Localisation
  189. int j( rand() % w );
  190. int i( rand() % h );
  191. while( i < h - 1 && world[i][j] == ' ' )
  192. i ++ ;
  193. // Ouvrir le flux
  194. string filename("Structs/");
  195. filename += char( nb + 48 );
  196. filename += ".stc";
  197. ifstream flux( filename.c_str() );
  198. // Faire pop la structure
  199. string line;
  200. while( getline( flux, line) )
  201. {
  202. for ( unsigned int k(0); k < line.size(); k ++ )
  203. {
  204. install( world, w, h, i, j + k, line[k] );
  205. }
  206. i++;
  207. }
  208. }
  209. // Procédure
  210. int main()
  211. {
  212. srand( time(0) );
  213. // Création standard
  214. int w(105), h(32);
  215. char** world(0x0);
  216. create( world, w, h );
  217. empty( world, w, h );
  218. // Sol
  219. linear( world, w, h );
  220. // Caves
  221. caves( world, w, h );
  222. // Structures
  223. popStruct( world, w, h, 0 );
  224. popStruct( world, w, h, 1 );
  225. // Arbres
  226. trees( world, w, h );
  227. // Bordure
  228. border( world, w, h );
  229. // Affichage
  230. display( world, w, h );
  231. return 0;
  232. }