c语言九宫格拼图实现代码
时间: 2023-08-12 09:40:53 浏览: 182
以下是一个简单的 C 语言代码实现九宫格拼图的例子:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 3 // 拼图大小
void init_board(int board[][SIZE]); // 初始化棋盘
void shuffle_board(int board[][SIZE]); // 洗牌
void print_board(int board[][SIZE]); // 打印棋盘
int is_win(int board[][SIZE]); // 判断是否获胜
void move(int board[][SIZE], int direction); // 移动棋子
int main()
{
int board[SIZE][SIZE];
int direction;
char input;
srand(time(NULL)); // 随机种子
init_board(board); // 初始化棋盘
shuffle_board(board); // 洗牌
while (!is_win(board)) {
print_board(board);
printf("请输入移动方向(上:w,下:s,左:a,右:d):");
scanf(" %c", &input);
switch (input) {
case 'w':
direction = 1;
break;
case 's':
direction = 2;
break;
case 'a':
direction = 3;
break;
case 'd':
direction = 4;
break;
default:
printf("无效的输入!\n");
continue;
}
move(board, direction);
}
printf("恭喜你获胜!\n");
return 0;
}
void init_board(int board[][SIZE])
{
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
board[i][j] = i * SIZE + j + 1;
}
}
board[SIZE - 1][SIZE - 1] = 0; // 最后一个格子为空白
}
void shuffle_board(int board[][SIZE])
{
int i, j, k;
for (k = 0; k < 1000; k++) { // 洗牌1000次
i = rand() % SIZE;
j = rand() % SIZE;
if (board[i][j] == 0) { // 空白格子不动
k--;
continue;
}
switch (rand() % 4) { // 随机选择一个方向
case 0: // 上
if (i > 0) {
board[i][j] ^= board[i - 1][j] ^= board[i][j] ^= board[i - 1][j];
}
break;
case 1: // 下
if (i < SIZE - 1) {
board[i][j] ^= board[i + 1][j] ^= board[i][j] ^= board[i + 1][j];
}
break;
case 2: // 左
if (j > 0) {
board[i][j] ^= board[i][j - 1] ^= board[i][j] ^= board[i][j - 1];
}
break;
case 3: // 右
if (j < SIZE - 1) {
board[i][j] ^= board[i][j + 1] ^= board[i][j] ^= board[i][j + 1];
}
break;
}
}
}
void print_board(int board[][SIZE])
{
int i, j;
printf("\n");
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] == 0) {
printf(" "); // 空白格子用三个空格表示
} else {
printf("%2d ", board[i][j]);
}
}
printf("\n");
}
}
int is_win(int board[][SIZE])
{
int i, j;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] != i * SIZE + j + 1) {
return 0; // 棋子未排列完成
}
}
}
return 1; // 棋子已排列完成
}
void move(int board[][SIZE], int direction)
{
int i, j, x, y;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
if (board[i][j] == 0) { // 找到空白格子的位置
x = i;
y = j;
break;
}
}
}
switch (direction) {
case 1: // 上
if (x > 0) {
board[x][y] ^= board[x - 1][y] ^= board[x][y] ^= board[x - 1][y];
} else {
printf("无效的移动!\n");
}
break;
case 2: // 下
if (x < SIZE - 1) {
board[x][y] ^= board[x + 1][y] ^= board[x][y] ^= board[x + 1][y];
} else {
printf("无效的移动!\n");
}
break;
case 3: // 左
if (y > 0) {
board[x][y] ^= board[x][y - 1] ^= board[x][y] ^= board[x][y - 1];
} else {
printf("无效的移动!\n");
}
break;
case 4: // 右
if (y < SIZE - 1) {
board[x][y] ^= board[x][y + 1] ^= board[x][y] ^= board[x][y + 1];
} else {
printf("无效的移动!\n");
}
break;
default:
printf("无效的移动!\n");
break;
}
}
```
这个例子使用了一个 3x3 的棋盘,初始化时将数字 1-9 放入相应的位置,然后洗牌,最后通过移动棋子使其重新排列。在输入移动方向时,w、s、a、d 分别表示上、下、左、右。
阅读全文