【新人求教】
gamemaker吧
全部回复
仅看楼主
level 9
大四象 楼主
求教一下,
材料有
1.变量 A,B,C,D,E,F
2.力量等级(随机的1~6)
如何把 1~6 这6个数值 随机分别赋值给 A,B,C,D,E,F个变量而保障其不重复
比如随机把 3 赋值给 A 后
就不能再把 3 赋值给其他 变量
只能从 1,2,,4,5,6 随机再选取一个赋值
求教要怎么做,,,[不高兴]谢谢
2020年03月11日 07点03分 1
吧务
level 13
A=1到6的整数随机
B=1到5的整数随机
如果B大于等于A,B自增1
C=1到4的整数随机
如果C大于等于AB里较小的一个,C自增1
如果C大于等于AB里较大的一个,C自增1
D=1到3的整数随机
如果D大于等于ABC里最小的一个,D自增1
如果D大于等于ABC里中间的一个,D自增1
如果D大于等于ABC里最大的一个,D自增1
太长了,后边两个自己写吧。
2020年03月11日 09点03分 2
谢谢吧主[哈哈]
2020年03月11日 12点03分
能不能理解成D每大于ABC中任意一个数字自增1?
2020年03月12日 03点03分
@MikuScarlet 比如得到的随机值是4,但是已经有4和5了,加一次等于5[滑稽],就还要加一次[滑稽]
2020年03月12日 06点03分
level 9
大四象 楼主
谢谢吧主提供的思路,成功了[哈哈]
2020年03月11日 12点03分 3
level 15
唔,这是一个随机排列的问题,我说一下我的思路吧。
先给定两个6长度的数组。
然后从前向后,i从0到5,分别依次给予序号si=i和一个分值vi=rand;
在这个过程中,j从0到i-1,让vi分别与vj作比较,如果vj<vi那么++sj,--si
最后把数组si里面的值赋给A到F六个变量。
大致如下:
var s, v, i, j;
for(i=0; i<6; ++i){
s[i] = i;
v[i] = random();
for(j=0; j<i; ++j){
if(v[i] < v[j]){
++s[j]; --s[i]
}
}
}
2020年03月11日 14点03分 5
谢谢[大拇指]
2020年03月11日 16点03分
忘记了,这是用js写的,gms不能写++得改成+=1[狂汗]
2020年03月11日 16点03分
level 15
可是 不是直接有个ds_list_shuffle函数(貌似
2020年03月11日 14点03分 6
我太弱了,还没有去学习列表[汗]
2020年03月11日 16点03分
吧务
level 13
首先是4L的算法……咱知道层主在用DND啦,3个位置“必须都跳到新位置”的话,其实只有顺时针/逆时针两种转法。1、2、3跳到新位置如果先给前两个位置随机出2、1的话,第3个位置会无解的。如果到GML里,随便用个啥数据额结构之类的,计算4+个位置就方便很多了,前边自由随机,到最后2个的时候判断一下是固定模式还是随机最后一次。
然后5L的做法应该没问题,反正和咱的通常想法走向了不同的方向,咱总是感觉要出BUG的样子[滑稽]
2020年03月11日 14点03分 7
吧务
level 13
再提供个思路吧……徒手堆代码,错了不管
a[i]表示第i格子分配的序号,0表示未分配,分配结果从1开始……假设已经进行了0值初始化
now表示正在进行的分配
rnd用于存储随机到的值
rst表示最终选定的格子
ii用来记录循环
for(now=0;now<6;now=now+1){
rnd=floor(random(6-now));
rst=0;
for(ii=0;ii<rnd;ii=ii+1){
rst=rst+1;
while(a[rst]>0){rst=rst+1;}
}
a[rst]=now+1;
}
2020年03月11日 15点03分 8
谢谢[大拇指]
2020年03月11日 16点03分
level 9
大四象 楼主
...........我的一个朋友不耐烦的把代码扔给我,,说随机的数值和数量自己填.... ..... ...,我看了半天现在才搞明白原理...真是一环套一环啊...[泪][泪]
感谢吧友们提供的帮助;大家共同学习,一起进步;[大拇指]
2020年03月11日 15点03分 9
level 11
ds_list_add(lst, 1)
...
ds_list_add(lst, 6)
ds_list_shuttle(lst)
A = ds_list_find_value(lst, 0)
ds_list_delete(lst, 0)
...
F = ds_list_find_value(lst, 0)
ds_list_delete(lst, 0)
我没打开gm,直接写的,大概就是这个意思了
2020年03月12日 03点03分 10
将1-6数字放入lst中,然后再使用shuttle打乱顺序,然后再获取零号元素后并删除它。这里用栈可能会好一些,但栈好像没有shuttle方法?没去看。
2020年03月12日 03点03分
level 12
方法很多,最简单的就是10楼那个方法。
或者洗牌算法也很简单:
var a, i, j, t;
// 生成属性数组
for (i = 0; i < 6; i += 1)
{
a[i] = i + 1;
}
// 打乱
for (i = 5; i >= 0; i -= 1)
{
j = irandom(i + 1);
t = a[i];
a[i] = a[j];
a[j] = t;
}
// 赋值
A = a[0];
B = a[1];
C = a[2];
D = a[3];
E = a[4];
F = a[5];
2020年03月12日 11点03分 11
[大拇指]
2020年03月12日 15点03分
1