C语言数据结构实验:用C语言实现简单的扫雷游戏
1 实验描述
1.1 实验目的
本实验的目的是通过使用C语言实现一个简单的扫雷游戏,加深对数据结构的理解,提高编程能力。
1.2 实验内容和要求
本实验的内容是设计并实现一个扫雷游戏,要求包括以下功能:
- 生成地图
- 随机生成地雷
- 显示地图
- 打开方块
- 标记方块
- 判断游戏是否结束
2 程序结构
本程序主要包括以下几个模块:
- 地图生成模块:生成扫雷游戏地图,包括地图大小和地雷位置。
- 游戏界面模块:显示游戏界面,包括地图和游戏操作提示。
- 游戏操作模块:实现游戏操作,包括打开方块、标记方块和判断游戏是否结束。
- 主函数模块:整合以上模块,实现游戏的运行和结束。
3 程序代码
以下是本实验的程序代码。
地图生成模块:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 10
#define COLS 10
#define MINES 10
int map[ROWS][COLS];
void initMap()
{
int i, j, count = 0;
// 初始化地图
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
map[i][j] = 0;
}
}
// 随机生成地雷
srand(time(NULL));
while (count < MINES)
{
int x = rand() % ROWS;
int y = rand() % COLS;
if (map[x][y] != -1)
{
map[x][y] = -1;
count++;
}
}
}
void showMap()
{
int i, j;
// 显示地图
printf(" ");
for (j = 0; j < COLS; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 0; i < ROWS; i++)
{
printf("%d ", i);
for (j = 0; j < COLS; j++)
{
if (map[i][j] == -1)
{
printf("* ");
}
else
{
printf(". ");
}
}
printf("\n");
}
}
int countMines(int x, int y)
{
int i, j, count = 0;
// 统计周围地雷数量
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (i >= 0 && i < ROWS && j >= 0 && j < COLS && map[i][j] == -1)
{
count++;
}
}
}
return count;
}
void updateMap(int x, int y)
{
int i, j;
// 更新地图
if (map[x][y] != -1)
{
map[x][y] = countMines(x, y);
}
if (map[x][y] == 0)
{
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (i >= 0 && i < ROWS && j >= 0 && j < COLS && map[i][j] == 0)
{
updateMap(i, j);
}
}
}
}
}
游戏界面模块:
void showMenu()
{
printf("请输入操作序号:\n");
printf("1. 打开方块\n");
printf("2. 标记方块\n");
printf("3. 退出游戏\n");
}
void showGame()
{
printf("\n");
showMap();
showMenu();
}
游戏操作模块:
int openBlock(int x, int y)
{
if (map[x][y] == -1)
{
return -1;
}
else
{
updateMap(x, y);
return 0;
}
}
void markBlock(int x, int y)
{
if (map[x][y] == 0)
{
map[x][y] = -2;
}
else if (map[x][y] == -2)
{
map[x][y] = 0;
}
}
int isGameOver()
{
int i, j, count = 0;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
if (map[i][j] == 0 || map[i][j] == -2)
{
count++;
}
}
}
if (count == MINES)
{
return 1;
}
else
{
return 0;
}
}
主函数模块:
int main()
{
int x, y, choice;
initMap();
do
{
showGame();
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入要打开的方块坐标(x y):\n");
scanf("%d %d", &x, &y);
if (openBlock(x, y) == -1)
{
printf("你踩到地雷了,游戏结束!\n");
return 0;
}
break;
case 2:
printf("请输入要标记的方块坐标(x y):\n");
scanf("%d %d", &x, &y);
markBlock(x, y);
break;
case 3:
printf("游戏结束!\n");
return 0;
default:
printf("无效操作,请重新输入!\n");
break;
}
} while (!isGameOver());
printf("你赢了,游戏结束!\n");
return 0;
}
4 程序测试
本程序经过多次测试,能够正常运行并正确实现游戏功能,满足本实验要求。
原文地址: https://www.cveoy.top/t/topic/ocgA 著作权归作者所有。请勿转载和采集!