目录

项目分析

外部头文件

初始化

打印

扫雷游戏函数

main函数


项目分析

  • 游戏需要自定义地图的大小、埋雷的数量
  • 通过输入坐标进行扫雷,输入的坐标是埋雷的地方,则游戏失败
  • 输入的坐标未埋雷,则该坐标显示周围8个坐标总共的雷数
  • 游戏初始化两个数组,一个用于埋雷,一个用于打印
  • 控制颜色,提高游戏体验感

效果展示

外部头文件

Windows.h头文件用于清屏和控制颜色

time.h头文件生成随机数埋雷

#include #include #include #include 

初始化

地图大小的长宽各加一,方便每一次扫雷是计算周围的雷数

#define ROW 8#define COL 8#define ROWS (ROW + 2)#define COLS (COL + 2)#define BOOM 8int g_mine[ROWS][COLS] = { 0 };char g_show[ROWS][COLS] = { 0 };void Init(char c) {int boom = BOOM;while (boom) {int x = rand() % ROW + 1;int y = rand() % COL + 1;if (g_mine[x][y] == 0) {g_mine[x][y] = 1;--boom;}}int i, j;for (i = 1; i <= ROW; ++i) for (j = 1; j <= COL; ++j) g_show[i][j] = c;}

打印

Color函数通过系统的API接口控制输出端颜色

两个打印函数,一个用于游戏中每次操作后打印,一个用于游戏结束后打印初始地图

注:windows系统的颜色接口中,土黄色是6,绿色是10,红色是12,白色是15

void Color(int x) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);}void Display() {Color(10);system("cls");printf("----- Mine Sweeping -----\n");int i, j;for (i = 0; i <= COL; ++i) printf("%2d ", i);printf("\n");for (i = 1; i <= ROW; ++i) {Color(10);printf("%2d ", i);for (j = 1; j <= COL; ++j) {Color(6);printf(" %c ", g_show[i][j]);}printf("\n");}}void ShowMine() {Color(10);printf("\n");int i, j;for (i = 0; i <= COL; ++i) printf("%2d ", i);printf("\n");for (i = 1; i <= ROW; ++i) {Color(10);printf("%2d ", i);for (j = 1; j <= COL; ++j) {if (g_mine[i][j] == 1) {Color(12);printf(" B ");}else {Color(6);printf(" * ");}}printf("\n");}}

扫雷游戏函数

GetMineCount函数获取周围雷数,并将其转化为char类型返回

Sweep是扫雷函数,通过循环控制

char GetMineCount(int x, int y) {return g_mine[x - 1][y - 1] + g_mine[x][y - 1] +g_mine[x + 1][y - 1] +g_mine[x - 1][y] +g_mine[x + 1][y] + g_mine[x - 1][y + 1] +g_mine[x][y + 1] + g_mine[x + 1][y + 1] + '0';}void Sweep() {int count = ROW * COL - BOOM;while (count) {Color(15);printf("请输入坐标扫雷: ");int x, y;scanf("%d%d", &x, &y);if (x  ROW || y  COL) {Color(15);printf("输入错误,请重新输入\n");continue;}if (g_mine[x][y] == 1) {Color(15);printf("很遗憾,你踩到了地雷\n");ShowMine();return;}else {if (g_show[x][y] == '*') {g_show[x][y] = GetMineCount(x, y);Display();--count;}else {Color(15);printf("该坐标已经标记过,请重新输入\n");}}if (count == 0) {Color(15);printf("\n恭喜你,扫雷成功!\n");ShowMine();}}}void Game() {Init('*');Display();Sweep();}

main函数

void Menu() {printf("\n");printf("-------------------\n");printf("-------------------\n");printf("----1. Game----\n");printf("----0. Exit----\n");printf("-------------------\n");printf("-------------------\n");printf("请选择:");}int main() {srand((unsigned int)time(NULL));int input;do {Color(15);Menu();scanf("%d", &input);switch (input) {case 1:Game();break;case 0:system("cls");printf("退出游戏\n");return 0;default:printf("输入错误, 请重新选择\n");}} while (input);return 0;}