扫雷游戏源码全解析:从零开始手把手教学

发布时间:2026/10/30 2:45:38
扫雷游戏源码全解析:从零开始手把手教学 扫雷游戏从完整代码到逐行解析## 一、获取完整代码复制并在浏览器中打开下面的地址按照图片指引依次操作即可拿到完整源码仓库地址https://gitee.com/cyb122413qaz/daily-practice/tree/master## 二、代码解析与补充说明1. 代码解析#### 1. 代码的解释1.1 主函数 main游戏入口与菜单循环intmain(){intinput0;//初始化变量input为一个任意符合类型的内容int对应类型是【无符号整型】应输入在int内部有定义的整数数字srand((unsignedint)time(NULL));//用“当前时间秒”把伪随机数生成器的初始状态打乱让每次运行的 rand() 序列不同它只在程序启动时调用一次是“够用的民间随机”如果你只调用 rand() 而不调用 srand()标准规定种子默认为 1 —— 于是每次运行程序打印出来的“随机数”都一模一样——srand(seed) 的作用就是把内部状态重置为 seed 对应的初始值do//do……while循环至少会执行一次{menu();//自定义函数menu(具体代码请看源.c)printf(请选择\n);scanf(%d,input);//输入一个可以被计算机理解通过switch语句的使用的数字switch(input)//input是自己定义和键盘赋值的一个即将和下方case后面的常量进行相等判断的整型常量表达式{case0://从上往下依次执行如果相等判断显示正确进入这个case下的语句执行完后在break的作用下再退出switch语句不正确就一直向下执行printf(退出游戏\n);break;case1:printf(开始扫雷游戏\n);game();break;default:printf(输入错误请重复新输入合法数值\n);break;}}while(input);//input在这里表示【当input不等于0的时候才会进入这个do……while循环】return0;}在input选择1的情况下进入game这个自定义函数先看看game.h里函数的相关定义voidgame(){charmine[ROWS][COLS]{0};//ROWS,COLS是宏定义charshow[ROWS][COLS]{0};//char(字符类型)数组的初始化InitBoard(mine,ROWS,COLS,0);InitBoard(show,ROWS,COLS,*);//分别初始化扫雷游戏棋盘界面DisplayBoard(show,ROW,COL);//显示进行扫雷的界面SetMine(mine,ROW,COL);//在不显示给游戏者的初始化后的数组mine上面设置一定数量的雷FindMine(mine,show,ROW,COL);//开始输入坐标进行排雷// 以上这些除数组的初始化之外都是自定义函数的调用代码运行时会按照顺序自动进入对应的函数并且进行一定的功能}c#pragmaonce//告诉编译器这个头文件在同一个编译单元translation unit里最多被展开一次如果已经包含过就直接跳过#includestdio.h//在预处理阶段把标准输入输出头文件的声明原样粘贴进来让编译器认识 printf、scanf、FILE、EOF、stdin/stdout/stderr 这些名字它只负责“声明”真正的实现由 C 运行库在链接阶段提供。#includestdlib.h//和上方解释类似在该游戏用来声明srand,rand#includetime.h//声明time#defineROW9//#define下的宏定义定义之后代码里的ROW,COL等等的值就会变成对应数值的定值运行时他的值不会发生任何改变#defineCOL9#defineROWS(ROW2)#defineCOLS(COL2)#defineEASY_COUNT10//下方为各个函数的声明voidInitBoard(charboard[ROWS][COLS],intr,intc,charset);//声明时形参和实参的个数和类型都是一一对应的voidDisplayBoard(charboard[ROWS][COLS],intr,intc);voidSetMine(charmine[ROWS][COLS],intr,intc);voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],intr,intc);最后看看game.c里面的众多自定义函数的详细内容#define_CRT_SECURE_NO_WARNINGS1//主要是为了消除输入中文时系统的警告在代码本身没有任何需哦呜的情况下发出警告#includegame.h//引用game.h里面相关的头文件以及函数的声明这一句代码在源.c里面也有相同的一句voidInitBoard(charboard[ROWS][COLS],intr,intc,charset)//扫雷界面的初始化{for(inti0;ir;i)//i为行{for(intj0;jc;j)//j为列{board[i][j]set;//通过传入的set对应的*或者0,赋予对应数组mineshow相应的元素}}}voidDisplayBoard(charboard[ROWS][COLS],intr,intc){for(inti1;ir;i){for(intj1;jc;j){printf(%c ,board[i][j]);//打印初始化时传入的字符0或者*}putchar(\n);//打印完一行的内容之后进行换行并且在i1之后再次进入循环程序打印下一行}}voidSetMine(charmine[ROWS][COLS],intr,intc){intcountEASY_COUNT,x0,y0;while(count){xrand()%r1;//通过源.c里的srand语句再执行这个语句可以给x取出1~r1的数字yrand()%c1;if(mine[x][y]0)//不是炸弹的坐标进入语句{mine[x][y]1;//在这个不是炸弹的地方设置一个炸弹count--;//每设置一个炸弹count-1保证设置的炸弹数量恰好等于宏定义的EASY_COUNT对应的数值}}}voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],intr,intc){intwin0,x0,y0;while(winr*c-EASY_COUNT)//当win小于所需排雷数时进入循环继续排雷如果雷有10个扫雷界面为9 * 9那么当win71时就会进入下方循环{printf(请输入排雷坐标\n);scanf(%d %d,x,y);if(x1xry1yc)//确保输入排雷的坐标在对应的排雷界面内部{if(show[x][y]*)//*为初始化界面时show数组对应的元素仍旧为*表示这个位置还没有排过雷{if(win0||mine[x][y]0)//win0表示给第一次排雷的情况增肌容错通过进入这个if语句后嵌套的if语句将雷移动到其他没有雷的合法坐标位置{if(mine[x][y]1)//第一次排雷时输入雷的坐标时的容错机制{mine[x][y]0;intnx0,ny0;do{nxrand()%r1;nyrand()%c1;}while(mine[nx][ny]1||(nxxnyy));//防止改变原先设置的雷的数量和防止又将雷留在原位置却认为已经将雷移动走的情况也会导致雷的数量异常减少mine[nx][ny]1;}size_tcountGetMineCount(mine,x,y);show[x][y]char(count0);//将函数返回的整数值count转换为相对应的字符DisplayBoard(show,r,c);//打印排雷正确后的排雷界面便于下一步正确排雷win;}else{printf(很遗憾你被炸死了请重新选择是否重新进入游戏\n);DisplayBoard(mine,r,c);break;}}else{printf(该坐标位置已经被排查过请重新输入没有排查过的坐标\n);}}else{printf(请重新输入符合要求的坐标\n);}}if(winr*c-EASY_COUNT)//win棋盘上非雷位置数时就排完了所有的雷{printf(恭喜你排雷成功\n);DisplayBoard(mine,r,c);//查看设置的雷的位置}}staticsize_tGetMineCount(charmine[ROWS][COLS],intx,inty)// static表示该函数这能在game.c这个文件里面调用它{size_tcount0;for(inti-1;i1;i)//for循环遍历xy周围所有的位置方便查看周围雷的数量{for(intj-1;j1;j){count(mine[xi][yj]-0);//以整数回返结果}}returnsize_tcount;//返回记录的周围雷的数量}以上就是完整扫雷代码的解释最后补充两个隐藏的代码问题

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询