前言
相信大家都曾玩过一个经典的小游戏——扫雷,在学习了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’都可以将数值转为字符 } } }