java扫雷的设计思路_扫雷设计思路
int
i,num,tmpx,tmpy,centerX,centerY;
char
num_str[2];
先清空隊列
e.x=x;
e.y=y;
Qin(&Q,&e);
Mine_open[y][x]=1; //作上訪問標記,利用mine數(shù)組作記錄
while(!Qempty(&Q)) //當隊列空時遍歷結(jié)束
{
Qout(&Q,&e);
//注意:旋轉(zhuǎn)中心方塊的坐標在8次循環(huán)中用到
//放入變量centerX、centerY加以保護(由于e.x、e.y在循環(huán)中會被更改)
centerX=e.x;
centerY=e.y;
//揭開該方格
draw_3D_rect(hDC,centerX*BSIZE,centerY*BSIZE,1," ");
for(i=0;i<8;i++) //檢查周圍的8個方格
{
tmpx=centerX+offset_x[i];
tmpy=centerY+offset_y[i];
//對于處于邊、角的方格,tmpx和tmpy可能為負數(shù)或超出最大值,要進行判斷
//注:對于已經(jīng)標記的位置(mine_mark[tmpy][tmpx]==0)不予處理
if(tmpx>=0
&& tmpx
&& tmpy>=0
&& tmpy
&& mine_mark[tmpy][tmpx]==0)
if(mine_open[tmpy][tmpx]==0) //該格子未挖開
if(mine_show[tmpy][tmpx]>0) //若是區(qū)域的邊沿(有數(shù)字)就揭開該方塊
{
num=mine_show[tmpy][tmpx];
_itoa(num,num_str,10);
draw_3D_rect(hDC,tmpx*BSIZE,tmpy*BSIZE,1,num_str);
mine_open[tmpy][tmpx]=1; //作上挖開標記
}
else //否則入隊
{
e.x=tmpx;
e.y=tmpy;
Qin(&Q,&e);
Mine_open[tmpy][tmpx]=1; //作上挖開標記
}
}
}
}
初始工作
1.存儲地雷擺放位置的矩陣(1表示有雷,0表示無雷)
int mine[ROWS][COLS];
2.用于顯示的矩陣(空間換時間,有了這個矩陣,就不用臨時去算周圍有幾個雷了)
-1表示為地雷,其余數(shù)字表示周圍的地雷個數(shù)
int mine_show[ROWS][COLS];
由mine矩陣可以推出mine_show矩陣
0
1
1
1
1
1
1
0
0
1
-1
2
1
0
1
3
-1
2
0
0
2
-1
2
0
0
1
1
1
0
3. 用于標記地雷的矩陣(為1表示未標記,為0表示已標記)
int mine_mark[ROWS][COLS];
4. 用于標記單元格是否挖開的矩陣(為1表示挖開,為0表示未挖開)
int
mine_open[ROWS][COLS];
map[i][j].opened?<=>?mine_open[i][j]=?
map[i][j].marked?<=>?mine_mark[i][j]=?
map[i][j].num?<=>?mine_show[i][j]=?
Map[i][j].isMine
5.某個方格的八個相鄰方格x、y方向的偏移量
int offset_x[8]={-1, 0, 1,1,1,0,-1,-1}; //列
int offset_y[8]={-1,-1,-1,0,1,1, 1, 0}; //行
6. 地雷的數(shù)目統(tǒng)計
int num_total;?//總個數(shù)
int num_marked; //標記的個數(shù)
鼠標點擊處理
1.點擊鼠標左鍵(假設(shè)點擊的是y行x列)
//對于已經(jīng)標記的位置不作處理
if(mine_mark[y][x]==1) return;
num=mine_show[y][x];
if(num==-1) //該方格有地雷
{
在y行x列方格中畫一個雷,游戲失敗,結(jié)束。
}
else
//該方格無地雷
{
if(num>0) //周圍地雷數(shù)大于0
{
先在y行x列方格中顯示周圍雷的個數(shù)
然后設(shè)置該單元格為挖開狀態(tài)?Mine_open[y][x]=1;
}
else //遍歷并挖開此空白單元格相鄰的空白區(qū)域(廣度優(yōu)先遍歷)
bfs(x,y,hwnd,hDC);
}
2. 點擊鼠標右鍵(假設(shè)點擊的是y行x列)
//注:已經(jīng)挖開的格子(mine_open[y][x]==1)不存在打上或取消標記
if(mine_open[y][x]!=1)
if(mine_mark[y][x]==0) ?//打上旗幟標記
{
在y行x列方格中畫一個旗幟
mine_mark[y][x]=1;
}
else?//取消標記
{
在y行x列方格中取消旗幟
mine_mark[y][x]=0;
}
3.判斷任務(wù)是否完成
//判斷標準:無雷區(qū)域是否全部挖開
int Success()
{
int OK=1,x,y;
for(x=0;x
for(y=0;y
//該位置無雷,且沒有揭開
if(mine_show[y][x]!=-1 &&
mine_open[y][x]!=1)?{OK=0; break;}
return(OK);
}
3.bfs(廣度優(yōu)先搜索)算法
//無雷的連通區(qū)域查找(廣度優(yōu)先遍歷)///
void bfs(int x,int y)
{
Queue
Q;
Qelement
e;
如果隊列空了,則退出循環(huán)
出隊一個空白單元格(x,y)
挖開該單元格
處理相鄰8個單元格,有數(shù)字的直接挖開,空白的挖開后入隊(將x,y坐標存入隊列)
挖開鼠標點擊的單元格,并將該單元格坐標入隊
int
i,num,tmpx,tmpy,centerX,centerY;
char
num_str[2];
先清空隊列
e.x=x;
e.y=y;
Qin(&Q,&e);
Mine_open[y][x]=1; //作上訪問標記,利用mine數(shù)組作記錄
while(!Qempty(&Q)) //當隊列空時遍歷結(jié)束
{
Qout(&Q,&e);
//注意:旋轉(zhuǎn)中心方塊的坐標在8次循環(huán)中用到
//放入變量centerX、centerY加以保護(由于e.x、e.y在循環(huán)中會被更改)
centerX=e.x;
centerY=e.y;
//揭開該方格
draw_3D_rect(hDC,centerX*BSIZE,centerY*BSIZE,1," ");
for(i=0;i<8;i++) //檢查周圍的8個方格
{
tmpx=centerX+offset_x[i];
tmpy=centerY+offset_y[i];
//對于處于邊、角的方格,tmpx和tmpy可能為負數(shù)或超出最大值,要進行判斷
//注:對于已經(jīng)標記的位置(mine_mark[tmpy][tmpx]==0)不予處理
if(tmpx>=0
&& tmpx
&& tmpy>=0
&& tmpy
&& mine_mark[tmpy][tmpx]==0)
if(mine_open[tmpy][tmpx]==0) //該格子未挖開
if(mine_show[tmpy][tmpx]>0) //若是區(qū)域的邊沿(有數(shù)字)就揭開該方塊
{
num=mine_show[tmpy][tmpx];
_itoa(num,num_str,10);
draw_3D_rect(hDC,tmpx*BSIZE,tmpy*BSIZE,1,num_str);
mine_open[tmpy][tmpx]=1; //作上挖開標記
}
else //否則入隊
{
e.x=tmpx;
e.y=tmpy;
Qin(&Q,&e);
Mine_open[tmpy][tmpx]=1; //作上挖開標記
}
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java扫雷的设计思路_扫雷设计思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022中国人才市场招聘趋势白皮书
- 下一篇: 阿里产品苏杰访谈:关于失败