如何讓沒炸彈的空白相連地方一次顯示出來?如何計算?謝謝 |
尚未結案
|
kagaya
中階會員 發表:74 回覆:175 積分:59 註冊:2002-12-28 發送簡訊給我 |
邊想邊寫.228就這樣過了.終於
完成我在c 的第一個小遊戲踩地雷~_~
可計時也有排行榜
可是.....有個地方想不出來
就是如何讓沒炸彈的空白相連地方一次顯示出來?如何計算?
目前是一個一個去按=.=
想請教各位大大.謝謝
------
KUSO 無處不在
附加檔案:26572_bomb2.zip
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
kagaya
中階會員 發表:74 回覆:175 積分:59 註冊:2002-12-28 發送簡訊給我 |
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 四個方向的遞迴?原理不太了解*_*" 我先想想好了.謝謝大大~_~大約寫一下程式的虛碼,不可以compile的!(站長不懂BCB的) openblank(x,y:integer); { if (board[x][y]=' ') { openit(x,y); if ((inrange(x 1,y)) && (board[x 1][y]=' '))) { openblank(x 1,y); // 遞迴 } if ((inrange(x-1,y)) && (board[x-1][y]=' '))) { openblank(x-1,y); // 遞迴 } if ((inrange(x,y 1)) && (board[x][y 1]=' '))) { openblank(x,y 1); // 遞迴 } if ((inrange(x,y-1)) && (board[x][y-1]=' '))) { openblank(x,y-1); // 遞迴 } } } inRange(x,y) // 用來判斷是否再棋盤範圍內 OpenIt(x,y) // 用來打開空格的 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
kagaya
中階會員 發表:74 回覆:175 積分:59 註冊:2002-12-28 發送簡訊給我 |
謝謝.終於試出來了.但是只能向右向下或向左向上展開
if((xx 1)<=9)openbox2(xx 1,yy,kk); //向右(kk是TPanel)
if((yy 1)<=9)openbox2(xx,yy 1,kk); // 向下
if((xx-1)>=0)openbox2(xx-1,yy,kk); // 向左
if((yy-1)>=0)openbox2(xx,yy-1,kk); // 向上
如果四個都跑或左右.上下搭配的話.就出現錯誤訊息
stack overflow
這是什麼意思?堆疊溢位嗎?看不太懂...
就算改成
if((xx-1)>0)openbox2(xx-1,yy,kk); //向左
if((yy-1)>0)openbox2(xx,yy-1,kk); //向上
也是錯=.=
(陣列大小是0~9)再研究看看~_~
------
KUSO 無處不在 |
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 謝謝.終於試出來了.但是只能向右向下或向左向上展開 if((xx 1)<=9)openbox2(xx 1,yy,kk); //向右(kk是TPanel) if((yy 1)<=9)openbox2(xx,yy 1,kk); // 向下 if((xx-1)>=0)openbox2(xx-1,yy,kk); // 向左 if((yy-1)>=0)openbox2(xx,yy-1,kk); // 向上 如果四個都跑或左右.上下搭配的話.就出現錯誤訊息 stack overflow 這是什麼意思?堆疊溢位嗎?看不太懂... 就算改成 if((xx-1)>0)openbox2(xx-1,yy,kk); //向左 if((yy-1)>0)openbox2(xx,yy-1,kk); //向上 也是錯=.= (陣列大小是0~9)再研究看看~_~對了,您要先判斷是否已經打開了,才進入處理! 否則會造成無窮遞迴而Stack OverFlow openblank(x,y:integer); { if ((board[x][y]=' ') && (!IsOpened(x,y))) { openit(x,y); if ((inrange(x 1,y)) && (board[x 1][y]=' '))) { openblank(x 1,y); // 遞迴 } if ((inrange(x-1,y)) && (board[x-1][y]=' '))) { openblank(x-1,y); // 遞迴 } if ((inrange(x,y 1)) && (board[x][y 1]=' '))) { openblank(x,y 1); // 遞迴 } if ((inrange(x,y-1)) && (board[x][y-1]=' '))) { openblank(x,y-1); // 遞迴 } } } ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
kagaya
中階會員 發表:74 回覆:175 積分:59 註冊:2002-12-28 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
|
kagaya
中階會員 發表:74 回覆:175 積分:59 註冊:2002-12-28 發送簡訊給我 |
我是做成下面那樣. 感謝各位大大的教導~_~ void openbox2(int xx,int yy,TPanel *kk[10][10]){
if(bomb[xx][yy]==0) //表示沒炸彈
{
int qq=0;
if((xx-1>=0)&(yy-1>=0))qq=qq+bomb[xx-1][yy-1];
if((yy-1>=0))qq=qq+bomb[xx][yy-1];
if((xx+1<=9)&(yy-1>=0))qq=qq+bomb[xx+1][yy-1];
if((xx-1>=0))qq=qq+bomb[xx-1][yy];
if((xx+1<=9))qq=qq+bomb[xx+1][yy];
if((xx-1>=0)&(yy+1<=9))qq=qq+bomb[xx-1][yy+1];
if((yy+1<=9))qq=qq+bomb[xx][yy+1];
if((xx+1<=9)&(yy+1<=9))qq=qq+bomb[xx+1][yy+1];
kk[xx][yy]->Color=clBtnFace;
if(qq!=0){ //判斷週圍炸彈數
kk[xx][yy]->Caption=IntToStr(qq);
} else{
if((xx+1)<=9){ //遞迴展開相連無彈方格
if(kk[xx+1][yy]->Color!=clBtnFace)
openbox2(xx+1,yy,kk);
}
if((yy+1)<=9){
if(kk[xx][yy+1]->Color!=clBtnFace)
openbox2(xx,yy+1,kk);
}
if((xx-1)>=0){
if(kk[xx-1][yy]->Color!=clBtnFace)
openbox2(xx-1,yy,kk);
}
if((yy-1)>=0){
if(kk[xx][yy-1]->Color!=clBtnFace)
openbox2(xx,yy-1,kk);
} }
}
return; //這好像是多餘的?我多寫的
} void __fastcall TForm1::box1Click(TObject *Sender)
{
if(bnum==0){
ShowMessage("請選擇開始新遊戲");
return;
}
TPanel *kk=(TPanel *)Sender;
if((kk->Color==clRed)||(kk->Color==clBtnFace))return;
int xx=((kk->Tag)-((kk->Tag)))/10,yy=(kk->Tag);
if(bomb[xx][yy]==1){ //踩到炸彈
box1[xx][yy]->Color=clRed;
box1[xx][yy]->Caption="*";
for(int i=0;i<10;i ){
for(int j=0;j<10;j ){
if(bomb[i][j]==1){
box1[i][j]->Color=clRed;
}else{
box1[i][j]->Color=clBtnFace;
}
}
}
ShowMessage("你踩到地雷了=.=");
}else{ int qq=0;
if((xx-1>=0)&(yy-1>=0))qq=qq bomb[xx-1][yy-1];
if((yy-1>=0))qq=qq bomb[xx][yy-1];
if((xx 1<=9)&(yy-1>=0))qq=qq bomb[xx 1][yy-1];
if((xx-1>=0))qq=qq bomb[xx-1][yy];
if((xx 1<=9))qq=qq bomb[xx 1][yy];
if((xx-1>=0)&(yy 1<=9))qq=qq bomb[xx-1][yy 1];
if((yy 1<=9))qq=qq bomb[xx][yy 1];
if((xx 1<=9)&(yy 1<=9))qq=qq bomb[xx 1][yy 1];
box1[xx][yy]->Color=clBtnFace;
if(qq!=0){
box1[xx][yy]->Caption=IntToStr(qq);
}else{
openbox2(xx,yy,box1);
} }
}
------
KUSO 無處不在 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |