全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1907
推到 Plurk!
推到 Facebook!

如何讓沒炸彈的空白相連地方一次顯示出來?如何計算?謝謝

尚未結案
kagaya
中階會員


發表:74
回覆:175
積分:59
註冊:2002-12-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-28 22:35:04 IP:210.85.xxx.xxx 未訂閱
邊想邊寫.228就這樣過了.終於 完成我在c 的第一個小遊戲踩地雷~_~ 可計時也有排行榜 可是.....有個地方想不出來 就是如何讓沒炸彈的空白相連地方一次顯示出來?如何計算? 目前是一個一個去按=.= 想請教各位大大.謝謝
------
KUSO 無處不在
附加檔案:26572_bomb2.zip
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-28 22:40:19 IP:192.168.xxx.xxx 未訂閱
引言: 邊想邊寫.228就這樣過了.終於 完成我在c 的第一個小遊戲踩地雷~_~ 可計時也有排行榜 可是.....有個地方想不出來 就是如何讓沒炸彈的空白相連地方一次顯示出來?如何計算? 目前是一個一個去按=.= 想請教各位大大.謝謝
提示: 要用遞迴的方式去寫! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
kagaya
中階會員


發表:74
回覆:175
積分:59
註冊:2002-12-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-01 10:56:37 IP:210.85.xxx.xxx 未訂閱
四個方向的遞迴?原理不太了解*_*" 我先想想好了.謝謝大大~_~ 發表人 - kagaya 於 2003/03/01 10:57:27
------
KUSO 無處不在
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-01 11:35:53 IP:210.202.xxx.xxx 未訂閱
引言: 四個方向的遞迴?原理不太了解*_*" 我先想想好了.謝謝大大~_~
大約寫一下程式的虛碼,不可以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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-01 15:12:12 IP:210.85.xxx.xxx 未訂閱
謝謝.終於試出來了.但是只能向右向下或向左向上展開 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-01 19:13:54 IP:192.168.xxx.xxx 未訂閱
引言: 謝謝.終於試出來了.但是只能向右向下或向左向上展開 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-01 22:08:03 IP:210.85.xxx.xxx 未訂閱
果然是這個原因.終於完成了.再來做別的~_~ 實在太感謝站長大大了.解說這麼詳細 讓我領悟到很多 真是太感謝了~_~ 記得以前用java寫騎士問題.都沒人可問.最後 雖然寫出來了可是要跑1個多小時才跑出結果=.=(我是賽陽600耶.不是286) 真是太感謝了~_~ 發表人 - kagaya 於 2003/03/01 22:14:27
------
KUSO 無處不在
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-01 23:12:03 IP:211.74.xxx.xxx 未訂閱
kagaya,得到解決方法了 方便 share 出心得與方法嗎?   < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
kagaya
中階會員


發表:74
回覆:175
積分:59
註冊:2002-12-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-02 00:16:52 IP:210.85.xxx.xxx 未訂閱
我是做成下面那樣. 感謝各位大大的教導~_~    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 無處不在
系統時間:2024-05-04 21:12:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!