c語言掃雷遞歸
❶ 急求用c語言編寫掃雷詳細代碼
/*5.3.4 源程序*/
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
struct
{
int num;/*格子當前處於什麼狀態,1有雷,0已經顯示過數字或者空白格子*/
int roundnum;/*統計格子周圍有多少雷*/
int flag;/*右鍵按下顯示紅旗的標志,0沒有紅旗標志,1有紅旗標志*/
}Mine[10][10];
int gameAGAIN=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 LeftPress(void);/*左鍵按下*/
int RightPress(void);/*滑鼠右鍵按下*/
void MouseGetXY(void);/*得到當前位置*/
void Control(void);/*游戲開始,重新,關閉*/
void GameBegain(void);/*游戲開始畫面*/
void DrawSmile(void);/*畫笑臉*/
void DrawRedflag(int,int);/*顯示紅旗*/
void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/
void GameOver(void);/*游戲結束*/
void GameWin(void);/*顯示勝利*/
int MineStatistics(int,int);/*統計每個格子周圍的雷數*/
int ShowWhite(int,int);/*顯示無雷區的空白部分*/
void GamePlay(void);/*游戲過程*/
void Close(void);/*圖形關閉*/
void main(void)
{
Init();
Control();
Close();
}
void Init(void)/*圖形開始*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
}
void Close(void)/*圖形關閉*/
{
closegraph();
}
void MouseOn(void)/*滑鼠游標顯示*/
{
_AX=0x01;
geninterrupt(0x33);
}
void MouseOff(void)/*滑鼠游標隱藏*/
{
_AX=0x02;
geninterrupt(0x33);
}
void MouseSetXY(int x,int y)/*設置當前位置*/
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}
int LeftPress(void)/*滑鼠左鍵按下*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}
int RightPress(void)/*滑鼠右鍵按下*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}
void MouseGetXY(void)/*得到當前位置*/
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}
void Control(void)/*游戲開始,重新,關閉*/
{
int gameFLAG=1;/*游戲失敗後判斷是否重新開始的標志*/
while(1)
{
if(gameFLAG)/*游戲失敗後沒判斷出重新開始或者退出遊戲的話就繼續判斷*/
{
GameBegain(); /*游戲初始畫面*/
GamePlay();/*具體游戲*/
if(gameAGAIN==1)/*游戲中重新開始*/
{
gameAGAIN=0;
continue;
}
}
MouseOn();
gameFLAG=0;
if(LeftPress())/*判斷是否重新開始*/
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
{
gameFLAG=1;
continue;
}
}
if(kbhit())/*判斷是否按鍵退出*/
break;
}
MouseOff();
}
void DrawSmile(void)/*畫笑臉*/
{
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,BLACK);/*眼睛*/
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(BLACK);/*嘴巴*/
bar(287,80,293,81);
}
void DrawRedflag(int i,int j)/*顯示紅旗*/
{
setcolor(7);
setfillstyle(SOLID_FILL,RED);
bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);
setcolor(BLACK);
line(198+j*20,95+i*20,198+j*20,95+i*20+10);
}
void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/
{
setcolor(color);
setfillstyle(SOLID_FILL,color);
if(mode==0)/*沒有單擊過的大格子*/
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
else
if(mode==1)/*單擊過後顯示空白的小格子*/
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);
}
void GameBegain(void)/*游戲開始畫面*/
{
int i,j;
cleardevice();
if(gamePLAY!=1)
{
MouseSetXY(290,70); /*滑鼠一開始的位置,並作為它的初始坐標*/
MouseX=290;
MouseY=70;
}
gamePLAY=1;/*下次按重新開始的話滑鼠不重新初始化*/
mineNUM=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
for(i=0;i<10;i++)/*畫格子*/
for(j=0;j<10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();/*畫臉*/
randomize();
for(i=0;i<10;i++)/*100個格子隨機賦值有沒有地雷*/
for(j=0;j<10;j++)
{
Mine[i][j].num=random(8);/*如果隨機數的結果是1表示這個格子有地雷*/
if(Mine[i][j].num==1)
mineNUM++;/*現有雷數加1*/
else
Mine[i][j].num=2;
Mine[i][j].flag=0;/*表示沒紅旗標志*/
}
sprintf(randmineNUM,"%d",mineNUM); /*顯示這次總共有多少雷數*/
setcolor(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM=100-mineNUM;/*變數取空白格數量*/
MouseOn();
}
void GameOver(void)/*游戲結束畫面*/
{
int i,j;
setcolor(0);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(Mine[i][j].num==1)/*顯示所有的地雷*/
{
DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(200+j*20,100+i*20,7,7);
}
}
void GameWin(void)/*顯示勝利*/
{
setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOU WIN!");
}
int MineStatistics(int i,int j)/*統計每個格子周圍的雷數*/
{
int nNUM=0;
if(i==0&&j==0)/*左上角格子的統計*/
{
if(Mine[0][1].num==1)
nNUM++;
if(Mine[1][0].num==1)
nNUM++;
if(Mine[1][1].num==1)
nNUM++;
}
else
if(i==0&&j==9)/*右上角格子的統計*/
{
if(Mine[0][8].num==1)
nNUM++;
if(Mine[1][9].num==1)
nNUM++;
if(Mine[1][8].num==1)
nNUM++;
}
else
if(i==9&&j==0)/*左下角格子的統計*/
{
if(Mine[8][0].num==1)
nNUM++;
if(Mine[9][1].num==1)
nNUM++;
if(Mine[8][1].num==1)
nNUM++;
}
else
if(i==9&&j==9)/*右下角格子的統計*/
{
if(Mine[9][8].num==1)
nNUM++;
if(Mine[8][9].num==1)
nNUM++;
if(Mine[8][8].num==1)
nNUM++;
}
else if(j==0)/*左邊第一列格子的統計*/
{
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(j==9)/*右邊第一列格子的統計*/
{
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
}
else if(i==0)/*第一行格子的統計*/
{
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(i==9)/*最後一行格子的統計*/
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
}
else/*普通格子的統計*/
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
}
return(nNUM);/*把格子周圍一共有多少雷數的統計結果返回*/
}
int ShowWhite(int i,int j)/*顯示無雷區的空白部分*/
{
if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/
return;
mineNUM--;/*顯示過數字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/
if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/
{
DrawEmpty(i,j,1,7);
Mine[i][j].num=0;
}
else
if(Mine[i][j].roundnum!=0)/*輸出雷數*/
{
DrawEmpty(i,j,0,8);
sprintf(randmineNUM,"%d",Mine[i][j].roundnum);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
Mine[i][j].num=0;/*已經輸出雷數的格子用0表示已經用過這個格子*/
return ;
}
/*8個方向遞歸顯示所有的空白格子*/
if(i!=0&&Mine[i-1][j].num!=1)
ShowWhite(i-1,j);
if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)
ShowWhite(i-1,j+1);
if(j!=9&&Mine[i][j+1].num!=1)
ShowWhite(i,j+1);
if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)
ShowWhite(i+1,j+1);
if(i!=9&&Mine[i+1][j].num!=1)
ShowWhite(i+1,j);
if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)
ShowWhite(i+1,j-1);
if(j!=0&&Mine[i][j-1].num!=1)
ShowWhite(i,j-1);
if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)
ShowWhite(i-1,j-1);
}
void GamePlay(void)/*游戲過程*/
{
int i,j,Num;/*Num用來接收統計函數返回一個格子周圍有多少地雷*/
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Mine[i][j].roundnum=MineStatistics(i,j);/*統計每個格子周圍有多少地雷*/
while(!kbhit())
{
if(LeftPress())/*滑鼠左鍵盤按下*/
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/
{
MouseOff();
gameAGAIN=1;
break;
}
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前滑鼠位置在格子范圍內*/
{
j=(MouseX-190)/20;/*x坐標*/
i=(MouseY-90)/20;/*y坐標*/
if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/
continue;
if(Mine[i][j].num!=0)/*如果格子沒有處理過*/
{
if(Mine[i][j].num==1)/*滑鼠按下的格子是地雷*/
{
MouseOff();
GameOver();/*游戲失敗*/
break;
}
else/*滑鼠按下的格子不是地雷*/
{
MouseOff();
Num=MineStatistics(i,j);
if(Num==0)/*周圍沒地雷就用遞歸演算法來顯示空白格子*/
ShowWhite(i,j);
else/*按下格子周圍有地雷*/
{
sprintf(randmineNUM,"%d",Num);/*輸出當前格子周圍的雷數*/
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM--;
}
MouseOn();
Mine[i][j].num=0;/*點過的格子周圍雷數的數字變為0表示這個格子已經用過*/
if(mineNUM<1)/*勝利了*/
{
GameWin();
break;
}
}
}
}
}
if(RightPress())/*滑鼠右鍵鍵盤按下*/
{
MouseGetXY();
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前滑鼠位置在格子范圍內*/
{
j=(MouseX-190)/20;/*x坐標*/
i=(MouseY-90)/20;/*y坐標*/
MouseOff();
if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來沒紅旗現在顯示紅旗*/
{
DrawRedflag(i,j);
Mine[i][j].flag=1;
}
else
if(Mine[i][j].flag==1)/*有紅旗標志再按右鍵就紅旗消失*/
{
DrawEmpty(i,j,0,8);
Mine[i][j].flag=0;
}
}
MouseOn();
sleep(1);
}
}
}
❷ C語言程序設計課程設計掃地雷游戲,怎麼做
#include <stdlib.h>
#include <time.h>
#include <conio.h>
/************************************************************************/
/* 地圖狀態約定 */
/* 0 : 周圍9個格子都沒有雷 */
/* 1~8: 周圍9個格子有1~8個雷 */
/* -1 : 有雷的格子 */
/* -2 : 被翻開的有雷的格子 */
/* -3 : 地圖邊界 */
/************************************************************************/
int Map[12][12]={0}; /* 當前在玩的雷圖 */
int MapShow[12][12]={0}; /* 當前用戶選擇過的地方,即「已翻開」的格子 */
int nSpaceLeft = 100; /* 剩餘的空白數,如果為0,則任務成功! */
int lastX,lastY; /* 失敗時,記錄挖到雷的位置 */
int AllMaps[5][12][12]={0}; /* 供用戶選擇的五張雷圖 */
/* 顯示雷區(每次用戶操作之後都要重新顯示) */
void DrawMap();
/* 初始化雷區 */
void InitMap();
/* 游戲開始時,載入用戶選擇的一幅雷圖 */
void LoadMap(int index);
/* 玩掃雷游戲 */
int Play();
/* 繪制主菜單 */
void DrawMainMenu();
/* 顯示結果 */
void ShowResult(int result);
/* 主函數 */
int main(int argc, char* argv[])
{
char ch;
int result;
srand(time(NULL)); /* 按當前時間初始化隨機數,這樣每次啟動的時候,雷的位置的不一樣 */
InitMap(); /* 初始化5張雷圖,供用戶選擇 */
while(1) /* 用while循環,保證只有在用戶選擇退出時,才退出遊戲 */
{
DrawMainMenu(); /* 繪制主菜單 */
flushall(); /* 清空所有輸入輸出緩沖區,主要是清空輸入緩沖區,防止前面的輸入對getch()的干擾 */
ch = getch(); /* 讀取輸入 */
switch(ch)
{
case '1': /* 用戶選擇1 */
printf("\n\t請輸入雷圖編號(1-5):");
while (1) /* 循環輸入,如果輸入錯誤就一直要求輸入 */
{
flushall();
ch = getch(); /* 讀取用戶輸入的雷圖編號 */
if (ch >= '1' && ch <= '5') /* 只有在1-5之間有效 */
{
LoadMap(ch-'1'); /* ch -'1',將用戶輸入轉換為雷圖下標(下標從0開始,所以是-'1')*/
break; /* 如果輸入正確,就退出循環輸入 */
}
else
{
/* 輸入錯誤,則提示重新輸入 */
printf("\n\t輸入無效!請重新輸入雷圖編號(1-5):");
flushall();
}
}
result = Play(); /* 開始玩掃雷游戲 */
ShowResult(result); /* 顯示游戲結果 */
break;
case '2': /* 用戶選擇2 */
exit(0); /* 直接退出 */
break;
default: /* 無效輸入 */
/* 不做任何操作,重新顯示主菜單 */
break;
}
}
return 0;
}
void LoadMap(int index)
{
int i,j;
nSpaceLeft = 90;
for(i=0;i<12;i++)
for(j=0;j<12;j++)
{
Map[i][j] = AllMaps[index][i][j]; /* 將5張雷圖中的下標為index的那一張載入到Map數組 */
MapShow[i][j] = 0; /* 重新開始游戲,所以所有格子都是「未翻開」狀態 */
}
}
void InitMap()
{
int i,j,k;
int m,n;
/* 要初始化5張地圖 */
for(k=0;k<5;k++)
{
/* 初始化地圖的邊界 */
for(i=0;i<12;i++)
{
/* 下標為0和11的位置都是「邊界」,這些位置不屬於雷區,僅在程序內部使用 */
AllMaps[k][0][i] = -3;
AllMaps[k][11][i] = -3;
AllMaps[k][i][0] = -3;
AllMaps[k][i][11] = -3;
}
/* 先初始化10個雷的位置 */
for(i=0;i<10;i++)
{
m = rand()%10 + 1; /* 隨機選一個X坐標 */
n = rand()%10 + 1; /* 隨機選一個Y坐標 */
if(AllMaps[k][m][n] == 0) /* 如果隨機產生的位置之前沒有被安排放置雷 */
{
AllMaps[k][m][n] = -1; /* 放置一個雷 */
}
else /* 隨機產生的位置在之前已經放置了雷了 */
{
i--; /* 這個位置無效,重新產生一個 */
}
}
/* 計算每個格子周圍雷的個數 */
for(i=1; i<11; i++)
for(j=1; j<11;j++)
{
if(AllMaps[k][i][j] != -1)
{
AllMaps[k][i][j] = 0;
/* 周圍的8個位置,有一個雷就加一 */
/************************************************************************/
/* 坐標[i][j]周圍的8個坐標位置: */
/* [i-1][j-1] [i-1][j] [i-1][j+1] */
/* [i][j-1] [i][j] [i][j+1] */
/* [i+1][j-1] [i+1][j] [i+1][j+1] */
/************************************************************************/
if(AllMaps[k][i-1][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i-1][j] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i-1][j+1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i][j+1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j+1] == -1)
AllMaps[k][i][j]++;
}
}
}
}
void DrawMap()
{
int i,j;
system("cls"); /* 清屏 */
/* 繪制坐標和邊框 */
printf("\n\n\n");
printf("\t Y ");
for(i=1; i<11; i++) printf("%-02d",i-1);
printf("\n\tX |###################|\n");
/* 每一行按規則繪制雷區 */
for(i=1; i<11; i++)
{
printf("\t%-02d|",i-1); /* 顯示X坐標 */
for(j=1; j<11; j++)
{
if(MapShow[i][j]) /* 如果該位置被用戶「挖開」了,就照實顯示 */
{
if (Map[i][j] >= 0) /* 非雷,顯示周圍雷的個數 */
{
printf("%d|",Map[i][j]);
}
/*else if(Map[i][j] == 0)
{
printf("0|");
}*/
else if (Map[i][j] == -1) /* 雷,顯示* */
{
printf("*|");
}
else if (Map[i][j] == -2) /* 用戶挖到的雷,顯示@ */
{
printf("@|");
}
else /* 其他情況(目前不會出現,方便以後擴展) */
{
printf(" |");
}
}
else /* 如果該位置沒有被用戶「挖開」,則顯示空格 */
{
printf(" |");
}
}
printf("\n");
}
printf("\t |###################|\n");
}
void DrawMainMenu()
{
system("cls");
printf("\n\n\n\n\n\n");
printf("\t|###################|\n");
printf("\t| 請選擇! |\n");
printf("\t| 1. 開始掃雷 |\n");
printf("\t| 2. 退出 |\n");
printf("\t|###################|\n");
}
int Play()
{
char chX,chY; /* 用戶輸入 */
int X,Y; /* 用戶輸入轉換為整數下標 */
int i,j;
while (1)
{
DrawMap(); /* 重新繪制雷區圖 */
/* 輸入X坐標 */
printf("\n\t請輸入X:");
flushall();
while(1)
{
chX = getch();
if (chX >= '0' && chX <= '9')
{
X = chX - '0' + 1;
break;
}
else
{
printf("\n\t輸入無效!請重新輸入X:");
flushall();
}
}
/* 輸入Y坐標 */
printf("\n\t請輸入Y:");
flushall();
while(1)
{
chY = getch();
if (chY >= '0' && chY <= '9')
{
Y = chY - '0' + 1;
break;
}
else
{
printf("\n\t輸入無效!請重新輸入Y:");
flushall();
}
}
if(MapShow[X][Y] == 0) /* 輸入的是未翻開的位置 */
{
MapShow[X][Y] = 1; /* 將該位置標記為「已翻開」 */
if(Map[X][Y] == -1) /* 如果挖到的是雷 */
{
Map[X][Y] = -2; /* 標記為-2,表示這是被用戶挖到的雷 */
for(i=1;i<11;i++)
for(j=1;j<11;j++)
MapShow[i][j]=1; /* 游戲結束,自動將所有位置「翻開」 */
/* 記錄用戶挖到雷的位置坐標 */
lastX = X-1;
lastY = Y-1;
return 0; /* 游戲失敗! */
}
else /* 如果挖到的不是雷 */
{
nSpaceLeft--; /* 剩餘空白數減一 */
if(nSpaceLeft==0) /* 剩餘空白數為0,則表示游戲成功 */
{
return 1; /* 游戲勝利! */
}
}
}
else /* 輸入的是已翻開的位置 */
{
printf("\n\t你輸入的位置是[%d,%d]\n\t這個位置已經翻開!請重新輸入!\n\t按任意鍵繼續...\n",X-1,Y-1);
flushall();
getch();
}
}
}
void ShowResult( int result )
{
DrawMap();
if(result == 1) /* 游戲成功 */
{
printf("\n\t恭喜!您完成的掃雷任務!\n\t按任意鍵繼續...");
flushall();
getch();
}
else /* 游戲失敗 */
{
printf("\n\t哈哈!您在位置[%d,%d]挖到雷了,任務失敗!\n\t按任意鍵繼續...",lastX, lastY);
flushall();
getch();
}
}
❸ C語言掃雷演算法,也可以別的語言,解釋清楚演算法就好
在這上面不好說明, 我有C的代碼, 你看一下(DEVC++)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#definen15
intrestart=0;
intlast_sel_x,last_sel_y;
charin[20];
structPOINT
{
intx;
inty;
}pt;
//設置CMD窗口游標位置
voidsetxy(intx,inty)
{
COORDcoord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
//獲取當前CMD當前游標所在位置
voidgetxy()
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
COORDcoordScreen={0,0};//游標位置
CONSOLE_SCREEN_BUFFER_INFOcsbi;
if(GetConsoleScreenBufferInfo(hConsole,&csbi))
{
//printf("游標坐標:(%d,%d) ",csbi.dwCursorPosition.X,csbi.dwCursorPosition.Y);
pt.x=csbi.dwCursorPosition.X;
pt.y=csbi.dwCursorPosition.Y;
}
}
structA
{
intvalue;//-1為雷
intstate;//顯示狀態:0為未打開,1為已打開
intlock;//鎖定狀態
intbomb;//雷已標記:0為未標記,1為已標記
};
structAs[10][10];
intcalc()
{
inti,j,count=0;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(s[i][j].state==0)count++;
}
}
returncount;
}
intprt()
{
system("cls");
intcount=calc();
inti,j;
printf("%3c",'');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_GREEN);
for(i=0;i<10;i++)
{
printf("%3d",i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
for(i=0;i<10;i++)
{
printf(" ");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_GREEN);
printf("%3d",i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
for(j=0;j<10;j++)
{
if(s[i][j].bomb==1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED);
printf("%3c",'*');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
elseif(s[i][j].state==1)
{
if(s[i][j].value==0)printf("%3c",'');
elseprintf("%3d",s[i][j].value);
}
else
{
printf("%3c",'-');
}
/* if(s[i][j].value==-1) printf("%3c",'*');
elseprintf("%3d",s[i][j].value);*/
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_GREEN);
printf("%3d",i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
printf(" ");
printf("%3c",'');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_GREEN);
for(i=0;i<10;i++)
{
printf("%3d",i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
printf(" ");
getxy();
setxy(45,0);
printf("%d",count);
setxy(40,5);
printf("說明");
setxy(40,7);
printf("1:輸入*xy(如:*55),則把第5行第5列");
setxy(40,8);
printf("標記為地雷");
setxy(40,10);
printf("2:輸入xy(如55),則把第5行第5列打開");
if(count==n)
{
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(s[i][j].value==-1&&s[i][j].bomb==0)s[i][j].bomb=1;
if(s[i][j].value!=-1&&s[i][j].state==0)s[i][j].state=1;
}
}
setxy(50,2);
printf("success!");
setxy(pt.x,pt.y);
fflush(stdin);
getchar();
return1;
}
setxy(pt.x,pt.y);
return0;
}
voidspace_process(intx,inty)
{
inti,j;
if(x-1>=0&&y-1>=0)
{
if(s[x-1][y-1].value==0&&s[x-1][y-1].lock==0){s[x-1][y-1].state=1;s[x-1][y-1].lock=1;space_process(x-1,y-1);}
elseif(s[x-1][y-1].value!=-1)s[x-1][y-1].state=1;
}
if(x-1>=0)
{
if(s[x-1][y].value==0&&s[x-1][y].lock==0){s[x-1][y].state=1;s[x-1][y].lock=1;space_process(x-1,y);}
elseif(s[x-1][y].value!=-1)s[x-1][y].state=1;
}
if(x-1>=0&&y+1<10)
{
if(s[x-1][y+1].value==0&&s[x-1][y+1].lock==0){s[x-1][y+1].state=1;s[x-1][y+1].lock=1;space_process(x-1,y+1);}
elseif(s[x-1][y+1].value!=-1)s[x-1][y+1].state=1;
}
if(y-1>=0)
{
if(s[x][y-1].value==0&&s[x][y-1].lock==0){s[x][y-1].state=1;s[x][y-1].lock=1;space_process(x,y-1);}
elseif(s[x][y-1].value!=-1)s[x][y-1].state=1;
}
if(y+1<10)
{
if(s[x][y+1].value==0&&s[x][y+1].lock==0){s[x][y+1].state=1;s[x][y+1].lock=1;space_process(x,y+1);}
elseif(s[x][y+1].value!=-1)s[x][y+1].state=1;
}
if(x+1<10&&y-1>=0)
{
if(s[x+1][y-1].value==0&&s[x+1][y-1].lock==0){s[x+1][y-1].state=1;s[x+1][y-1].lock=1;space_process(x+1,y-1);}
elseif(s[x+1][y-1].value!=-1)s[x+1][y-1].state=1;
}
if(x+1<10)
{
if(s[x+1][y].value==0&&s[x+1][y].lock==0){s[x+1][y].state=1;s[x+1][y].lock=1;space_process(x+1,y);}
elseif(s[x+1][y].value!=-1)s[x+1][y].state=1;
}
if(x+1<10&&y+1<10)
{
if(s[x+1][y+1].value==0&&s[x+1][y+1].lock==0){s[x+1][y+1].state=1;s[x+1][y+1].lock=1;space_process(x+1,y+1);}
elseif(s[x+1][y+1].value!=-1)s[x+1][y+1].state=1;
}
}
intprocess_char(char*t,int*i,int*j)
{
intlen=strlen(t);
intx,y=0;
for(x=0;x<len;x++)
{
if(t[x]=='')
{
continue;
}
else
{
t[y++]=t[x];
}
}
t[y]='