C语言九宫格拼图
|-----|-----|-----|
| 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;
}