Re: [wizs] 問題-選取
看板mud_sanc (Sanctuary - 聖殿)作者laechan (小太保)時間14年前 (2011/06/20 17:47)推噓0(0推 0噓 0→)留言0則, 0人參與討論串3/3 (看更多)
※ 引述《justinj (黑旋風)》之銘言:
: 在前幾天想要寫數獨製造程式時的某些問題
: 假如 a=({1,2,3,4,5,6,7,8,9})時
: Q1.想要讓a亂序的話是 a=sort_array(a,"random_sort",this_object());
: //random_sort的設定就是return -1+random(2)
int random_sort(int a1,int a2)
{
return -1+random(3);
}
自訂上述函數即可,再讓你的 a 陣列去呼叫它.
a=sort_array(a,"random_sort",this_object());
(random_sort 就自己寫在 this_object() 我代表的物件中)
這樣 a 就會被亂數排序。
: Q2.如果想要隨便選取3個數..而且這3個數還亂序的話..
: A2.就是題目1的解a..然後a[0..2]就可以了吧
: //可能還有更簡單的方法
a=sort_array(a,"random_sort",this_object());
b=a[0..2];
這樣 b 就是從「已亂數排過序」的陣列裡頭選出前三個數.
: Q4.如果題目2限制必定要有某群不定元素呢?
: //例如限制要有mixed b裡的元素...b可能空的,可能1個,2個
mixed a,b,c=({});
a=({1,2,3,4,5,6,7,8,9});
b=({不定陣列});
// 從 a 隨便取出 3 個
a=sort_array(a,"random_sort",this_object());
c=a[0..2];
// 把 c 跟 b 加在一起變成新的 c
c+=b;
// 再亂數排序
c=sort_array(c,"random_sort",this_object());
: Q5.a1=({1,2,3,4,5}),a2=({2,3,4}),a3=({2,3,5}),
: b1從a1任選一元素出來,...(其它同理)
: b1,b2,b3皆為不同的數字
: 那要怎麼隨機選?
int b1,b2,b3;
b1=a1[random(sizeof(a1))]; // 先從 a1 隨機選一個
a2=a2-({b1}); // 把 b1 從 a2 裡頭扣掉(有就會扣)
b2=a2[random(sizeof(a2))];
a3=a3-({b1});
a3=a3-({b2}); // 再把 b1, b2 從 a3 裡頭扣掉
b3=a3[random(sizeof(a3))];
三次測試結果如下
b1=4, b2=3, b3=2.
b1=5, b2=4, b3=3.
b1=3, b2=2, b3=5.
: Q6.題目5裡b1,b2,b3其中有一個必定有2的情況
就 a1, a2, a3 來說, 三個都有元素 ({2}) 的情況,就
變得很單純.
switch(random(3))
{
case 0:
b1=2; a2-=({2}); a3-=({2});
break;
case 1:
b2=2; a1-=({2}); a3-=({2});
break;
case 2:
b3=2; a1-=({2}); a2-=({2});
break;
}
// 假設上面跑出 b2=2
// 這時 b1 不會是 2(因為 2 已經先從 a1 裡頭扣掉)
if(b1!=2)
b1=a1[random(sizeof(a1))]; // 先從 a1 隨機選一個
a2=a2-({b1}); // 把 b1 從 a2 裡頭扣掉(有就會扣)
// 因此時 b2 為 2, 所以不做底下動作
if(b2!=2)
b2=a2[random(sizeof(a2))];
a3=a3-({b1});
a3=a3-({b2}); // 再把 b1, b2 從 a3 裡頭扣掉
if(b3!=2)
b3=a3[random(sizeof(a3))];
測試十次結果
b1=3, b2=4, b3=2
b1=4, b2=3, b3=2
b1=3, b2=2, b3=5
b1=5, b2=4, b3=2
b1=5, b2=2, b3=3
b1=4, b2=2, b3=3
b1=4, b2=2, b3=3
b1=2, b2=3, b3=5
b1=2, b2=4, b3=3
b1=2, b2=3, b3=5
以上是「特殊情況」。一般情況你可以這麼寫..
int i;
mixed a1=({}),a2=({}),a3=({});
while(member_array(2,({b1,b2,b3})==-1) // 一直都沒有 2
{
a1=({1,2,3,4,5}),a2=({2,3,4}),a3=({2,3,5});
if(i++>100) break;
b1=a1[random(sizeof(a1))]; // 先從 a1 隨機選一個
a2=a2-({b1}); // 把 b1 從 a2 裡頭扣掉(有就會扣)
b2=a2[random(sizeof(a2))];
a3=a3-({b1});
a3=a3-({b2}); // 再把 b1, b2 從 a3 裡頭扣掉
b3=a3[random(sizeof(a3))];
}
這樣它就會一直去做選出 b1,b2,b3 的動作, 並且會一直
執行到其中一個終於都有 2 的情況。
不過用 while 就必須小心造成無限迴圈的情況, 因此才會
加上一個 if(i++>100) break; 的防無限迴圈判斷。
(通常做到 100 次都無法求得, 就是有寫錯或怎樣)
: Q7.題目5裡b1,b2,b3裡面必定要有某群不定元素呢?
: //例如限制要有mixed b裡的元素...b可能空的,可能為({2}),({3}),({2,3})之類的
把上面的 b1, b2, b3 宣告為 mixed 即可, 語法都類似.
: 其它問題:
: 要怎麼讓玩家不放出en的攻擊
: 目前已知有2個..
: 一個是讓玩家漂浮(cast float)
: 另一個是讓玩家打不還手(attack stop)
: 問一下還有第3種嗎?
一、週期性對玩家設定特別參數
if(me->query_temp("time_record/cmd_attack_times"))
{
write(NOR"(你現在是打不還手的狀態).\n");
return ;
}
所以怪物若週期性對玩家 set_temp("time_record/cmd_attack_times",time()+秒);
例如在怪物的 special_fun 中做上述動作之類的,然後再
把該怪物發動特攻的機率設高一點, 每次發動特攻就每次做
上述動作就可達到類似效果。
二、同樣是設定特殊參數
else if(sk=(string)me->query_temp("no_smite"))
{
write(sk);
return ;
}
但是這個就不建議, 因為它沒有終止機制.
(用 time 就比較保險, 時間過了玩家就可正常攻擊)
Belldandy.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.29.173.213
※ 編輯: laechan (1.165.161.242), 06/30/2014 23:08:52
討論串 (同標題文章)
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
21
49