精華區beta mud_sanc 關於我們 聯絡資訊
在聖殿使用的迴圈函數, 大概有 for, while, do 三種. 有時候你會發現 由這三種函數寫成的迴圈, 不過最常見的就是 for. 看不懂的 for, 大概 就是因為它是這麼寫的... int i,j; for(i=0,j=0 ; i<10 ; i++,j++) { ... } 碰到這樣的寫法, 就要特別注意 ; 號的位置. 分號只會有兩個, 因為 for 的基本架構就是... for(起始值宣告區;條件式滿足區;足碼累加區) 三個區段以兩個分號分格, 而起始值宣告區[不一定只能宣告一個起始值], 足碼累加區[也不一定只能累加一個足碼]. 再來, 底下是另一種特殊的 for... for( ; this_player()->query("warexp")<100000 ; ) { write("你的戰功未滿 10 萬, 繼續加~~~\n"); this_player()->add("warexp",10000); } write("你的戰功滿 10 萬以上了!!\n"); 像這種沒有前段與後段, 或者只有前段沒有後段, 或者只有後段沒有前段的 寫法, 也是 for 支援的功能, 但是一般, 我們更會使用 while 來寫... while(this_player()->query("warexp")<100000) { write("你的戰功未滿 10 萬, 繼續加~~~\n"); this_player()->add("warexp",10000); } 這是因為 for 的前段與後段其實都能寫在 { } 裡頭, 所以如果只為了強調 條件式滿不滿足時, 使用 while 更簡捷. 更重要的一點是, while 提供了 for 所無法做到的部份, 那就是[沒有足碼]時. 比方我們要跑 10 段敘述, 我們可以用 for(i=1;i<=10;i++) 來寫, 但是如果我們要跑好幾段敘述, 直 到某一個條件成立. 在條件成立之前, [不知道要跑多少段], 未知的迴圈數 就不是 for 可以辦到的, 但是 while 卻可以. 底下就講幾個 while 常見的例子... a. 判別一個檔案有幾行... string some_file; int i=1; while( read_file(some_file,i,1) ) i=i+1; write("這個檔案共 "+(i-1)+" 行.\n"); read_file(欲讀的檔案名,第幾行,某無用參數) 當這個函數讀到第 n 行 而檔案只有 n-1 行時, 會傳回[檔案不存在的判別值], 所以在 n 行以前 都讀的到.. while( read_file(some_file,i,1) ) i=i+1; 當 ( 讀的到某檔的第 i 行時 ) i=i+1; 讀不到時就會退出迴圈. b. 隨便抓取 3 個[在線上且等級 120]的玩家 mixed usr=users(); // 讀取所有玩家, 包括連線中的 mixed ob=({}); int i; while(environment(usr[i]) // 在某個房間(在線上) && usr[i]->query("level")>119 // 等級超過 119(也就是 120) && !wizardp(usr[i]) // 而且不是巫師 && sizeof(ob)<3 // 還抓不到 3 個人時 ) { ob+=({usr[i]}); i=i+1; } 使用 while 時必須注意底下幾個事項... 1. 避免造成無限迴圈 2. 能不用 while 就盡量不要用 while. 第一點, 比方底下... int i=100; while(i<=100) i=i-1; 這是一種無限迴圈, 首先 i 累減的結果一定會小於 100, 而滿足的成立式卻是i<=100, 一個本來就會一直對下去的成立式, 就會造成迴圈跑不完, 請特別注意. 第二點, 比方... int i=100; while(i<1000) i=i+100; 這可以用底下的寫法... for(i=100;i<1000;i=i+100);