運行確認已編譯:
# include & ltgraphics.h & gt
# include & ltstdlib.h & gt
# include & ltdos.h & gt
#define LEFTPRESS 0xff01
#定義左鍵單擊0xff10
#定義左拖動0xff19
#定義鼠標移動0xff08
結構體
{
int num/*網格的當前狀態是什麽?1有雷,0已經顯示數字或者空白格子*/
int roundnum/*數壹數網格周圍有多少雷*/
int標誌;/*右鍵單擊顯示紅旗的標誌,0沒有紅旗標誌,1有紅旗標誌*/
}礦[10][10];
int game again = 0;/*是否重新開始的變量*/
int gamePLAY = 0;/*是不是第壹次玩遊戲的標誌*/
int mineNUM/*計算已處理網格的數量*/
char randmineNUM[3];/*顯示壹串數字*/
int Keystate
int MouseExist
int MouseButton
int MouseX
int MouseY
void Init(void);/*圖形驅動程序*/
void MouseOn(void);/*鼠標光標顯示*/
void MouseOff(void);/*鼠標光標隱藏*/
void MouseSetXY(int,int);/*設置當前位置*/
int left press(void);/*左按*/
int right press(void);/*按下鼠標右鍵*/
void mouse getxy(void);/*獲取當前位置*/
無效控制(void);/*遊戲開始、重啟和關閉*/
void GameBegain(void);/*遊戲開始屏幕*/
void DrawSmile(無效);/*畫壹張笑臉*/
void DrawRedflag(int,int);/*顯示紅旗*/
void DrawEmpty(int,int,int,int);/*顯示兩個空格*/
void game over(void);/*遊戲結束*/
void GameWin(無效);/*展示勝利*/
int MineStatistics(int,int);/*計算每個網格周圍的雷數*/
int ShowWhite(int,int);/*顯示無雷區的空白部分*/
void玩法(void);/*遊戲過程*/
void Close(無效);/*圖形關閉*/
無效總管(無效)
{
init();
control();
close();
}
Void Init(void)/*圖形開始*/
{
int gd=DETECT,GM;
init graph(& amp;gd,& ampgm," c:\ \ TC ");
}
Void Close(void)/*圖形關閉*/
{
closegraph();
}
Void MouseOn(void)/*鼠標光標顯示*/
{
_ AX = 0x 01;
gen interrupt(0x 33);
}
Void MouseOff(void)/*鼠標光標隱藏*/
{
_ AX = 0x02
gen interrupt(0x 33);
}
Void MouseSetXY(int x,int y)/*設置當前位置*/
{
_ CX = x;
_ DX = y;
_ AX = 0x04
gen interrupt(0x 33);
}
Int LeftPress(void)/*按下鼠標左鍵*/
{
_ AX = 0x03
gen interrupt(0x 33);
回歸(_ BX & amp;1);
}
Int RightPress(void)/*按下鼠標右鍵*/
{
_ AX = 0x03
gen interrupt(0x 33);
回歸(_ BX & amp;2);
}
Voidmousetxy (void)/*獲取當前位置*/
{
_ AX = 0x03
gen interrupt(0x 33);
MouseX = _ CX;
MouseY = _ DX
}
Void Control(void)/*遊戲開始、重啟和關閉*/
{
int game flag = 1;/*遊戲失敗後判斷是否重啟的標誌*/
while(1)
{
If(gameFLAG)/*如果遊戲失敗後沒有決定重啟或退出遊戲,繼續判斷*/
{
GameBegain();/*遊戲初始屏幕*/
遊戲性();/*特定遊戲*/
If(gameAGAIN==1)/*在遊戲中重啟*/
{
game again = 0;
繼續;
}
}
MouseOn();
game flag = 0;
If(LeftPress())/*判斷是否重新開始*/
{
mouse getxy();
if(MouseX & gt;280 & amp& ampMouseX & lt300 & amp& ampMouseY & gt65 & amp& amp老鼠& lt85)
{
game flag = 1;
繼續;
}
}
If(kbhit())/*判斷是否按鍵退出*/
打破;
}
MouseOff();
}
Void DrawSmile(void)/*畫壹個笑臉*/
{
setfillstyle(SOLID_FILL,黃色);
filllellipse(290,75,10,10);
setcolor(黃色);
setfillstyle(SOLID_FILL,黑色);/*眼睛*/
filllellipse(285,75,2,2);
filllellipse(295,75,2,2);
setcolor(黑色);/*嘴*/
bar(287,80,293,81);
}
Void draw dflag (int i,int j)/*顯示紅色標誌*/
{
set color(7);
setfillstyle(SOLID_FILL,紅色);
bar(198+j*20,95+i*20,198+j*20+5,95+I * 20+5);
setcolor(黑色);
line(198+j*20,95+i*20,198+j*20,95+I * 20+10);
}
Void draw empty (int i,int j,int mode,int color)/*顯示兩種空白*/
{
setcolor(顏色);
setfillstyle(SOLID_FILL,color);
If(mode==0)/*未被點擊的大網格*/
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+I * 20+8);
其他
If(mode==1)/*單擊空白小網格*/
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+I * 20+7);
}
無效遊戲增益(void)/*遊戲開始屏幕*/
{
int i,j;
clear device();
如果(玩法!=1)
{
MouseSetXY(290,70);/*鼠標的初始位置作為其初始坐標*/
MouseX = 290
MouseY = 70
}
玩法= 1;/*下次按重新啟動時,鼠標將不會被重新初始化*/
mineNUM = 0;
setfillstyle(SOLID_FILL,7);
吧(190,60,390,290);
for(I = 0;我& lt10;I++)/*畫壹個網格*/
for(j = 0;j & lt10;j++)
DrawEmpty(i,j,0,8);
set color(7);
draw smile();/*畫壹張臉*/
randomize();__page_break__
for(I = 0;我& lt10;I++)/*100方格隨機分配是否有地雷*/
for(j = 0;j & lt10;j++)
{
我的[我][j]。num = random(8);/*如果隨機數的結果是1,說明這個格子裏有地雷*/
if(我的[i][j]。num==1)
minenum++;/*現有礦井數加1*/
其他
我的[我][j]。num = 2;
我的[我][j]。flag = 0;/*表示沒有紅旗標誌*/
}
sprintf(randmineNUM,“%d”,mineNUM);/*顯示了這次的雷總數* * * *
set color(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM = 100-mineNUM;/*變量的空白單元格數*/
MouseOn();
}
Void GameOver(void)/*遊戲結束畫面*/
{
int i,j;
set color(0);
for(I = 0;我& lt10;i++)
for(j = 0;j & lt10;j++)
If(我的[i][j]。num==1)/*顯示所有地雷*/
{
DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,黑色);
filllellipse(200+j * 20,100+i*20,7,7);
}
}
Void GameWin(void)/*顯示勝利*/
{
set color(11);
settextstyle(0,0,2);
outtextxy(230,30,“妳贏了!”);
}
Int MineStatistics(int i,int j)/*統計每個網格周圍的雷數*/
{
int nNUM = 0;
if(I = = 0 & amp;& ampJ==0)/*左上網格的統計*/
{
if(我的[0][1])。num==1)
nnum++;
if(我的[1][0])。num==1)
nnum++;
if(我的[1][1]。num==1)
nnum++;
}
其他
if(I = = 0 & amp;& ampJ==9)/*右上網格的統計*/
{
if(我的[0][8])。num==1)
nnum++;
if(我的[1][9])。num==1)
nnum++;
if(我的[1][8])。num==1)
nnum++;
}
其他
if(I = = 9 & amp;& ampJ==0)/*左下角網格的統計*/
{
if(我的[8][0])。num==1)
nnum++;
if(我的[9][1])。num==1)
nnum++;
if(我的[8][1])。num==1)
nnum++;
}
其他
if(I = = 9 & amp;& ampJ==9)/*右下角網格的統計*/
{
如果(我的[9][8])。num==1)
nnum++;
如果(我的[8][9])。num==1)
nnum++;
如果(我的[8][8])。num==1)
nnum++;
}
Else if(j==0)/*左邊第壹列網格的統計*/
{
if(我的[i][j+1])。num==1)
nnum++;
if(我的[i+1][j]。num==1)
nnum++;
if(我的[i-1][j]。num==1)
nnum++;
if(我的[i-1][j+1])。num==1)
nnum++;
if(我的[i+1][j+1])。num==1)
nnum++;
}
Else if(j==9)/*右邊第壹列網格的統計*/
{
if(我的[i][j-1])。num==1)
nnum++;
if(我的[i+1][j]。num==1)
nnum++;
if(我的[i-1][j]。num==1)
nnum++;
if(我的[i-1][j-1])。num==1)
nnum++;
if(我的[i+1][j-1])。num==1)
nnum++;
}
Else if(i==0)/*第壹個網格的統計*/
{
if(我的[i+1][j]。num==1)
nnum++;
if(我的[i][j-1])。num==1)
nnum++;
if(我的[i][j+1])。num==1)
nnum++;
if(我的[i+1][j-1])。num==1)
nnum++;
if(我的[i+1][j+1])。num==1)
nnum++;
}
Else if(i==9)/*最後壹個網格的統計*/
{
if(我的[i-1][j]。num==1)
nnum++;
if(我的[i][j-1])。num==1)
nnum++;
if(我的[i][j+1])。num==1)
nnum++;
if(我的[i-1][j-1])。num==1)
nnum++;
if(我的[i-1][j+1])。num==1)
nnum++;
}
Else/*普通格的統計*/
{
if(我的[i-1][j]。num==1)
nnum++;
if(我的[i-1][j+1])。num==1)
nnum++;
if(我的[i][j+1])。num==1)
nnum++;
if(我的[i+1][j+1])。num==1)
nnum++;
if(我的[i+1][j]。num==1)
nnum++;
if(我的[i+1][j-1])。num==1)
nnum++;
if(我的[i][j-1])。num==1)
nnum++;
if(我的[i-1][j-1])。num==1)
nnum++;
}__page_break__
返回(nNUM);/*返回網格周圍有多少雷電的統計結果* * * *
}
Int ShowWhite(int i,int j)/*顯示沒有雷區的空白部分*/
{
If(我的[I] [j]。flag = = 1 ||礦[I] [j]。num = = 0)/*如果有紅旗或者網格已經處理過,則不判*/
返回;
mineNUM-;/*顯示數字或空格的格子表示又處理了壹個格子,當所有格子都處理完後,表示勝利*/
if(我的[i][j]。roundnum==0。& amp我的[我][j]。num!=1)/*顯示空間*/
{
DrawEmpty(i,j,1,7);
我的[我][j]。num = 0;
}
其他
if(我的[i][j]。roundnum!=0)/*輸出閃電數*/
{
DrawEmpty(i,j,0,8);
sprintf(randmineNUM," %d ",Mine[i][j]。round num);
setcolor(紅色);
outtextxy(195+j*20,95+i*20,randmineNUM);
我的[我][j]。num = 0;/*已經輸出閃電數的網格表示該網格已經與0壹起使用*/
返回;
}
/*遞歸顯示8個方向的所有空白網格*/
如果(我!= 0 & amp& amp我的[i-1][j]。num!=1)
ShowWhite(i-1,j);
如果(我!= 0 & amp& ampj!= 9 & amp& amp我的[i-1][j+1]。num!=1)
ShowWhite(i-1,j+1);
如果(j!= 9 & amp& amp我的[i][j+1]。num!=1)
ShowWhite(i,j+1);
如果(j!= 9 & amp& amp我!= 9 & amp& amp我的[i+1][j+1]。num!=1)
ShowWhite(i+1,j+1);
如果(我!= 9 & amp& amp我的[i+1][j]。num!=1)
ShowWhite(i+1,j);
如果(我!= 9 & amp& ampj!= 0 & amp& amp我的[i+1][j-1]。num!=1)
ShowWhite(i+1,j-1);
如果(j!= 0 & amp& amp我的[i][j-1]。num!=1)
ShowWhite(i,j-1);
如果(我!= 0 & amp& ampj!= 0 & amp& amp我的[i-1][j-1]。num!=1)
ShowWhite(i-1,j-1);
}
Void遊戲玩法(void)/*遊戲過程*/
{
int i,j,Num/*Num用於接收統計函數並返回壹個網格周圍有多少個地雷*/
for(I = 0;我& lt10;i++)
for(j = 0;j & lt10;j++)
我的[我][j]。roundnum=MineStatistics(i,j);/*計算每個網格周圍有多少地雷*/
而(!kbhit())
{
If(LeftPress())/*按鼠標左鍵*/
{
mouse getxy();
if(MouseX & gt;280 & amp& ampMouseX & lt300 & amp& ampMouseY & gt65 & amp& amp老鼠& lt85)/*重新開始*/
{
MouseOff();
game again = 1;
打破;
}
if(MouseX & gt;190。& ampMouseX & lt390 & amp& ampMouseY & gt90 & amp& amp老鼠& lt290)/*當前鼠標位置在網格內*/
{
j =(MouseX-190)/20;/*x坐標*/
I =(MouseY-90)/20;/*y坐標*/
If(我的[i][j]。flag==1)/*如果網格有紅色標誌,則左鍵無效*/
繼續;
if(我的[i][j]。num!=0)/*如果網格沒有被處理*/
{
If(我的[i][j]。num==1)/*鼠標點擊的格子是地雷*/
{
MouseOff();
game over();/*遊戲失敗*/
打破;
}
Else/*鼠標按下的格子不是地雷*/
{
MouseOff();
Num=MineStatistics(i,j);
If(Num==0)/*如果周圍沒有地雷,使用遞歸算法顯示空白網格*/
ShowWhite(i,j);
Else/*按網格。周圍有地雷*/
{
sprintf(randmineNUM," %d ",Num);/*輸出當前網格周圍的雷數*/
setcolor(紅色);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM-;
}
MouseOn();
我的[我][j]。num = 0;/*選中網格周圍的雷數變為0,表示該網格已被使用*/
if(mineNUM & lt;1)/*勝利*/
{
GameWin();
打破;
}
}
}
}
}
If(RightPress())/*鼠標右鍵鍵盤按*/
{
mouse getxy();
if(MouseX & gt;190。& ampMouseX & lt390 & amp& ampMouseY & gt90 & amp& amp老鼠& lt290)/*當前鼠標位置在網格內*/
{
j =(MouseX-190)/20;/*x坐標*/
I =(MouseY-90)/20;/*y坐標*/
MouseOff();
if(我的[i][j]。flag = = 0 & amp& amp我的[我][j]。num!=0)/*本來沒有紅旗,現在顯示出來了*/
{
DrawRedflag(i,j);
我的[我][j]。flag = 1;
}
其他
If(我的[i][j]。flag==1)/*如果有紅旗標誌,按右按鈕,紅旗消失*/
{
DrawEmpty(i,j,0,8);
我的[我][j]。flag = 0;
}
}
MouseOn();
睡眠(1);
}
}
}