帮我使用c语言贪心算法写一个围住神经猫的小游戏代码,玩家需要设置障碍来阻止猫的逃出
时间: 2024-03-18 11:39:51 浏览: 56
好的,下面是一个简单的围住神经猫游戏的代码实现,使用了贪心算法,希望能够帮到您:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#define ROWS 7 // 地图行数
#define COLS 7 // 地图列数
// 定义节点结构体
typedef struct {
int row;
int col;
} Node;
// 地图、障碍和猫的状态,0表示空,1表示障碍,2表示猫
int map[ROWS][COLS] = {0};
bool obstacles[ROWS][COLS] = {false};
Node cat;
// 随机生成猫的位置
void initCat() {
srand((unsigned int)time(NULL));
int row = rand() % ROWS;
int col = rand() % COLS;
cat.row = row;
cat.col = col;
map[row][col] = 2;
}
// 显示地图
void showMap() {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (map[i][j] == 0) printf(" ");
if (map[i][j] == 1) printf("■ ");
if (map[i][j] == 2) printf("★ ");
}
printf("\n");
}
}
// 判断猫是否被包围
bool isCatTrapped() {
// 如果猫在边界上,那么它就没有被围住
if (cat.row == 0 || cat.row == ROWS - 1 || cat.col == 0 || cat.col == COLS - 1) {
return false;
}
// 判断猫周围是否存在空位
if (map[cat.row - 1][cat.col] == 0 || map[cat.row + 1][cat.col] == 0
|| map[cat.row][cat.col - 1] == 0 || map[cat.row][cat.col + 1] == 0) {
return false;
}
// 如果猫周围的四个方向上都有障碍,那么猫就被困住了
if (map[cat.row - 1][cat.col] == 1 && map[cat.row + 1][cat.col] == 1
&& map[cat.row][cat.col - 1] == 1 && map[cat.row][cat.col + 1] == 1) {
return true;
}
return false;
}
// 玩家设置障碍
void setObstacle() {
int row, col;
printf("请输入障碍的行和列(以空格分隔,例如:1 2):");
scanf("%d %d", &row, &col);
if (row < 0 || row >= ROWS || col < 0 || col >= COLS) {
printf("输入的位置不合法,请重新输入!\n");
setObstacle();
return;
}
if (map[row][col] == 2) {
printf("不能在猫的位置设置障碍,请重新输入!\n");
setObstacle();
return;
}
if (obstacles[row][col]) {
printf("该位置已经设置了障碍,请重新输入!\n");
setObstacle();
return;
}
obstacles[row][col] = true;
map[row][col] = 1;
}
// 猫随机移动
void moveCat() {
// 枚举四个方向,计算每个方向上的距离
int minDistance = ROWS * COLS;
Node next;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (i == 0 && j == 0) continue;
int row = cat.row + i;
int col = cat.col + j;
if (row < 0 || row >= ROWS || col < 0 || col >= COLS) continue;
if (map[row][col] == 1) continue;
int distance = abs(row - 0) + abs(row - ROWS + 1) + abs(col - 0) + abs(col - COLS + 1);
if (distance < minDistance) {
minDistance = distance;
next.row = row;
next.col = col;
}
}
}
// 更新猫的位置
map[cat.row][cat.col] = 0;
map[next.row][next.col] = 2;
cat.row = next.row;
cat.col = next.col;
}
int main() {
// 初始化地图和障碍
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (i == 0 || i == ROWS - 1 || j == 0 || j == COLS - 1) {
map[i][j] = 1;
}
}
}
// 初始化猫的位置
initCat();
// 游戏开始
printf("==========================\n");
printf("欢迎来到围住神经猫的游戏!\n");
printf("==========================\n\n");
while (true) {
printf("当前地图状态:\n");
showMap();
if (isCatTrapped()) {
printf("游戏结束,神经猫被成功困住了!\n");
break;
}
printf("请设置障碍(可以设置多个,输入 0 0 结束设置):\n");
setObstacle();
while (true) {
moveCat();
if (isCatTrapped()) {
printf("游戏结束,神经猫成功逃脱!\n");
break;
}
printf("神经猫已经移动,请继续设置障碍:\n");
setObstacle();
}
break;
}
return 0;
}
```
这个游戏的玩法是:玩家通过设置障碍,把神经猫困在地图中间,如果猫被完全包围,游戏结束,玩家获胜;如果猫成功逃脱,游戏结束,玩家失败。在游戏中,猫会随机移动,玩家需要在猫移动之间设置障碍,以尽可能地限制猫的行动。
阅读全文