在聖殿使用的迴圈函數, 大概有 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);