扫雷开发C语言
掃雷開發
1.前期準備
1.1工具:VC,easyx
基礎知識:循環,數組,函數
1.2雷區地圖繪制
我們做一個9行9列的二維數組,0和-1代表有雷和無雷
這個數組最好是全局,這樣很多函數都可以訪問得到(注意全局數組自動初始化為0)
需要的頭文件和宏定義如下:
#include<stdio.h> #include<graphics.h> #define ROW 9//9行9列的雷區表格 #define COL 9 #define MINE_WID 40//圖片寬度 int mine[ROW][COL];1.3打印 printMap()函數
先做點簡單的工作,寫一個輸出數組的函數,方便后面調用
void printMap() {for(int i=0;i<ROW;i++){for(int j=0;j<COL;j++){printf("%3d",mine[i][j]); //格式控制一下,一個數字占3個}printf("\n");//每一行就輸出一個換行} }main()調用一下
int main() {printMap();return 0; }資源文件有數字標記,空白格子,紅旗,地圖,以及地雷,復制進入工程的當前目錄
圖片定義一個數組,作為全局變量,這個數組可被各個函數訪問修改
IMAGE img[12];1.4初始化
void gameInit() {loadimage(&img[0],"./0.png",MINE_WID,MINE_WID);loadimage(&img[1],"./1.png",MINE_WID,MINE_WID);loadimage(&img[2],"./2.png",MINE_WID,MINE_WID);loadimage(&img[3],"./3.png",MINE_WID,MINE_WID); } //上面的代碼要復制12次,我們用循環處理簡化代碼 void gameInit() {char temp[20]=" "; for(int i=0;i<12;i++){sprintf(temp,"%d.jpg",i);//把路徑+i吸入temp變量loadimage(&img[i],temp,MINE_WID,MINE_WID);} }資源加載完了,我們開始繪制圖片(貼圖)
void gameDraw() {for(int i=0;i<ROW;i++){for(int j=0;j<COL;j++){if(mine[i][j]==0) //初始化開始為0的時候,全部填充空白磚塊{putimage(i*MINE_WID,j*MINE_WID,&img[0]);}}} }現在主函數調用一下
int main() {initgraph(MINE_WID*ROW,MINE_WID*COL,1); //參數 1,是同時繪圖與打開控制臺gameInit(); //資源初始化gameDraw();//繪制printMap();//控制臺作為后臺數據幫忙分析system("pause");//記得 #include<stdlib>return 0; }1.5開始布雷
雷的數量做一個宏定義,方便后期修改
#define MAX_MINE 9 //雷先少布置一點 方便分析
//在二維數組里面隨機獲取9個下標,賦值為-1 void gameInit() {//隨機化給下標為x,y的賦值為-1,標記為雷區,并且要判斷不要有 重合的下標int x,y;for(int m=0;m<MAX_MINE;)//注意m++的操作,不在這里{//srand((unsigned int)time(0));//加上上一句srand函數,同時和#include<time.h>即為真隨機,每次布雷不一樣x=rand()%9;y=rand()%9;//判斷是否重復if(mine[x][y]==0) //沒有雷的情況下,就埋雷,有雷就沒做了{mine[x][y]=-1;//當布雷成功了,m才++m++;//放在判斷這里++,才會保證一定布滿9個雷}}char temp[20]=" "; for(int i=0;i<12;i++){sprintf(temp,"%d.jpg",i);//loadimage(&img[i],temp,MINE_WID,MINE_WID);} }布雷之后運行看一下
多次運行,發現真隨機的雷區發生變化,由于我們在gameDraw()繪圖函數里面只定義了當數值為0,沒有雷的時候繪制空白磚塊,所以當數值為-1的時候,需要繪制地雷
1.6繪制地雷
//根據后臺數據,給出繪制雷區定義 //為-1布雷,增加 if else if分支,切忌還要有數字選項,所以不要只寫else void gameDraw() {for(int i=0;i<ROW;i++){for(int j=0;j<COL;j++){if(mine[i][j]==0) //初始化開始為0的時候,全部填充空白磚塊{putimage(i*MINE_WID,j*MINE_WID,&img[0]);}else if(mine[i][j]==-1) //當為-1的時候布雷{putimage(i*MINE_WID,j*MINE_WID,&img[9]); //新增一個else分支即可,地雷是第9個圖片}}} }對比一下數據,行列是顛倒的,將繪圖函數里面新增兩個變量,對應起來
void gameDraw() {for(int i=0;i<ROW;i++){for(int j=0;j<COL;j++){int x=j*MINE_WID;int y=i*MINE_WID;if(mine[i][j]==0) //初始化開始為0的時候,全部填充空白磚塊{putimage(x,y,&img[0]);}else{putimage(x,y,&img[9]);}}} }1.7布雷的數字
現在雷區有了,那么一個數字代表周圍有多少雷,那么有一個雷,周圍數字全部+1
注意,數字進行累加,但是不要把自己也是雷區的數字-1也給變化了,在gameInit()里面進行更改
void gameInit() {//隨機化給下標為x,y的賦值為-1,標記為雷區,并且要判斷不要有 重合的下標int x,y;srand((unsigned int)time(0));for(int m=0;m<MAX_MINE;)//注意m++的操作,不在這里{x=rand()%9;y=rand()%9;//判斷是否重復if(mine[x][y]==0) //沒有雷的情況下,就埋雷,有雷就沒做了{mine[x][y]=-1;//當布雷成功了,m才++m++;//放在判斷這里++,才會保證一定布滿9個雷}}// 遍歷數組,對雷九宮格進行+1操作for(int a=0;a<ROW;a++) // VC6在cpp文件不能重復定義i,j。所以避開一下{for(int b=0;b<COL;b++){//首先要找到是雷的i,jif(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]++;}}}}}}char temp[20]=" "; for(int i=0;i<12;i++){sprintf(temp,"%d.jpg",i);//loadimage(&img[i],temp,MINE_WID,MINE_WID);} }嘗試輸出一下,程序可能會假死,可能不會,取決于編譯器對數組上下限±1的嚴格程度。
問題出在哪里?思考一下!
1.8雷區在邊界,-1,+1操作會越界,內存會溢出,訪問不到!
小技巧:增加一個 ±1,作為輔助圈,在11*11格子里面的判斷。
#include<stdio.h> #include<graphics.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]; //輔助圈 IMAGE img[12];那么,0行,10行與0列,11列成為輔助圈
判斷的數字增加的行列從a=1,到小于row+1(b=1到b<COL+1)
for(int a=1;a<ROW+1;a++) // VC6在cpp文件不能重復定義i,j。所以避開一下{for(int b=1;b<COL+1;b++){//首先要找到是雷的i,jif(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]++;}}}}}}現在沒有內存溢出的隱患了
我們先輸出輔助區,printMap()里面的ROW、COL行列分別+2
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");} }但是輔助圈現在作為不越界訪問幫忙計數,是不能布雷的
輔助圈可以有數字,但是不能有-1布雷,我們修改rand功能 從1到9布雷
//x=rand()%9//從0到8 //y=rand()%9//從0到8x=rand()%9+1; //產生從1到9y=rand()%9+1; //繪圖是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) //初始化開始為0的時候,全部填充空白磚塊{putimage(x,y,&img[0]);}else if(mine[i][j]==-1) //當為-1的時候布雷{putimage(x,y,&img[9]);}}} } 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");} }現在前后臺就對應上了
1.9數字繪制
然后根據數組里面的數字,填充雷區標記數字,在drawMap()函數里面修改一下
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]);}}} }運行調試多次,驗證隨機性,并觀察數字與雷區是否對應正確
tips:這里我們更新一下,完整代碼如下
#include<stdio.h> #include<graphics.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]; IMAGE img[12];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,jif(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]++;}}}}}}char temp[20]=" "; for(int 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]);}}} }int main() {initgraph(MINE_WID*ROW,MINE_WID*COL,1); //參數 1,是同時繪圖與打開控制臺gameInit(); //資源初始化gameDraw();//繪制printMap();//控制臺作為后臺數據幫忙分析system("pause");//記得 #include<stdlib>return 0; }2.游戲加密與交互操作
2.1加密
剛剛只是做好了數據系統,現在我們要做加密掩蓋和交互,不然直接顯示最終的結果了。
加密格子,把數組里面(數據區,不要包含輔助圈)每一個值+一個數,這里為20
for(int i=1;i<=ROW;i++) {for(int j=1;j<=COL;j++){mine[i][j]+=20;} }我們更新一下gameInit()函數,如果編譯器對臨時下標i,j檢查嚴格,就不要在for循環里面反復int i=0,重復使用下標也可以。
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,jif(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++) //對于檢查嚴格的編譯器,臨時變量可重復使用了,不要再int i=0{sprintf(temp,"%d.jpg",i);//loadimage(&img[i],temp,MINE_WID,MINE_WID);} }加密之后,數據區+20,圖沒有貼了,未加密前數據最小是-1,最大是8
+20之后,最小是19,最大是28,增加分支判斷,在這個區域覆蓋掩蓋圖片(這個圖片可以仍然為空白,為了掩飾效果,我們換一個不一樣的圖)
繪圖函數更新
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]); //貼掩蓋圖片}}} }2.2鼠標操作
開頭增加鼠標消息定義 MOUSEMSG msg;
任務:點擊之后,加密后的數據解密(實現方法??)
點擊之后,鼠標消息一般配合 無限循環反復貼圖!
現在我們在主函數調用試一下,要反復繪圖,記得主函數中把點擊操作與繪圖操作放入死循環中
int main() {initgraph(MINE_WID*ROW,MINE_WID*COL,1); //參數 1,是同時繪圖與打開控制臺gameInit(); //資源初始化while(1)//死循環重復繪圖{gameDraw();//繪制gameMouse();}printMap();//控制臺作為后臺數據幫忙分析system("pause");//記得 #include<stdlib>return 0; }
掃雷左鍵是做什么?
右鍵是做什么??
gameDraw()更新一下
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]);}}} }調試一下,驗證紅旗標記,數字標記,雷區標記,與紅旗標記,取消紅旗標記功能
2.3判斷游戲結束與勝利
什么是輸?
就是踩到雷了!踩雷之后,是點擊事件發生,已經發生了數據解密,與-1進行比較
現在我們調用一下
int main() {initgraph(MINE_WID*ROW,MINE_WID*COL,1); //參數 1,是同時繪圖與打開控制臺gameInit(); //資源初始化printMap();//控制臺作為后臺數據幫忙分析while(1){gameDraw();//繪制gameMouse();gameDraw();//繪制二次,彈出窗口gameWinorLose();}system("pause");//記得 #include<stdlib>return 0; }當然游戲還有更完善的功能,比如點擊空白區域,全部展開,我們需要更新一下代碼,將鼠標坐標作為全局坐標方便傳遞參數,將鼠標消息的坐標賦值給openx,openy,代碼會更簡潔
#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; //全局變量方便訪問,mine[openx][openy]更簡潔一些 void gameMouse() {if(MouseHit()){msg=GetMouseMsg(); //注意大小寫//掃雷有標記功能,判斷鼠標左右鍵。左鍵確定,右鍵標記為紅旗if(msg.uMsg==WM_LBUTTONDOWN){openx=msg.y/MINE_WID+1;openy=msg.x/MINE_WID+1;//加密的格子進行減操作mine[openx][openy]-=20; }else if(msg.uMsg==WM_RBUTTONDOWN) //判斷右鍵點擊進行標記{if( mine[openx][openy]<30) //簡化處理,沒有放置標記紅旗的都是在小于30{mine[openx][openy]+=20;//直接+20,讓數字大于30,給放置紅旗做準備}else{mine[openx][openy]-=20; //如果本來就有紅旗,就-20,取消紅旗標記//注意在 drawMap()里面更新 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);}}}然后我們來設計打開空白全部展開的函數
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;//解密為空格0openNull(i,j);//遞歸調用到周圍所有的空格全部一鍵打開退出}}}}}openNull()函數,在鼠標消息的左鍵點擊判斷里面調用,這樣就一次展開所有空格,部分代碼如下
if(msg.uMsg==WM_LBUTTONDOWN){openx=msg.y/MINE_WID+1;openy=msg.x/MINE_WID+1;//加密的格子進行減操作mine[openx][openy]-=20;openNull(openx,openy);//空白格子遞歸全展開}3.結束完整代碼(有興趣的同學,可以加入勝利消息)
#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,jif(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;//解密為空格0openNull(i,j);//遞歸調用到周圍所有的空格全部一鍵打開退出}}}}} void gameMouse() {if(MouseHit()){msg=GetMouseMsg(); //注意大小寫//掃雷有標記功能,判斷鼠標左右鍵。左鍵確定,右鍵標記為紅旗if(msg.uMsg==WM_LBUTTONDOWN){openx=msg.y/MINE_WID+1;openy=msg.x/MINE_WID+1;//加密的格子進行減操作mine[openx][openy]-=20;openNull(openx,openy);//空白格子遞歸全展開}else if(msg.uMsg==WM_RBUTTONDOWN) //判斷右鍵點擊進行標記{if( mine[openx][openy]<30) //簡化處理,沒有放置標記紅旗的都是在小于30{mine[openx][openy]+=20;//直接+20,讓數字大于30,給放置紅旗做準備}else{mine[openx][openy]-=20; //如果本來就有紅旗,就-20,取消紅旗標記//注意在 drawMap()里面更新 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();gameDraw();//繪制gameWinorLose();}system("pause");//記得 #include<stdlib>return 0; }行減操作mine[openx][openy]-=20;openNull(openx,openy);//空白格子遞歸全展開}else if(msg.uMsg==WM_RBUTTONDOWN) //判斷右鍵點擊進行標記{if( mine[openx][openy]<30) //簡化處理,沒有放置標記紅旗的都是在小于30{mine[openx][openy]+=20;//直接+20,讓數字大于30,給放置紅旗做準備}else{mine[openx][openy]-=20; //如果本來就有紅旗,就-20,取消紅旗標記//注意在 drawMap()里面更新 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();gameDraw();//繪制gameWinorLose();}system("pause");//記得 #include<stdlib>return 0; }總結
- 上一篇: C实现扫雷
- 下一篇: excel 上标和下标