Example #1
0
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);
    }
}
Example #2
0
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);
        }
    }
}
Example #3
0
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;
    }
}
Example #4
0
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);
}