#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9//9行9列的雷区表格
#define COL 9
#define MINE_WID 40
#define MAX_MINE 9
int mine[ROW+2][COL+2];
int openx,openy;
IMAGE img[12];
MOUSEMSG msg;
HWND hwnd=NULL;
void printMap() //数组作为储存数据,把外圈也绘制出来
{
for(int i=0;i<ROW+2;i++)
{
for(int j=0;j<COL+2;j++)
{
printf("%3d",mine[i][j]);
}
printf("\n");
}
}
//在二维数组里面随机获取9个下标,赋值为-1
void gameInit()
{
//随机化给下标为x,y的赋值为-1,标记为雷区,并且要判断不要有 重合的下标
int x,y;
srand((unsigned int)time(0));
for(int m=0;m<MAX_MINE;)//注意m++的操作,不在这里
{
x=rand()%9+1;
y=rand()%9+1;
//判断是否重复
if(mine[x][y]==0) //没有雷的情况下,就埋雷,有雷就没做了
{
mine[x][y]=-1;
//当布雷成功了,m才++
m++;//放在判断这里++,才会保证一定布满9个雷
}
}
// 遍历数组,对雷九宫格进行+1操作.
for(int a=1;a<ROW+1;a++) // VC6在cpp文件不能重复定义i,j。所以避开一下
{
for(int b=1;b<COL+1;b++)
{
//首先要找到是雷的i,j
if(mine[a][b]==-1) //再嵌套一个二层循环
{
for(int k=a-1;k<=a+1;k++)
{
for(int q=b-1;q<=b+1;q++)
{
//周围的遍历,只对非雷区进行操作
if(mine[k][q]!=-1)
{
mine[k][q]++;
}
}
}
}
}
}
for(int i=1;i<=ROW;i++)
{
for(int j=1;j<=COL;j++)
{
mine[i][j]+=20;
}
}
char temp[20]=" ";
for(i=0;i<12;i++)
{
sprintf(temp,"%d.jpg",i);//
loadimage(&img[i],temp,MINE_WID,MINE_WID);
}
}
//绘图是mine数组里面的 1行到9行,1列到9列
void gameDraw()
{
for(int i=1;i<ROW+1;i++)
{
for(int j=1;j<COL+1;j++)
{
int x=(j-1)*MINE_WID;//同步更新下标
int y=(i-1)*MINE_WID;
if(mine[i][j]>=0&&mine[i][j]<=8) //初始化开始为0的时候,全部填充空白砖块
{
putimage(x,y,&img[mine[i][j]]); //根据mine[i][j]的数字来绘制对应的图片,注意图片的文件名要与自己显示的东西相符合
}
else if(mine[i][j]==-1) //当为-1的时候布雷
{
putimage(x,y,&img[9]);
}
else if(mine[i][j]>=19&&mine[i][j]<=28) //所有的数字在-1到19范围,+20之后在19到28贴掩盖图片
{
putimage(x,y,&img[10]);
}
else if(mine[i][j]>30)
{
putimage(x,y,&img[11]);
}
}
}
}
void openNull(int x,int y) //传递openx,openy进来
{
if(mine[x][y]==0)//如果是空白(已经解密了,对0进行操作)
{
for (int i=x-1;i<=x+1;i++)//二层遍历周围的方格子
{
for(int j=y-1;j<=y+1;j++)
{
if(mine[i][j]==20)//周围的格子没有点,因为还没有解密,与20进行判断
{
mine[i][j]-=20;//解密为空格0
openNull(i,j);//递归调用到周围所有的空格全部一键打开退出
}
}
}
}
}
void gameMouse()
{
if(MouseHit())
{
msg=GetMouseMsg(); //注意大小写
//扫雷有标记功能,判断鼠标左右键。左键确定,右键标记为红旗
if(msg.uMsg==WM_LBUTTONDOWN)
{
//加密的格子进行减操作
mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]-=20;
openx=msg.y/MINE_WID+1;
openy=msg.x/MINE_WID+1;
openNull(openx,openy);//空白格子递归全展开
}
else if(msg.uMsg==WM_RBUTTONDOWN)//判断右键点击进行标记
{
if( mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]<30) //简化处理,没有放置标记红旗的都是在小于30
{
mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]+=20;//直接+20,让数字大于30,给放置红旗做准备(-1到8+了20,从19~28,大于30简化)
}
else //否则什么? 否则就是 大于30,有红旗了
{
mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]-=20; //如果本来就有红旗,就-20,取消红旗标记
//注意在 gameDraw ()里面更新 else if(mine[i][j]>30) putimage(x,y,&img[11]);
}
}
}
}
void gameWinorLose()
{
//复制一下鼠标消息的代码
if(MouseHit())
{
msg=GetMouseMsg(); //注意大小写
if( mine[openx][openy]==-1) //注意点击之后的判断进行了解密操作,对-1进行判断,有时候是对加密后的数据进行判断,要自己学会区分
//include加入对话框弹出结束游戏 #include<Windows.h>
{
MessageBox(hwnd,"中雷了!","Game Over",MB_OK);
//全局变量区加入 HWND hwnd=NULL;
exit(0);
}
}
}
int main()
{
initgraph(MINE_WID*ROW,MINE_WID*COL,1); //参数 1,是同时绘图与打开控制台
gameInit(); //资源初始化
printMap();//控制台作为后台数据帮忙分析
while(1)
{
gameDraw();//绘制
gameMouse();
gameWinorLose();
gameDraw();//绘制
}
system("pause");//记得 #include<stdlib>
return 0;
}
mine 全局变量修改后的代码
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 虽然app.js先于index.js。但是修改app.js中的全局变量是异步请求,如果你想在index.js里获取...
- 全局变量是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量。 提示:全局变量是可变的...
- 1 全局变量可以跨文件使用2、全局变量可以多次声明,但是定义值只能定义一次。3、静态全局变量只能限定本文件使用。4...
- 今天给大家分享一下如何修改DEDECMS后台登录界面和全局变量以及title的版权,网上看了大多数教程,都特别分散...
- 代码复用 【真题】 eg:n=2 n=23210if:×××return 1else:3×f(2)3×2×f(1)...