c程序开始运行时显示一个迷宫地图, 迷宫中央有一只老鼠, 迷宫的右下方有一个粮仓。 游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动; 迷宫的墙足够结实,老鼠不能穿墙而过; 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙; 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败; 找出走出迷宫的所有路径,以及最短路径。 利用序列化功能实现迷宫地图文件的存盘和读出等功能代码
时间: 2024-03-22 21:41:36 浏览: 80
走迷宫迷宫的右下方有一粮仓
以下是一个基于控制台的C语言程序,实现了上述要求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define ROW 10 //迷宫行数
#define COL 20 //迷宫列数
#define WALL 1 //墙
#define ROAD 0 //路
#define MOUSE 'M' //老鼠
#define FOOD 'F' //粮仓
int maze[ROW][COL]; //迷宫地图
int mouse_row, mouse_col; //老鼠的位置
int food_row, food_col; //粮仓的位置
void init_maze(); //初始化迷宫地图
void print_maze(); //打印迷宫地图
void edit_maze(); //编辑迷宫地图
void move_mouse(); //移动老鼠
int check_result(); //检查游戏结果
void find_path(); //找出所有路径
int find_shortest_path(int path[][2], int num_path); //找出最短路径
int main()
{
int time_limit = 30; //规定的游戏时间
int start_time = time(NULL); //游戏开始时间
int end_time; //游戏结束时间
int result; //游戏结果
init_maze(); //初始化迷宫地图
print_maze(); //打印迷宫地图
while (1) {
if (_kbhit()) {
move_mouse(); //移动老鼠
print_maze(); //打印迷宫地图
}
end_time = time(NULL);
if (end_time - start_time >= time_limit) {
result = check_result(); //检查游戏结果
if (result == 1) {
printf("恭喜你,游戏成功!\n");
} else {
printf("很遗憾,游戏失败!\n");
}
break;
}
}
find_path(); //找出所有路径
return 0;
}
//初始化迷宫地图
void init_maze()
{
int i, j;
//初始化迷宫地图
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1) {
maze[i][j] = WALL;
} else {
maze[i][j] = ROAD;
}
}
}
//随机生成迷宫地图
srand((unsigned)time(NULL));
for (i = 1; i < ROW - 1; i++) {
for (j = 1; j < COL - 1; j++) {
if (rand() % 5 == 0) {
maze[i][j] = WALL;
}
}
}
//初始化老鼠和粮仓的位置
mouse_row = ROW / 2;
mouse_col = COL / 2;
food_row = ROW - 2;
food_col = COL - 2;
maze[mouse_row][mouse_col] = MOUSE;
maze[food_row][food_col] = FOOD;
}
//打印迷宫地图
void print_maze()
{
int i, j;
system("cls"); //清屏
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
switch (maze[i][j]) {
case WALL:
printf("#");
break;
case ROAD:
printf(" ");
break;
case MOUSE:
printf("M");
break;
case FOOD:
printf("F");
break;
default:
break;
}
}
printf("\n");
}
}
//编辑迷宫地图
void edit_maze()
{
int row, col;
printf("请输入要编辑的行和列(用空格隔开):");
scanf("%d %d", &row, &col);
if (maze[row][col] == WALL) {
maze[row][col] = ROAD;
} else {
maze[row][col] = WALL;
}
}
//移动老鼠
void move_mouse()
{
char ch = _getch(); //读取键盘输入
int next_row = mouse_row, next_col = mouse_col;
switch (ch) {
case 'w': //上移
next_row--;
break;
case 's': //下移
next_row++;
break;
case 'a': //左移
next_col--;
break;
case 'd': //右移
next_col++;
break;
default:
return;
}
if (maze[next_row][next_col] != WALL) {
maze[mouse_row][mouse_col] = ROAD;
mouse_row = next_row;
mouse_col = next_col;
maze[mouse_row][mouse_col] = MOUSE;
}
}
//检查游戏结果
int check_result()
{
if (mouse_row == food_row && mouse_col == food_col) {
return 1; //游戏成功
} else {
return 0; //游戏失败
}
}
//找出所有路径
void find_path()
{
int path[ROW * COL][2]; //保存路径的数组
int num_path = 0; //路径数量
int i, j;
//递归找出所有路径
void find_path_recursion(int row, int col)
{
if (row == food_row && col == food_col) {
//找到一条路径,保存到path数组中
for (i = 0; i < num_path; i++) {
if (path[i][0] == row && path[i][1] == col) {
return; //已经存在相同的路径,不重复保存
}
}
path[num_path][0] = row;
path[num_path][1] = col;
num_path++;
return;
}
//向上走
if (maze[row - 1][col] == ROAD) {
maze[row][col] = WALL; //标记当前位置为已走过
find_path_recursion(row - 1, col);
maze[row][col] = ROAD; //恢复当前位置状态
}
//向下走
if (maze[row + 1][col] == ROAD) {
maze[row][col] = WALL;
find_path_recursion(row + 1, col);
maze[row][col] = ROAD;
}
//向左走
if (maze[row][col - 1] == ROAD) {
maze[row][col] = WALL;
find_path_recursion(row, col - 1);
maze[row][col] = ROAD;
}
//向右走
if (maze[row][col + 1] == ROAD) {
maze[row][col] = WALL;
find_path_recursion(row, col + 1);
maze[row][col] = ROAD;
}
}
find_path_recursion(mouse_row, mouse_col);
//打印所有路径
printf("所有路径:\n");
for (i = 0; i < num_path; i++) {
for (j = 0; j < 2; j++) {
printf("(%d,%d)", path[i][0], path[i][1]);
if (j == 0) {
printf("->");
}
}
printf("\n");
}
//找出最短路径
int shortest_path = find_shortest_path(path, num_path);
printf("最短路径长度:%d\n", shortest_path);
}
//找出最短路径
int find_shortest_path(int path[][2], int num_path)
{
int i, j, distance, shortest_path = ROW * COL;
for (i = 0; i < num_path; i++) {
distance = abs(path[i][0] - food_row) + abs(path[i][1] - food_col);
if (distance < shortest_path) {
shortest_path = distance;
}
}
return shortest_path;
}
```
这个程序实现了初始化迷宫地图、打印迷宫地图、编辑迷宫地图、移动老鼠、检查游戏结果、找出所有路径、找出最短路径等功能。你可以根据自己的需求进行修改和扩展。
阅读全文