mine 全局变量修改后的代码

#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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容