• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C语言实现简单扫雷源码

c语言 搞代码 4年前 (2022-01-06) 85次浏览 已收录 0个评论

这篇文章主要为大家详细介绍了C语言实现简单扫雷源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

扫雷是一款大家都熟知的小游戏,今天我们将使用c语言实现一个简易版本的扫雷

需要的功能

1.保证第一次下子时,不被炸死
2.输入的坐标周围没雷,可以直接展开周围的坐标
3.输入的坐标周围有雷时,应该显示周围有多少个雷

注意事项

1.应该定义两个数组,一个用来向玩家展示排雷的情况,一个来存放雷
2.定义的数组的大小,应该大于扫雷游戏的棋盘的真实大小,防止数组越界
(如:在扫雷的棋盘为99时,我们应该定义1111的数组,防止数组越界)
3.可以将代码分文件实现

代码的实现

分文件

将代码分别写入game.c,game.h,test.c文件里,可以让代码更加有条理
test.c主要写游戏主要框架
game.c实现需要的函数
game.h定义需要的函数

对两个数组初始化

 //board-需要初始化的数组 //set-初始化的元素(这里我将'1'设置为雷,'0'代表没有雷;将玩家看到的棋盘初始化为'*') void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) { int i; int j; for (i = 0; i <rows; i++) { for (j = 0; j <cols; j++) { board[i][j] = set; } } }

打印功能

 //打印 void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i; int j=1; printf("-----------------------------\n");//分割每次打印的棋盘,防止混淆 for (i = 0; i <= row; i++) {//打印列号 printf("%d ", i); } pr<i style="color:transparent">来源gaodai$ma#com搞$代*码网</i>intf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i);//打印行号 for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("-----------------------------\n"); }

布置雷

 //布置雷 //count-布置的雷的数量 void SetMineBoard(char board[ROWS][COLS], int row, int col, int count) { while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } }

排查雷

 //排查雷 //num-雷的数量 void FineMine(int row, int col, int num) { int flag = 1; int a = 1; while (flag) { printf("请输入一个坐标:"); int x; int y; scanf("%d%d", &x, &y); if (a == 1)//第一次输入坐标需要进行判断,防止第一次就踩到了雷 { a--; safe(x, y,ROW,COL);//安全函数,保证第一次不会踩到雷 } if (x >= 1 && x = 1 && y <= col)//坐标合法 { if (mine[x][y] != '1')//如果该位置不是雷,应该搜索周围有多少雷 { int count = GetMineCount(x, y);//查找周围雷的数量 show[x][y] = count + '0'; if (show[x][y] == '0') {//该位置没有雷时,应该继续展开搜索周围的坐标 open_mine(x, y);//展开周围坐标功能 int z = count_show_mine(row, col); if (z == num) { printf("你已经找出全部的雷,游戏胜利\n"); DisplayBoard(show, ROW, COL);//打印 break; } } DisplayBoard(show, ROW, COL);//打印 } else { printf("你踩到雷,游戏结束\n"); DisplayBoard(mine, ROW, COL);//打印 flag = 0; } } else { printf("坐标有误,请重新输入"); } } }

保证第一次下子时,不被炸死

 //保证不会在第一次时踩到雷 void safe(int x, int y, int row, int col) { int q = 1; if (mine[x][y] == '1') {//如果此处是雷,将雷换到其他地方 mine[x][y] = '0'; while (q) { int a = rand() % row + 1; int b = rand() % col + 1; if (mine[a][b] == '0'&&a!=x&&b!=y) { q--; mine[a][b] = '1'; } } } }

统计周围有几个雷;

 //统计坐标(x,y)周围有几个雷; int GetMineCount(int x, int y) { return (mine[x - 1][y - 1]) + (mine[x - 1][y]) + (mine[x - 1][y + 1]) + (mine[x][y - 1]) + (mine[x][y + 1]) + (mine[x + 1][y - 1]) + (mine[x + 1][y]) + (mine[x + 1][y + 1]) - 8 * '0'; }

展开周围坐标

 //展开排查周围坐标的情况 void open_mine(int x, int y)//坐标周围展开函数 { if (mine[x - 1][y - 1] == '0') { show[x - 1][y - 1] = GetMineCount(x - 1, y - 1) + '0';//显示该坐标周围雷数 } if (mine[x - 1][y] == '0') { show[x - 1][y] = GetMineCount(x - 1, y) + '0';//显示该坐标周围雷数 } if (mine[x - 1][y + 1] == '0') { show[x - 1][y + 1] = GetMineCount(x - 1, y + 1) + '0';//显示该坐标周围雷数 } if (mine[x][y - 1] == '0') { show[x][y - 1] = GetMineCount(x, y - 1) + '0';//显示该坐标周围雷数 } if (mine[x][y + 1] == '0') { show[x][y + 1] = GetMineCount(x, y + 1) + '0';//显示该坐标周围雷数 } if (mine[x + 1][y - 1] == '0') { show[x + 1][y - 1] = GetMineCount(x + 1, y - 1) + '0';//显示该坐标周围雷数 } if (mine[x + 1][y] == '0') { show[x + 1][y] = GetMineCount(x + 1, y) + '0';//显示该坐标周围雷数 } if (mine[x + 1][y + 1] == '0') { show[x + 1][y + 1] = GetMineCount(x + 1, y + 1) + '0';//显示该坐标周围雷数 } }

判断胜利

 //判断剩余未知区域的个数,个数为雷数时玩家赢 int count_show_mine(int row,int col) { int count = 0; int i = 0; int j = 0; for (i = 1; i <= row - 2; i++) { for (j = 1; j <= col - 2; j++) { if (show[i][j] == '*') { count++; } } } return count; }

效果展示

1.打印和布置

第一个数组是玩家在游戏看到的数组,第二个数组是存放雷的数组,在游戏中第二个数组不会被打印

2.safe函数的检查

第一个数组为本来存放雷的数组,可以看到此时(1,7)位置是有雷的,但是,我们在输入(1,7)坐标时,因为safe函数的功能,使得(1,7)位置的雷转移到其他地方

3.由上图可知(2,8)存放的有雷,这时我们输入(2,8)(不是第一次输入),游戏结束

4.展开功能

第一个数组仍然为布置雷后打印出的数组,我们可以看到(3,3)位置及周围都没有雷,所以我们输入(3,3)看到其周围8个位置也被搜索

以上就是C语言实现简单扫雷源码的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C语言实现简单扫雷源码

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址