Blame onefile/gen-maze.c

a5e8d6
a5e8d6
#include <helianthus.h></helianthus.h>
a5e8d6
a5e8d6
a5e8d6
#define ROWS 12
a5e8d6
#define COLS 18
a5e8d6
a5e8d6
a5e8d6
int map[ROWS][COLS][3];
a5e8d6
a5e8d6
a5e8d6
int visit(int r, int c) {
a5e8d6
  if (r < 0 || c < 0 || r >= ROWS || c >= COLS) return FALSE;
a5e8d6
a5e8d6
  if (map[r][c][2]) return randomFloat()*100 < 2;
a5e8d6
  map[r][c][2] = TRUE;
a5e8d6
a5e8d6
  int ways[4] = {0, 1, 2, 3};
a5e8d6
  for(int i = 0; i < 4; ++i) {
a5e8d6
    int a = randomNumber(0, 3);
a5e8d6
    int b = randomNumber(0, 3);
a5e8d6
    int n = ways[a];
a5e8d6
    ways[a] = ways[b];
a5e8d6
    ways[b] = n;
a5e8d6
  }
a5e8d6
a5e8d6
  for(int i = 0; i < 4; ++i) {
a5e8d6
    switch(ways[i]) {
a5e8d6
    case 0:
a5e8d6
      if (visit(r, c-1)) map[r  ][c  ][0] = TRUE;
a5e8d6
      break;
a5e8d6
    case 1:
a5e8d6
      if (visit(r, c+1)) map[r  ][c+1][0] = TRUE;
a5e8d6
      break;
a5e8d6
    case 2:
a5e8d6
      if (visit(r-1, c)) map[r  ][c  ][1] = TRUE;
a5e8d6
      break;
a5e8d6
    case 3:
a5e8d6
      if (visit(r+1, c)) map[r+1][c  ][1] = TRUE;
a5e8d6
      break;
a5e8d6
    }
a5e8d6
  }
a5e8d6
a5e8d6
  return TRUE;
a5e8d6
}
a5e8d6
a5e8d6
a5e8d6
void generate() {
a5e8d6
  for(int r = 0; r < ROWS; ++r)
a5e8d6
    for(int c = 0; c < COLS; ++c)
a5e8d6
      for(int i = 0; i < 3; ++i)
a5e8d6
        map[r][c][i] = 0;
a5e8d6
  visit(0, 0);
a5e8d6
}
a5e8d6
a5e8d6
a5e8d6
a5e8d6
void init() {
a5e8d6
  generate();
a5e8d6
}
a5e8d6
a5e8d6
a5e8d6
void draw() {
a5e8d6
  double w = windowGetWidth();
a5e8d6
  double h = windowGetHeight();
a5e8d6
a5e8d6
  if (keyWentDown("space")) generate();
a5e8d6
a5e8d6
  saveState();
a5e8d6
  translate(w/2, h/2);
a5e8d6
  zoom(w/(COLS + 1));
a5e8d6
  translate(-COLS/2.0, -ROWS/2.0);
a5e8d6
a5e8d6
  strokeWidth(0.1);
a5e8d6
  for(int r = 0; r < ROWS; ++r) {
a5e8d6
    for(int c = 0; c < COLS; ++c) {
a5e8d6
      if (!map[r][c][0]) line(c, r, c, r+1);
a5e8d6
      if (!map[r][c][1]) line(c, r, c+1, r);
a5e8d6
    }
a5e8d6
  }
a5e8d6
  line(COLS, 0, COLS, ROWS);
a5e8d6
  line(0, ROWS, COLS, ROWS);
a5e8d6
a5e8d6
  restoreState();
a5e8d6
}
a5e8d6
a5e8d6
a5e8d6
int main() {
a5e8d6
  windowSetVariableFrameRate();
a5e8d6
  windowSetResizable(TRUE);
a5e8d6
  windowSetInit(&init);
a5e8d6
  windowSetDraw(&draw);
a5e8d6
  windowRun();
a5e8d6
}