作者laechan (小太保)
看板mud_sanc
标题Re: [wizs] 问题-选取
时间Mon Jun 20 17:47:22 2011
※ 引述《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