日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

扫雷开发C语言

發布時間:2024/1/1 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扫雷开发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;
任務:點擊之后,加密后的數據解密(實現方法??)
點擊之后,鼠標消息一般配合 無限循環反復貼圖!

#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]; MOUSEMSG msg; void gameMouse() {if(MouseHit()){msg=GetMouseMsg(); //注意大小寫//掃雷有標記功能,判斷鼠標左右鍵。左鍵確定,右鍵標記為紅旗if(msg.uMsg==WM_LBUTTONDOWN){//加密的格子進行減操作mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]-=20;//這里的y和x對調,是因為橫向是x,縱向是y,然后只繪制數據區}else if(msg.uMsg==WM_RBUTTONDOWN){}}}

現在我們在主函數調用試一下,要反復繪圖,記得主函數中把點擊操作與繪圖操作放入死循環中

int main() {initgraph(MINE_WID*ROW,MINE_WID*COL,1); //參數 1,是同時繪圖與打開控制臺gameInit(); //資源初始化while(1)//死循環重復繪圖{gameDraw();//繪制gameMouse();}printMap();//控制臺作為后臺數據幫忙分析system("pause");//記得 #include<stdlib>return 0; }


掃雷左鍵是做什么?
右鍵是做什么??

void gameMouse() {if(MouseHit()){msg=GetMouseMsg(); //注意大小寫//掃雷有標記功能,判斷鼠標左右鍵。左鍵確定,右鍵標記為紅旗if(msg.uMsg==WM_LBUTTONDOWN){//加密的格子進行減操作mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]-=20;}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]);}}}}

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進行比較

void gameWinorLose() {//復制一下鼠標消息的代碼if(MouseHit()){msg=GetMouseMsg(); //注意大小寫if(mine[msg.y/MINE_WID+1][msg.x/MINE_WID+1]==-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; }

當然游戲還有更完善的功能,比如點擊空白區域,全部展開,我們需要更新一下代碼,將鼠標坐標作為全局坐標方便傳遞參數,將鼠標消息的坐標賦值給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语言的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。