パズルゲームのロジック

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
猫旅

パズルゲームのロジック

#1

投稿記事 by 猫旅 » 15年前

DXライブラリで落ち物パズルを作ろうとしております。
ただ一点どうしても思いつかないロジックがあります。

よくぷよぷよ等で次に落ちてくるぷよが見えますよね?
あれってお互いが続く限り無限にランダムで出続けるかと思います。
しかも同じ回数なら同じぷよが・・・。

あれが完全ランダムな筈なのに1P側と2P側でどうやって同じようにしているのでしょうか?
rand関数の値を保持するやり方にするとしたらデータを保持できなくないでしょうか?

例えば1P側では9999個目ぷよが落ちてきて2P側では2個目のぷよが落ちてくるとします。
※そんな状況はないですが

そんな時でも1P側で出た2個目と2P側で落ちてくるぷよは同じですよね?
値を9999個も保持しておくとかなり効率も悪く無駄ではないでしょうか・・・?
しかも無限にデータの保持が必要なのでしょうか?

わかりづらいですが表にしてみました。
番目    1    2    3    4    ・・・9999
1P    RR    RB    BB    GB        RR
2P    RR    RB    まだ落ちていない
説明が下手で申し訳御座いません。

御津凪

Re:パズルゲームのロジック

#2

投稿記事 by 御津凪 » 15年前

C 標準関数の rand 関数ではシード値などの乱数生成に必要な情報が内部に一つしかないので、これを使って上記のようなことを実現するには、
シード値を記憶し、シード値が与えられてから何回目の呼び出しかでその分 rand 関数を呼ぶことです。
簡単な例を示すと、下記のようになります。
int get_rand( int seed, int count ){
    int r = 0;
    srand(seed);
    while(count > 0){
        r = rand();
        --count;
    }
    return r;
}
これでは count が増えていくにつれ、処理が重くなり、非常に効率が悪いことが分かります。

そこで、シード値など乱数生成に必要な情報を外部で保存できる乱数生成関数を用意し、
それぞれに同じシード値を与えれば、実現することができます。

つまり、乱数生成アルゴリズムを乱数生成情報が複数持てるようにしたものであればOK
ということになります。

たいちう

Re:パズルゲームのロジック

#3

投稿記事 by たいちう » 15年前

解決方法は3通り思いつきます。

1つは自前の擬似乱数を使う方法。
1つの値から次の値が一意に決まるならば、
1pと2pでそれぞれ独立に計算しても、同じ乱数列が得られます。
詳しくは「擬似乱数」について調べてください。

もう1つは1万でも100万でもメモリ上に記憶しておく方法です。
ぷよの色ならば1バイトで2つ分を表せるでしょう。
DirectXが動く環境で10KBや1MB余分に使っても誰も困らないでしょう。

最後は100個だけ覚えておく方法。
100個も差がついたら、違いに気付く人はまずいないでしょう。

dic

Re:パズルゲームのロジック

#4

投稿記事 by dic » 15年前

無駄とか効率とかよくわかりませんが
ぷよぷよは同じ順番で同じ組み合わせが落ちてきてますよ

バグ

Re:パズルゲームのロジック

#5

投稿記事 by バグ » 15年前

効率度外視ならば、たいちうさんの書き込まれている2番目の方法が簡単かつ確実かな?


>>dicさん
おそらく、落としたぷよの個数に10000や20000などの大差がつくことは想定していないでしょうし、そこまで差が開くことはありえないでしょうから、記憶できる個数に限界はあるんじゃないかと思われます。あくまでも推測ですけどね(^_^;)

猫旅

Re:パズルゲームのロジック

#6

投稿記事 by 猫旅 » 15年前

皆様ご回答ありがとうございます。

皆様の回答を参考にして色々考えてみたのですが
あらかじめ50個の配列にランダムしたものを書き出し
その配列をループさせる様なロジックにします。

1⇒2⇒・・・50⇒1⇒みたいな感じです。
これなら問題ない気がします。

色々とありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る