/* * this function makes a random maze with exactly one path between * any two points in the maze * * If you're curious about the algorithm, come talk to me. It's not very * complicated (although the code might be confusing) */ void makeMaze() { int num_visited = 1; int first; int finish_col; makeAllWalls(); markCell(0, 0); // mark the first cell as visited /* add the first cell (row 0, col 0) to the linked list of visited cells */ first = cellID(0, 0); annotateCell(0, 0, 0); while(num_visited < MAZE_SIZE * MAZE_SIZE) { int visit = rand() % num_visited; int cell = first; int row, col; int d; int nrow, ncol; findCell(cell, &row, &col); while (visit > 0) { cell = annotation(row, col); findCell(cell, &row, &col); visit -= 1; } d = rand() % 4; nrow = row; // row of neighbor cell ncol = col; // col of neighbor cell interpretDir(&nrow, &ncol, d); if (nrow >= 0 && nrow < MAZE_SIZE && ncol >= 0 && ncol < MAZE_SIZE && !isMarked(nrow, ncol)) { clearWall(row, col, d); num_visited += 1; markCell(nrow, ncol); annotateCell(nrow, ncol, first); first = cellID(nrow, ncol); } } start_col = rand() % MAZE_SIZE; start_col = 2 * start_col + 1; maze[0][start_col] &= ~WALL; finish_col = rand() % MAZE_SIZE; maze[MATRIX_SIZE - 1][2 * finish_col + 1] &= ~WALL; //maze[MATRIX_SIZE - 1][0] &= ~WALL; }
void clearWall(int row, int col, int dir) { int r = row * 2 + 1; int c = col * 2 + 1; interpretDir(&r, &c, dir); maze[r][c] &= ~WALL; }