mine 全局變量修改后的代碼

#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9//9行9列的雷區(qū)表格
#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() //數(shù)組作為儲(chǔ)存數(shù)據(jù),把外圈也繪制出來
{
    for(int i=0;i<ROW+2;i++)
    {
        for(int j=0;j<COL+2;j++)
        {
            printf("%3d",mine[i][j]);
        }
        printf("\n");
    }
}
//在二維數(shù)組里面隨機(jī)獲取9個(gè)下標(biāo),賦值為-1
void gameInit()
{
    //隨機(jī)化給下標(biāo)為x,y的賦值為-1,標(biāo)記為雷區(qū),并且要判斷不要有 重合的下標(biāo)
    int x,y;
    srand((unsigned int)time(0));
    for(int m=0;m<MAX_MINE;)//注意m++的操作,不在這里
    {

        x=rand()%9+1;
        y=rand()%9+1;
        //判斷是否重復(fù)
        
        if(mine[x][y]==0) //沒有雷的情況下,就埋雷,有雷就沒做了
        {
            mine[x][y]=-1;
            //當(dāng)布雷成功了,m才++
            m++;//放在判斷這里++,才會(huì)保證一定布滿9個(gè)雷
        }
        
    }
    // 遍歷數(shù)組,對(duì)雷九宮格進(jìn)行+1操作.
for(int a=1;a<ROW+1;a++) // VC6在cpp文件不能重復(fù)定義i,j。所以避開一下
    {
        for(int b=1;b<COL+1;b++)
        {
            //首先要找到是雷的i,j
            if(mine[a][b]==-1) //再嵌套一個(gè)二層循環(huán)
            {
                for(int k=a-1;k<=a+1;k++)
                {
                    for(int q=b-1;q<=b+1;q++)
                    {
                        //周圍的遍歷,只對(duì)非雷區(qū)進(jìn)行操作
                        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數(shù)組里面的 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;//同步更新下標(biāo)
            int y=(i-1)*MINE_WID;
            if(mine[i][j]>=0&&mine[i][j]<=8) //初始化開始為0的時(shí)候,全部填充空白磚塊
            {
                 putimage(x,y,&img[mine[i][j]]); //根據(jù)mine[i][j]的數(shù)字來繪制對(duì)應(yīng)的圖片,注意圖片的文件名要與自己顯示的東西相符合
            }
            else if(mine[i][j]==-1) //當(dāng)為-1的時(shí)候布雷
            {
                putimage(x,y,&img[9]);
            }
            else if(mine[i][j]>=19&&mine[i][j]<=28) //所有的數(shù)字在-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進(jìn)來
{
    if(mine[x][y]==0)//如果是空白(已經(jīng)解密了,對(duì)0進(jìn)行操作)
    {
        for (int i=x-1;i<=x+1;i++)//二層遍歷周圍的方格子
        {
            for(int j=y-1;j<=y+1;j++)
            {
                if(mine[i][j]==20)//周圍的格子沒有點(diǎn),因?yàn)檫€沒有解密,與20進(jìn)行判斷
                {
                    mine[i][j]-=20;//解密為空格0
                    openNull(i,j);//遞歸調(diào)用到周圍所有的空格全部一鍵打開退出
                }
            }
        }
    }
    
    
}
void gameMouse()
{
    if(MouseHit())
    {
        msg=GetMouseMsg(); //注意大小寫
        //掃雷有標(biāo)記功能,判斷鼠標(biāo)左右鍵。左鍵確定,右鍵標(biāo)記為紅旗
        if(msg.uMsg==WM_LBUTTONDOWN)
        {
        
           //加密的格子進(jìn)行減操作
            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)//判斷右鍵點(diǎn)擊進(jìn)行標(biāo)記
        {
            if( mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]<30) //簡(jiǎn)化處理,沒有放置標(biāo)記紅旗的都是在小于30
            {
                 mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]+=20;//直接+20,讓數(shù)字大于30,給放置紅旗做準(zhǔn)備(-1到8+了20,從19~28,大于30簡(jiǎn)化)

            }
            else //否則什么? 否則就是 大于30,有紅旗了
            {
                 mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]-=20; //如果本來就有紅旗,就-20,取消紅旗標(biāo)記
                 //注意在 gameDraw ()里面更新  else if(mine[i][j]>30) putimage(x,y,&img[11]);
            

            }
            
        }
            
    }
    
            
}
void gameWinorLose()
{
    //復(fù)制一下鼠標(biāo)消息的代碼
  if(MouseHit())
    {
        msg=GetMouseMsg(); //注意大小寫
       if( mine[openx][openy]==-1) //注意點(diǎn)擊之后的判斷進(jìn)行了解密操作,對(duì)-1進(jìn)行判斷,有時(shí)候是對(duì)加密后的數(shù)據(jù)進(jìn)行判斷,要自己學(xué)會(huì)區(qū)分
           //include加入對(duì)話框彈出結(jié)束游戲 #include<Windows.h>
       {
          MessageBox(hwnd,"中雷了!","Game Over",MB_OK); 
           //全局變量區(qū)加入 HWND hwnd=NULL;
          exit(0);
       
       }
  }
           
}
 int main()
{
    initgraph(MINE_WID*ROW,MINE_WID*COL,1); //參數(shù) 1,是同時(shí)繪圖與打開控制臺(tái)
    gameInit(); //資源初始化
    printMap();//控制臺(tái)作為后臺(tái)數(shù)據(jù)幫忙分析
    while(1)
    
    {
        
        
        gameDraw();//繪制
        gameMouse();
        gameWinorLose();
        gameDraw();//繪制
    
    }
    
    system("pause");//記得 #include<stdlib>
    
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容