用C语言写一个重排九宫游戏,要求如下:“重排九宫”,将1~8的数字随机放在3X3九个格子中,余下一个格子为空。推动空格使8个数字排列,最后使数字从小到大排列即为完成。要求可以用键盘操纵空格,并记录玩家花费的时间。请使用C语言编写该项目。
时间: 2024-01-01 11:03:18 浏览: 55
好的,我来回答你的问题。
以下是一个用C语言编写的重排九宫游戏的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define ROW 3
#define COL 3
#define BLANK_ROW 2
#define BLANK_COL 2
int board[ROW][COL]; // 存储数字的九宫格
int blank_row, blank_col; // 记录空格的位置
int move_count = 0; // 记录移动步数
clock_t start_time; // 记录游戏开始时间
void init_board() { // 初始化九宫格
int nums[ROW * COL - 1]; // 存储数字的数组
int k = 0;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (i == BLANK_ROW && j == BLANK_COL) {
board[i][j] = 0; // 0 表示空格
blank_row = i;
blank_col = j;
} else {
nums[k++] = i * COL + j + 1;
}
}
}
srand((unsigned int)time(NULL)); // 初始化随机数生成器
for (int i = ROW * COL - 2; i > 0; i--) { // Fisher-Yates shuffle
int j = rand() % (i + 1);
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
k = 0;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (i == BLANK_ROW && j == BLANK_COL) {
continue;
}
board[i][j] = nums[k++];
}
}
}
void print_board() { // 打印九宫格
system("cls"); // 清屏
printf("Move count: %d\n", move_count);
printf("Time: %.2f seconds\n", (double)(clock() - start_time) / CLOCKS_PER_SEC);
printf("+---+---+---+\n");
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
printf("|");
if (board[i][j] == 0) {
printf(" ");
} else {
printf(" %d ", board[i][j]);
}
}
printf("|\n");
printf("+---+---+---+\n");
}
}
void move_blank(int row, int col) { // 移动空格
if (row < 0 || row >= ROW || col < 0 || col >= COL) {
return;
}
if (row == blank_row && col == blank_col) {
return;
}
if (row == blank_row) {
int delta = col - blank_col;
int step = delta / abs(delta);
for (int i = blank_col + step; i != col + step; i += step) {
board[row][i - step] = board[row][i];
}
board[row][col] = 0;
blank_col = col;
move_count++;
} else if (col == blank_col) {
int delta = row - blank_row;
int step = delta / abs(delta);
for (int i = blank_row + step; i != row + step; i += step) {
board[i - step][col] = board[i][col];
}
board[row][col] = 0;
blank_row = row;
move_count++;
}
}
int main() {
init_board();
start_time = clock();
print_board();
while (1) {
int ch = getch(); // 获取键盘输入
if (ch == 27 || ch == 'q') { // ESC 或 Q 键退出
break;
} else if (ch == 72) { // 上箭头键
move_blank(blank_row - 1, blank_col);
} else if (ch == 80) { // 下箭头键
move_blank(blank_row + 1, blank_col);
} else if (ch == 75) { // 左箭头键
move_blank(blank_row, blank_col - 1);
} else if (ch == 77) { // 右箭头键
move_blank(blank_row, blank_col + 1);
}
print_board();
if (board[0][0] == 1 && board[0][1] == 2 && board[0][2] == 3 &&
board[1][0] == 4 && board[1][1] == 5 && board[1][2] == 6 &&
board[2][0] == 7 && board[2][1] == 8 && board[2][2] == 0) { // 判断是否完成
printf("Congratulations! You win!\n");
printf("Total move count: %d\n", move_count);
printf("Total time: %.2f seconds\n", (double)(clock() - start_time) / CLOCKS_PER_SEC);
break;
}
}
return 0;
}
```
代码实现中使用了`getch()`函数来获取键盘输入,用`clock()`函数来记录开始时间和游戏时间,用`system("cls")`函数来清屏,用`rand()`函数和 Fisher-Yates shuffle 算法来随机打乱数字。在移动空格时,如果移动的方向不合法或者目标位置就是空格的位置,就不进行移动。
运行程序后,可以用方向键来移动空格,用 ESC 键或 Q 键退出游戏。如果完成游戏,程序会输出恭喜信息和玩家的步数和时间。
阅读全文