fork(4) download
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. public class Test
  5. {
  6. static Random rand = new Random();
  7. static int width = 79;
  8. static int height = 24;
  9. static char[] cells = new char[width * height];
  10. // Cells are ordered left-to-right, top-to-bottom
  11.  
  12. public static void Main()
  13. {
  14. GenerateRandomTerrain();
  15.  
  16. // pick a point on the surface as the cave entrance
  17. int caveX = 35;
  18. int caveY = 0;
  19. while (cells[caveY * width + caveX] == ' ')
  20. {
  21. caveY++;
  22. }
  23. // drill down until we are deep underground
  24. while (cells[caveY * width + caveX - 1] == ' ' ||
  25. cells[caveY * width + caveX + 1] == ' ')
  26. {
  27. cells[caveY * width + caveX] = '.';
  28. caveY++;
  29. }
  30.  
  31. // starting from the entrance, walk randomly within the terrain,
  32. // "carving out" the cave
  33. // make sure we do not create new entrances; the carving must not go
  34. // adjacent to an "open air" cell
  35. for (int i = 0; i < 1000; i++)
  36. {
  37. // "carve out" the current cell
  38. cells[caveY * width + caveX] = '.';
  39.  
  40. // Get random direction:
  41. // 0: up
  42. // 1: right
  43. // 2: down
  44. // 3: left
  45. int dir = rand.Next(4);
  46. switch (dir)
  47. {
  48. case 0: // up
  49. if (IsValidCaveCell(caveX, caveY + 1))
  50. {
  51. caveY++;
  52. }
  53. break;
  54. case 1: // right
  55. if (IsValidCaveCell(caveX + 1, caveY))
  56. {
  57. caveX++;
  58. }
  59. break;
  60. case 2: // down
  61. if (IsValidCaveCell(caveX, caveY - 1))
  62. {
  63. caveY--;
  64. }
  65. break;
  66. case 3: // left
  67. if (IsValidCaveCell(caveX - 1, caveY))
  68. {
  69. caveX--;
  70. }
  71. break;
  72. }
  73. }
  74.  
  75. // Show our results
  76. for (int y = 0; y < height; y++)
  77. {
  78. for (int x = 0; x < width; x++)
  79. {
  80. System.Console.Write(cells[y * width + x]);
  81. }
  82. System.Console.WriteLine();
  83. }
  84. }
  85.  
  86. static void GenerateRandomTerrain()
  87. {
  88. for (int x = 0; x < width; x++)
  89. {
  90. int elevation = rand.Next(height * 4 / 5, height);
  91. for (int y = 0; y < height; y++)
  92. {
  93. if (y < height - elevation)
  94. {
  95. // Open air
  96. cells[y * width + x] = ' ';
  97. }
  98. else
  99. {
  100. // Ground
  101. cells[y * width + x] = 'X';
  102. }
  103. }
  104. }
  105. }
  106.  
  107. static bool IsValidCaveCell(int x, int y)
  108. {
  109. // a cave cell is valid if:
  110. // - it doesn't exceed the world boundaries
  111. // - it isn't adjacent to an "open air" cell
  112. if (x < 0 || x >= width || y < 0 || y >= height)
  113. {
  114. // out of world bounds
  115. return false;
  116. }
  117. for (int dx = -1; dx <= 1; dx++)
  118. {
  119. if (x + dx < 0 || x + dx >= width)
  120. {
  121. continue;
  122. }
  123. for (int dy = -1; dy <= 1; dy++)
  124. {
  125. if (y + dy < 0 || y + dy >= height)
  126. {
  127. continue;
  128. }
  129. if (cells[(y + dy) * width + (x + dx)] == ' ')
  130. {
  131. // adjacent to "open air" cell
  132. return false;
  133. }
  134. }
  135. }
  136. return true;
  137. }
  138. }
Success #stdin #stdout 0.03s 33832KB
stdin
Standard input is empty
stdout
                                                                               
          X   XX  XXX     X                    X       X   XX   X  XX X  X     
        X XX  XX XXXX     X             X      X  X  X X X XX   X  XXXXX X X X 
   X XXXXXXXX XXXXXXX  XXXXX X X    X   XX XX  X  X  X X X XX  XXXXXXXXXXX X X 
XX X XXXXXXXXXXXXXXXXXXXXXXXXX X XX.XXXXXXXXXX X  X XX X X XX XXXXXXXXXXXX X XX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XX........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.......X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX...............XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX.X.XXXXXXXXXXXXX..X.........X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXX.....XXXXXXXXXXX...........XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX......XXXXXXXXXXXXX....X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXX.X......XX...X....XXX.X.XX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
.XXXXXXX.........X........XXX...XX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
......X..X.XX..X.X.............XXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
...........XXXXX...................XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
..........XXXXXX........X.....X....XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX