Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

172 Zeilen
3.2 KiB

  1. #include <stdlib.h>
  2. #include "common.h"
  3. static void draw_wall( game *g, int *wall );
  4. /* Init tunnel */
  5. tunnel * create_tunnel( game *g, int w, int h )
  6. {
  7. int i;
  8. tunnel *t = malloc(sizeof(tunnel));
  9. t->left = malloc(h*sizeof(int));
  10. t->right = malloc(h*sizeof(int));
  11. t->w = w;
  12. t->h = h;
  13. if( t->w >= g->w )
  14. {
  15. t->left[0] = -1;
  16. t->right[0] = g->w;
  17. for( i = 0; i < g->h; i++ )
  18. {
  19. t->left[i] = -1;
  20. t->right[i] = g->w;
  21. }
  22. }
  23. else
  24. {
  25. t->left[0] = (g->w - w) / 2;
  26. t->right[0] = (g->w + w) / 2;
  27. /* Yeah, sub-efficient, but less code to do :-) */
  28. for( i = 0; i < g->h; i++ )
  29. {
  30. update_tunnel( g, t );
  31. }
  32. }
  33. return t;
  34. }
  35. void free_tunnel( tunnel *t )
  36. {
  37. free( t->left );
  38. free( t->right );
  39. free( t );
  40. }
  41. void draw_tunnel( game *g, tunnel *t )
  42. {
  43. /* Print tunnel */
  44. draw_wall( g, t->left );
  45. draw_wall( g, t->right );
  46. }
  47. void update_tunnel( game *g, tunnel *t )
  48. {
  49. static int const delta[] = { -2, -1, 1, 2 };
  50. int i,j,k;
  51. /* Slide tunnel one block vertically */
  52. for( i = t->h; i--; )
  53. {
  54. t->left[i+1] = t->left[i];
  55. t->right[i+1] = t->right[i];
  56. }
  57. /* Generate new values */
  58. i = delta[GET_RAND(0,4)];
  59. j = delta[GET_RAND(0,4)];
  60. /* Check in which direction we need to alter tunnel */
  61. if( t->right[1] - t->left[1] < t->w )
  62. {
  63. /* Not wide enough */
  64. if( i > j )
  65. {
  66. k = j; j = i; i = k;
  67. }
  68. }
  69. else if( t->right[1] - t->left[1] - 2 > t->w )
  70. {
  71. /* Too wide */
  72. if( i < j )
  73. {
  74. k = j; j = i; i = k;
  75. }
  76. }
  77. else
  78. {
  79. /* No need to mess with i and j: width is OK */
  80. }
  81. /* If width doesn't exceed game size, update coords */
  82. if( t->w <= g->w || t->right[1] - t->left[1] < t->w )
  83. {
  84. t->left[0] = t->left[1] + i;
  85. t->right[0] = t->right[1] + j;
  86. }
  87. else
  88. {
  89. t->left[0] = -1;
  90. t->right[0] = g->w;
  91. }
  92. if( t->w > g->w )
  93. {
  94. if( t->left[0] < 0 && t->right[0] < g->w - 2 )
  95. {
  96. t->left[0] = t->left[1] + 1;
  97. }
  98. if( t->left[0] > 1 && t->right[0] > g->w - 1 )
  99. {
  100. t->right[0] = t->right[1] - 1;
  101. }
  102. }
  103. else
  104. {
  105. if( t->left[0] < 0 )
  106. {
  107. t->left[0] = t->left[1] + 1;
  108. }
  109. if( t->right[0] > g->w - 1 )
  110. {
  111. t->right[0] = t->right[1] - 1;
  112. }
  113. }
  114. }
  115. static void draw_wall( game *g, int *wall )
  116. {
  117. int i;
  118. for( i = 0; i < g->h ; i++ )
  119. {
  120. char c;
  121. if( wall[i] < 0 || wall[i] >= g->w )
  122. {
  123. continue;
  124. }
  125. if( wall[i] > wall[i+1] )
  126. {
  127. c = wall[i] > wall[i-1] ? '>' : '/';
  128. }
  129. else
  130. {
  131. c = wall[i] > wall[i-1] ? '\\' : '<';
  132. }
  133. GFX_COLOR( RED );
  134. if( wall[i] == wall[i+1] + 2 )
  135. {
  136. GFX_GOTO( wall[i] - 1, i );
  137. GFX_WRITE( '_' );
  138. }
  139. else
  140. {
  141. GFX_GOTO( wall[i], i );
  142. }
  143. GFX_WRITE( c );
  144. GFX_WRITE( '#' );
  145. GFX_WRITE( c );
  146. if( wall[i] == wall[i+1] - 2 ) GFX_WRITE( '_' );
  147. }
  148. }