HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0316
naughtrndがうまく使えないので教えてください6解決


naught

リンク

2011/3/16(Wed) 08:58:57|NO.37617

E3Dを使ってゲームを作っています。MOBの出現位置をrndを使ってばらばらにしようと思い
以下のようにしました。(必要と思われるところを抜粋した最小限構成です)

#define MOBTYPE 1 ;MOBTYPE = MOBの種類。今はとりあえず1種類 #define MOBMAX 5  ;MOBMAX = ある一種類のMOBの最大数 dim mob, MOBTYPE, MOBMAX repeat MOBTYPE a = cnt repeat MOBMAX randomize mob_posx = rnd ( 444 ) : mob_posz = rnd ( 444 ) if mob_posx < 333 : mob_posx = -mob_posx if mob_posz > 333 : mob_posz = -mob_posz E3DSigLoad enemy.a, mob.a.cnt, 1, 1.5     ;enemy = MOBデータ E3DSetPosOnGround mob.a.cnt, jimen, 0, -30  ;jimen = 地面データ E3DSetPos mob.a.cnt, mob_posx*100, 0, mob_posz*100 E3DSetBeforePos mob.a.cnt loop loop
こうしたところひどいと毎回、良くて5回に一回ぐらい同じような場所に出現します
ちなみに、A,B,C,D,Eの5体MOBが最初、1,2,3,4,5の場所に現れたとすると
次にA,B,C,D,Eが2,4,1,5,3の場所に現れても、同じ場所に現れたものとみなします
別の場所に現れるというのははA,B,C,D,Eが8,6,7,9,10の場所に現れる状況を指します



この記事に返信する


晩御飯

リンク

2011/3/16(Wed) 09:41:25|NO.37618

randomizeを呼ぶのは一度だけで良いです。
つまり、ループの中に入れないで下さい。



naught

リンク

2011/3/16(Wed) 18:19:35|NO.37623

とりあえず、ループからは外しました
でも変わりません



Gold

リンク

2011/3/16(Wed) 22:27:01|NO.37633

E3Dに手をつけてないので把握しかねる部分がある上で。

rndの乱雑さについて。

#define MOBTYPE 1 ;MOBTYPE = MOBの種類。今はとりあえず1種類 #define MOBMAX 5 ;MOBMAX = ある一種類のMOBの最大数 screen 0 ,700 ,600 *start cls dim mob, MOBTYPE, MOBMAX randomize repeat MOBTYPE a = cnt repeat MOBMAX mob_posx = rnd ( 444 ) : mob_posz = rnd ( 444 ) /* if mob_posx < 333 : mob_posx = -mob_posx if mob_posz > 333 : mob_posz = -mob_posz */ pos mob_posx ,mob_posz mes "◎"+cnt /* E3DSigLoad enemy(a), mob(a ,cnt), 1, 1.5     ;enemy = MOBデータ E3DSetPosOnGround mob(a ,cnt), jimen, 0, -30  ;jimen = 地面データ E3DSetPos mob(a ,cnt), mob_posx*100, 0, mob_posz*100 E3DSetBeforePos mob(a ,cnt) */ loop loop pos 700-70 ,600-25 button goto "rnd" ,*start stop

乱数で位置を決めるというのは、あくまでMOBをひとつずつ適当な場所に出すだけで、
必ず出現場所を散らばらせるというわけではない。
MOBの個数が増えるほど、同じ場所に出現することは劇的に多くなることは
すでに理解しているはず。

そのうえで散らばらせたいなら
・出現させる個体ごとに、ある程度の出現範囲を定めて、乱数を読み込む
・出現した位置を記録し、のちに記録した位置の周囲に出た場合は、再び乱数を読み込む



Gold

リンク

2011/3/16(Wed) 22:33:48|NO.37634

描画順を確認するための比較用
上のも含めver3.2 で適当にやったのでver2 だったらbutton goto をbutton に


#define MOBMAX 5 ;MOBMAX = ある一種類のMOBの最大数 screen 0 ,700 ,600 *start_off num_print = 0 ;;描画順を表示(on = 1 ,off = 0) *start_on cls randomize repeat MOBMAX mob_posx = rnd ( 444 ) : mob_posz = rnd ( 444 ) pos mob_posx ,mob_posz mes "◎"+cnt*num_print loop num_print = 1 pos 700-140 ,600-25 button goto "rnd - on" ,*start_on pos 700-70 ,600-25 button goto "rnd - off" ,*start_off stop



naught

リンク

2011/3/17(Thu) 08:41:01|NO.37640

>・出現させる個体ごとに、ある程度の出現範囲を定めて、乱数を読み込む
・出現した位置を記録し、のちに記録した位置の周囲に出た場合は、再び乱数を読み込む

なるほど。これは思いつきませんでした。皆さんの回答を見て思いついたのですが、


mob_posx = rnd ( 444 ) / rnd ( 30 ) : mob_posz = rnd ( 444 ) / rnd ( 30 )
みたいにすれば、少数も表れるので444*444通りからさらに増えますね。

それをさらにGoldさんが教えてくださったのを使えばさらにばらばらにできそうです

ありがとうございました

追記 : Goldさんの二つ目のコメントもやってみます



玄冬

リンク

2011/3/17(Thu) 09:03:36|NO.37641

>rnd ( 444 ) / rnd ( 30 )
rnd( 30 )の方が0になったときエラーになります。
rnd ( 444 ) / (rnd ( 30 ) + 1)

などの対策が必要になります。



ONION software Copyright 1997-2021(c) All rights reserved.