目录
相信大家都曾玩过一个经典的小游戏——扫雷,在学习了C语言有关于数组、循环语句、选择语句等知识后,我决定用C语言实现一个简易版的扫雷游戏,接下来我将在本篇文章中向大家介绍我的思路以及具体的实现过程。
1.可控制棋盘的大小和雷的数量;
2.判断输入的坐标是否正确;
3.可以在棋盘中随机放置雷;
4.显示非雷坐标周围雷的个数;
5.展开功能(若所排查坐标周围没有雷,则展开一片,直到遇到雷或者棋盘边界等条件)
6.判断游戏的输赢
玩家输入坐标,系统判断是否为雷:
如果是雷,则玩家被炸死,游戏结束;
如果不是雷,又分为两种情况:
该位置周围有雷,则显示周围雷的数量;
该位置周围没有雷,则展开一片。
如果所有非雷位置被玩家全部找到,则玩家胜利,游戏结束。
为了方便大家的学习和交流,我将这个小游戏的源代码放置在下方,同时还有我的运行截图。
初始化棋盘
- //初始化布置雷的棋盘和展示给玩家的棋盘
-
- void init_mine()
- {
- int i = 0;
- int j = 0;
- for (i = 0; i < ROW; i++)
- {
- for (j = 0; j < COL; j++)
- {
- real_mine[i][j] = '0';
- }
- }
- for (i = 0; i < ROW - 2; i++)
- {
- for (j = 0; j < COL - 2; j++)
- {
- show_mine[i][j] = '*';
- }
- }
放置雷
- //放置雷
-
- void set_mine()
- {
- int row = 0;
- int col = 0;
- int mine = MINE;
- while (mine--)
- {
- row = (rand() % (ROW - 2)+1);//产生随机的行数
- col = (rand() % (COL - 2)+1);//产生随机的列数
- if (real_mine[row][col] != '1')
- {
- real_mine[row][col] = '1';
- }
- else
- {
- mine++;
- }
- }
- }
打印放置雷的棋盘
- //打印放置雷的棋盘
-
- void print_mine()
- {
- int i = 0;
- int j = 0;
- for (i = 0; i < ROW; i++)
- {
- for (j = 0; j < COL; j++)
- {
- printf("%c ", real_mine[i][j]);
- }
- printf("\n");
- }
- }
打印展示给玩家的棋盘
- //打印展示给玩家的棋盘
-
- void print_show()
- {
- int i = 0;
- int j = 0;
- printf("%2d ",0);
- for (j = 0; j < COL - 2; j++)
- {
- printf("%d ", j+1);
- }
- printf("\n");
- for (i = 0; i < ROW - 2; i++)
- {
- printf("%2d ", i+1);
- for (j = 0; j < COL - 2; j++)
- {
- printf("%c ", show_mine[i][j]);
- }
- printf("\n");
- }
- }
统计周围雷的个数
- //统计周围雷的个数
-
- int count_mine(int n,int m)
- {
- int i = 0;
- int j = 0;
- int count = 0;
- for (i = n - 1; i <= n + 1; i++)
- {
- for (j = m - 1; j <= m + 1; j++)
- {
- if (real_mine[i][j] == '1')
- {
- count++;
- }
- }
- }
- return count;
- }
判断输入的坐标是否已经被查询过
- //判断输入的坐标是否已经被查询过
-
- int has_queried(int n, int m)
- {
- if (show_mine[n - 1][m - 1] != '*')
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
展开一片(展开该坐标周围的坐标,一直到限制条件)
- //展开一片(展开该坐标周围的坐标,一直到限制条件)
-
- void open_mine(int n, int m)
- {
- int i = 0;
- int j = 0;
- //结束标志:
- //1.坐标是雷
- //2.坐标越界
- //3.坐标已被查找
- if (n <= (ROW - 2) && n >= 1 && m <= (ROW - 2) && m >= 1 && show_mine[n - 1][m - 1] == '*' && real_mine[n][m] == '0')
- {
- real_mine[n][m] = '2';//将查找过的坐标进行标记
- if (!count_mine(n, m))
- {
- show_mine[n - 1][m - 1] = ' ';//把周围没有雷的坐标显示为空白
- for (i = n - 1; i <= n + 1; i++)
- {
- for (j = m - 1; j <= m + 1; j++)
- {
- open_mine(i, j);
- }
- }
- }
- else
- {
- show_mine[n - 1][m - 1] = count_mine(n, m) + '0';//加0x30或者加‘0’都可以将数值转为字符
- }
- }
- }
扫雷函数
- //扫雷函数
-
- int sweep_mine(int n, int m)
- {
- if (real_mine[n][m] == '1')//踩到雷
- {
- return 0;
- }
- else
- {
- int count = count_mine(n, m);//没踩到,统计周围雷的个数
- if (count)
- {
- show_mine[n - 1][m - 1] = count + 0x30;//该坐标处应展示的值 (普通整数要转换为字符,需要加上‘0’的ASCII码值,即0x30)
- }
- else
- {
- open_mine(n, m);
- }
- return 1;
- }
- }
判断是否赢得游戏
- //判断是否赢得游戏
-
- int is_win()
- {
- int i = 0, j = 0;
- int count = 0;
- for (i = 0; i < ROW - 2; i++)
- {
- for (j = 0; j < COL - 2; j++)
- {
- if (show_mine[i][j] == '*')
- {
- count++;
- }
- }
- }
- if (count == MINE)
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
game.h文件
- //函数的声明
- #include
- #include
- #include
- #define COL 12
- #define ROW 12
- #define MINE 10
- char show_mine[ROW-2][COL-2];//展示给玩家的棋盘的数组
- char real_mine[ROW][COL];
- void init_mine();//初始化布置雷的棋盘和展示给玩家的棋盘
- void set_mine();//放置雷
- void print_mine(); //打印放置雷的棋盘
- void print_show();//打印展示给玩家的棋盘
- int count_mine();//统计周围雷的个数
- int has_queried(int n, int m);//判断输入的坐标是否已经被查询过
- int sweep_mine();//扫雷函数
- int is_win();//判断是否赢得游戏
game.c文件
- #define _CRT_SECURE_NO_WARNINGS
- #include"saolei.h"
- //测试游戏逻辑
- void game()
- {
- int n = 0, m = 0;
- init_mine();//初始化布置雷的棋盘和展示给玩家的棋盘
- set_mine();//放置雷
- while (1)
- {
- print_mine(); //打印放置雷的棋盘(方便观察是否有错误,实现整个游戏后进行隐藏)
- printf("\n");
- print_show();//打印展示给玩家的棋盘
- printf("请输入您想排查雷的坐标:>");
- scanf("%d %d", &n, &m);
- if (n<1 || n>10 || m<1 || m>10)
- {
- printf("您输入的坐标无效,请重新输入\n");
- continue;
- }
- int ret1 = has_queried(n, m);//判断输入的坐标是否已经被查询过
- if (!ret1)
- {
- printf("该位置已经被查询,请重新输入\n");
- continue;
- }
- int ret2 = sweep_mine(n, m);//扫雷函数
- if (!ret2)
- {
- printf("您已被炸死!\n");
- break;
- }
- int ret3 = is_win();//判断是否赢得游戏
- if (!ret3)
- {
- printf("游戏胜利!\n");
- break;
- }
- }
- }
-
- void menu()
- {
- printf("*****************************\n");
- printf("******** 1. Play ********\n");
- printf("******** 0. Exit ********\n");
- printf("*****************************\n");
- }
-
- int main()
- {
- srand((unsigned int)time(NULL));//设置随机数的起始值
- int input = 0;
- do
- {
- menu();//主菜单
- printf("请输入您的操作:>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- game();//进入游戏
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("输入错误请重新输入:>");
- break;
- }
- } while (input);
- return 0;
- }
由运行截图可以看出部分游戏的功能,为了方便大家的学习和交流,文中以及将所有代码都展示出来了,大家可以自行测试。
以上就是今天要讲的内容,本文简单的介绍了用C语言实现扫雷小游戏的思路,还进一步展示了代码的运行结果验证了作者的思路。用学习到的知识来实现一个小游戏确实是一个成就感满满的事情,正在学习C语言的你也跟着一起来实现这个小游戏吧。
本文的作者也只是一个正在学习C语言等编程知识的萌新,若这篇文章中有哪些不正确的内容,请在评论区向作者指出(也可以私信作者),欢迎大佬们指点,也欢迎其他正在学习C语言的萌新和作者进行交流。
最后,如果本篇文章对你有所启发的话,也希望可以支持支持作者,后续作者也会定期更新学习记录。谢谢大家!