|-----|-----|-----|
|  1  |  3  |  5  |
|-----|-----|-----|
|  8  |  7  |  2  |
|-----|-----|-----|
|  6  |  4  |     |
|-----|-----|-----|

大概是这样一个 3*3 的棋盘,去掉右下角然后打乱,通过上下左右移动使之拼成正确的顺序

uint8_t board[COLS * ROWS] = { 0 };

/* 找到那个空位 */
uint32_t find_blank(void) {
    for (int i = 0; i < COLS * ROWS; i++) {
        if (board[i] == 0) {
            break;
        }
    }
    return i;
}

void init_board(void) {
    /* 顺序填充面板,最后一个空着 */
    for (int i = 0; i < COLS * ROWS - 1; i++) {
        board[i] = i + 1;
    }

    /* Fisher-Yates 洗牌算法 */
    for (int i = COLS * ROWS - 1; i > 0; i--) {
        int j = rand() % (i + 1);
        int temp = board[i];
        board[i] = board[j];
        board[j] = temp;
    }
}

void move_up(void) {
    uint32_t i = find_blank();
    if (i < COLS * (ROWS - 1)) {
        board[i] = board[i + COLS];
        board[i + COLS] = 0;
        return 1;
    }
    return 0;
}

void move_down(void) {
    uint32_t i = find_blank();
    if (i >= ROWS) {
        board[i] = board[i - COLS];
        board[i - COLS] = 0;
        return 1;
    }
    return 0;
}

void move_left(void) {
    uint32_t i = find_blank();
    if (i % COLS < COLS - 1) {
        board[i] = board[i + 1];
        board[i + 1] = 0;
        return 1;
    }
    return 0;
}

void move_right(void) {
    uint32_t i = find_blank();
    if (i % COLS > 0) {
        board[i] = board[i - 1];
        board[i - 1] = 0;
        return 1;
    }
    return 0;
}

判断游戏结束

这个游戏只有胜利才是结束条件

int is_success(void) {
    for (int i = 0; i < COLS * ROWS - 1; i++) { // 最后一个单元格不算
        if (board[i] != i + 1) {
            return 0;
        }
    }
    return 1;
}

标签: none

添加新评论