static void recursive_deadend(short rn, const short *offsets, short srow, short scol) { short i, de; short drow, dcol, tunnel_dir; rooms[rn].is_room = R_DEADEND; dungeon[srow][scol] = TUNNEL; for (i = 0; i < 4; i++) { de = rn + offsets[i]; if (((de < 0) || (de >= MAXROOMS)) || (!(same_row(rn, de) || same_col(rn, de)))) { continue; } if (!(rooms[de].is_room & R_NOTHING)) { continue; } drow = (rooms[de].top_row + rooms[de].bottom_row) / 2; dcol = (rooms[de].left_col + rooms[de].right_col) / 2; if (same_row(rn, de)) { tunnel_dir = (rooms[rn].left_col < rooms[de].left_col) ? RIGHT : LEFT; } else { tunnel_dir = (rooms[rn].top_row < rooms[de].top_row) ? DOWN : UPWARD; } draw_simple_passage(srow, scol, drow, dcol, tunnel_dir); r_de = de; recursive_deadend(de, offsets, drow, dcol); } }
static void fill_it(int rn, boolean do_rec_de) { short i, tunnel_dir, door_dir, drow, dcol; short target_room, rooms_found = 0; short srow, scol, t; static short offsets[4] = {-1, 1, 3, -3}; boolean did_this = 0; for (i = 0; i < 10; i++) { srow = get_rand(0, 3); scol = get_rand(0, 3); t = offsets[srow]; offsets[srow] = offsets[scol]; offsets[scol] = t; } for (i = 0; i < 4; i++) { target_room = rn + offsets[i]; if (((target_room < 0) || (target_room >= MAXROOMS)) || (!(same_row(rn,target_room) || same_col(rn,target_room))) || (!(rooms[target_room].is_room & (R_ROOM | R_MAZE)))) { continue; } if (same_row(rn, target_room)) { tunnel_dir = (rooms[rn].left_col < rooms[target_room].left_col) ? RIGHT : LEFT; } else { tunnel_dir = (rooms[rn].top_row < rooms[target_room].top_row) ? DOWN : UPWARD; } door_dir = ((tunnel_dir + 4) % DIRS); if (rooms[target_room].doors[door_dir/2].oth_room != NO_ROOM) { continue; } if (((!do_rec_de) || did_this) || (!mask_room(rn, &srow, &scol, TUNNEL))) { srow = (rooms[rn].top_row + rooms[rn].bottom_row) / 2; scol = (rooms[rn].left_col + rooms[rn].right_col) / 2; } put_door(&rooms[target_room], door_dir, &drow, &dcol); rooms_found++; draw_simple_passage(srow, scol, drow, dcol, tunnel_dir); rooms[rn].is_room = R_DEADEND; dungeon[srow][scol] = TUNNEL; if ((i < 3) && (!did_this)) { did_this = 1; if (coin_toss()) { continue; } } if ((rooms_found < 2) && do_rec_de) { recursive_deadend(rn, offsets, srow, scol); } break; } }
void solve_r(std::vector<int> data) { std::vector<int>::iterator found = std::find(data.begin(), data.end(), 0); if ( found == data.end()) { std::cout << "---+---+---+---+---+---+---+---+---+" << std::endl; int limit = 0; for ( std::vector<int>::iterator itr = data.begin(); itr != data.end(); ++itr) { std::cout << std::setw(3) << *itr << "|" ; if ( limit == 8 ){ std::cout << std::endl; std::cout << "---+---+---+---+---+---+---+---+---+" << std::endl; limit = 0; } else { limit++; } } std::cout << std::endl << std::endl; return; } int i = (int)(found - data.begin()); std::set<int> excluded_numbers; for ( int j = 0; j < 81; j++) { if ( same_row(i,j) || same_col(i,j) || same_block(i,j)) { excluded_numbers.insert(data[j]); } } for ( int m = 1; m <= 9; m++) { std::set<int>::iterator found = excluded_numbers.find(m); if ( found == excluded_numbers.end()) { data[i] = m; solve_r(data); } } }
static int connect_rooms(short room1, short room2) { short row1, col1, row2, col2, dir; if ((!(rooms[room1].is_room & (R_ROOM | R_MAZE))) || (!(rooms[room2].is_room & (R_ROOM | R_MAZE)))) { return(0); } if (same_row(room1, room2) && (rooms[room1].left_col > rooms[room2].right_col)) { put_door(&rooms[room1], LEFT, &row1, &col1); put_door(&rooms[room2], RIGHT, &row2, &col2); dir = LEFT; } else if (same_row(room1, room2) && (rooms[room2].left_col > rooms[room1].right_col)) { put_door(&rooms[room1], RIGHT, &row1, &col1); put_door(&rooms[room2], LEFT, &row2, &col2); dir = RIGHT; } else if (same_col(room1, room2) && (rooms[room1].top_row > rooms[room2].bottom_row)) { put_door(&rooms[room1], UPWARD, &row1, &col1); put_door(&rooms[room2], DOWN, &row2, &col2); dir = UPWARD; } else if (same_col(room1, room2) && (rooms[room2].top_row > rooms[room1].bottom_row)) { put_door(&rooms[room1], DOWN, &row1, &col1); put_door(&rooms[room2], UPWARD, &row2, &col2); dir = DOWN; } else { return(0); } do { draw_simple_passage(row1, col1, row2, col2, dir); } while (rand_percent(4)); rooms[room1].doors[dir/2].oth_room = room2; rooms[room1].doors[dir/2].oth_row = row2; rooms[room1].doors[dir/2].oth_col = col2; rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_room = room1; rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_row = row1; rooms[room2].doors[(((dir+4)%DIRS)/2)].oth_col = col1; return(1); }