ページ 11

ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 17:31
by 燈火
マインスイーパーの改造ゲームを作っております。
ゲームの概要は上手く説明できないので
わかりにくいと思うのですがプログラムにバグが出てしまっております。

二次元配列で用意したマップにランダムに0~2の数字が入っております。
この中から2のマスを数えランダムで2の位置にプレイヤーの初期値をセットしたいです。

MapCount関数で2の数が返ってきます。
これの余りを求めればランダムの初期位置を生成できると思うのですが
毎回同じ値しか返ってきません。
※MapCount関数で返ってくる数字は毎回違います。

わかりにくい質問ですみません。

~略 Map.Map[20][20]にランダムで0~2の値をセット~

Map.MoveCount = MapCount( Map.Map ); // 毎回値が変わってるので多分正確に動いてます。

int startPos = rand()%Map.MoveCount;
int startCount = 0;

for (int y=0; y<MAP_H; y++) {
    for (int x=0; x<MAP_W; x++) {
        if( startCount == startPos ){
            Play.Cx = x; // 初期位置の座標
            Play.Cy = y; // 初期位置の座標
            break;
    }else if( Map.Map[y][x] != 0 && Map.Map[y][x] != 1 ) startCount++;
}

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 17:49
by パコネコ
わかりませんが…breakの後あたりに…//ミス
カッコの数とかですか?
=========
elseがもう一個上?
で下に「}」ですか?
=========
一番下に「}」を追加で十分ですね。

それとこっちはどうでもいいのですが、
elseのif文「!=」より「1<」のほうがいいのでは?
(マイナス使うならすいません)
画像

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 17:50
by バグ
>>二次元配列で用意したマップにランダムに0~2の数字が入っております。
>>この中から2のマスを数えランダムで2の位置にプレイヤーの初期値をセットしたいです。

ここまでは分かります。


>>これの余りを求めればランダムの初期位置を生成できると思うのですが

これの意味が分からないです。
差し支えなければ、MapCount関数のソースも公開した方が話しが早いような気がしますよ。

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 18:27
by dic
int startPos = rand()%Map.MoveCount;
が迷路のスタート地点で
これがランダムにしてるけど、毎回同じ値ってことでしょうか?

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 18:30
by シエル
>毎回同じ値しか返ってきません。

これはどの値のことを言っているのですか?

int startPos = rand()%Map.MoveCount;

これですか?

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 18:37
by h2so5
あまり理解できないのですがおかしいところを数点。

1.
Map.Map[y][x] != 0 && Map.Map[y][x] != 1 は
Map.Map[y][x] == 2 と同じでは?

2.
startPosが0の時、必ず初期位置が座標[0,0]になる
(1.のチェックが入っていない)

3.
~略 Map.Map[20][20]にランダムで0~2の値をセット~
の部分を見ていないので推測ですが、MapCountで2の数を取得しているということは
あるマスが0か1か2になるかは全くランダムなのでしょうか。

それとも必ず配列に2が1つ以上含まれるようにセットしていますか?
しているのなら問題はありませんが。

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 18:55
by 燈火
皆様ご回答ありがとうございます。
配列内の2の数を数えてその範囲内でランダムの値を出します。
10個あったら0~9の値をランダムで値を取得し
for文で回して取得した値番目にでてきた2の場所に初期位置をセットすれば
毎回違う2場所を初期位置にセット出来ると思ったのですが・・・
わかりにくい説明ですみません。

Map.MoveCountには毎回違う値が入っております。
(2の数だけ)

初期位置(cx,cy)が毎回同じ値になってしまいます。

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 18:56
by パコネコ
breakが1つだけではfor文の「y」のほうでもう一度ループするので必要ないのでは?
うまくカウントできてないと思います。

それと、プレイヤーの位置は2のときだけだと書いてますが、これだとおそらく、2以外でも…
おそらく毎回帰ってきている値は、x=0;y=max?;だと思ったのですが…違いましたでしょうか?
xは違いが出るかもしれませんが…似たような場所のように見えます。

プレイヤーの位置を入力する条件を増やすべきだと思います。
「2のときのみ」とか
elseがついているためif文の中に分けるべきだと思いますが…
==================
for (int y=0; y<MAP_H; y++) {
for (int x=0; x<MAP_W; x++) {
if(map.map[y][x]==2){//条件を満たしていれば判断
   if( startCount == startPos ){
  Play.Cx = x; // 初期位置の座標
Play.Cy = y; // 初期位置の座標
        break;
}else startCount++;
}
}if( startCount == startPos )break;
}
こんな感じだと思うのですが… 画像

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 19:07
by box
> 10個あったら0~9の値をランダムで値を取得し

このコードはどこにありますか?

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 23:03
by ISLe
> 毎回同じ値しか返ってきません。

srandで乱数の発生系列を初期化していないのでは?

Re:ランダムで初期位置を決定する

Posted: 2010年8月30日(月) 23:10
by 燈火
皆さんこんなわかりにくい質問なのに回答ありがとうございます。

>>おそらく毎回帰ってきている値は、x=0;y=max?;だと思ったのですが…違いましたでしょうか?
その通りです!!
これはプログラムが原因だったのですね・・・。

頂いたソースに変更したら問題なく動きました。
ありがとうございました!!