帮我使用c语言,使用Dijkstra最短路径算法写一个围住神经猫的小游戏代码,玩家需要设置障碍来阻止猫的逃出,猫需要尽可能以最短路径出逃,逃到墙边就算失败
时间: 2024-03-18 17:40:09 浏览: 18
好的,下面是使用C语言编写的围住神经猫小游戏代码,使用Dijkstra最短路径算法实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWS 10 // 迷宫行数
#define COLS 10 // 迷宫列数
#define WALL '#' // 墙
#define CAT 'C' // 神经猫
#define EXIT 'E' // 出口
#define OBSTACLE 'O' // 障碍
#define PATH '.' // 路径
// 迷宫地图
char maze[ROWS][COLS] = {
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
{'#', '.', '.', '.', '.', '.', '.', '.', '.', '#'},
{'#', '.', '#', '#', '#', '.', '#', '#', '.', '#'},
{'#', '.', '.', '.', '#', '.', '.', '#', '.', '#'},
{'#', '#', '#', '.', '#', '.', '#', '#', '.', '#'},
{'#', '.', '.', '.', '.', '.', '.', '#', '.', '#'},
{'#', '.', '#', '.', '#', '.', '#', '#', '.', '#'},
{'#', '.', '.', '#', '.', '.', '.', '.', '.', '#'},
{'#', '#', '.', '#', '.', '#', '#', '.', '.', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
};
// Dijkstra算法计算最短路径
int dijkstra(int start_x, int start_y, int end_x, int end_y, int obstacles[ROWS][COLS])
{
int i, j, k, min, current;
int dist[ROWS][COLS] = {0}; // 距离数组
int visited[ROWS][COLS] = {0}; // 访问标记数组
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
// 初始化距离数组
for(i = 0; i < ROWS; i++) {
for(j = 0; j < COLS; j++) {
dist[i][j] = 1000000; // 距离初始化为一个较大的数
}
}
// 初始节点距离为0
dist[start_x][start_y] = 0;
// Dijkstra算法核心部分
for(k = 0; k < ROWS * COLS; k++) {
min = 1000000;
for(i = 0; i < ROWS; i++) {
for(j = 0; j < COLS; j++) {
if(!visited[i][j] && dist[i][j] < min) {
min = dist[i][j];
current = i * COLS + j;
}
}
}
visited[current / COLS][current % COLS] = 1;
if(current / COLS == end_x && current % COLS == end_y) {
return dist[end_x][end_y];
}
for(i = 0; i < 4; i++) {
int x = current / COLS + dx[i];
int y = current % COLS + dy[i];
if(x < 0 || x >= ROWS || y < 0 || y >= COLS) {
continue;
}
if(obstacles[x][y]) {
continue;
}
if(dist[current / COLS][current % COLS] + 1 < dist[x][y]) {
dist[x][y] = dist[current / COLS][current % COLS] + 1;
}
}
}
return -1;
}
int main()
{
int i, j;
int cat_x, cat_y, exit_x, exit_y;
int obstacles[ROWS][COLS] = {0}; // 障碍标记数组
// 找出神经猫和出口的位置
for(i = 0; i < ROWS; i++) {
for(j = 0; j < COLS; j++) {
if(maze[i][j] == CAT) {
cat_x = i;
cat_y = j;
} else if(maze[i][j] == EXIT) {
exit_x = i;
exit_y = j;
}
}
}
// 游戏开始
printf("围住神经猫小游戏开始!\n");
while(1) {
// 输出迷宫地图
for(i = 0; i < ROWS; i++) {
for(j = 0; j < COLS; j++) {
printf("%c", maze[i][j]);
}
printf("\n");
}
// 玩家设置障碍
printf("请设置障碍(输入行列坐标,以空格分隔,例如:2 3),输入-1结束:\n");
int obstacle_x, obstacle_y;
scanf("%d %d", &obstacle_x, &obstacle_y);
if(obstacle_x == -1 && obstacle_y == -1) {
break;
}
if(obstacle_x < 0 || obstacle_x >= ROWS || obstacle_y < 0 || obstacle_y >= COLS) {
printf("输入无效!\n");
continue;
}
if(maze[obstacle_x][obstacle_y] == WALL || maze[obstacle_x][obstacle_y] == OBSTACLE) {
printf("此处不能设置障碍!\n");
continue;
}
maze[obstacle_x][obstacle_y] = OBSTACLE;
obstacles[obstacle_x][obstacle_y] = 1;
// 神经猫逃跑
int min_distance = 1000000;
int next_x, next_y;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
for(i = 0; i < 4; i++) {
int x = cat_x + dx[i];
int y = cat_y + dy[i];
if(x < 0 || x >= ROWS || y < 0 || y >= COLS) {
continue;
}
if(obstacles[x][y]) {
continue;
}
int distance = dijkstra(x, y, exit_x, exit_y, obstacles);
if(distance < min_distance) {
min_distance = distance;
next_x = x;
next_y = y;
}
}
if(min_distance == 1000000) {
printf("神经猫无路可逃,你赢了!\n");
break;
}
maze[cat_x][cat_y] = PATH;
maze[next_x][next_y] = CAT;
cat_x = next_x;
cat_y = next_y;
// 判断是否围住神经猫
if((cat_x == 0 || cat_x == ROWS - 1 || cat_y == 0 || cat_y == COLS - 1) && maze[cat_x][cat_y] == CAT) {
printf("神经猫逃到墙边了,你输了!\n");
break;
}
}
return 0;
}
```
以上是使用Dijkstra最短路径算法实现的围住神经猫小游戏代码,玩家可以通过设置障碍来阻止神经猫的逃出,神经猫会尽可能以最短路径出逃,逃到墙边就算失败。