4つの方向からランダムに選択したい:
movePlayer(map, &positionPlayer, direction);
UP
ここで、方向は、、、、およびのいずれDOWN
かLEFT
ですRIGHT
。
この関数でこれを行う方法はまだわかりませんrand()
。
これどうやってするの?各方向に番号を割り当ててから、それらの範囲内で乱数を選択する必要がありますか?
ご協力ありがとうございました。
はい、各方向に番号を割り当てる必要があります。すなわち。0 = UP 1 = DOWN 2 = LEFT 3=RIGHT次のようなコードが必要です。
int direction = rand()%4;
これを行う最も簡単な方法は、rand関数のモジュロを実行して、0から3(両端を含む)までの数値を取得することです。
int x = rand() % 4;
次に、switchステートメントを実行して方向を選択できます
switch(x)
{
case 0:
movePlayer(map, &positionPlayer, UP);
break;
case 1:
movePlayer(map, &positionPlayer, DOWN);
break;
case 2:
movePlayer(map, &positionPlayer, LEFT);
break;
case 3:
movePlayer(map, &positionPlayer, RIGHT);
break;
}
もちろん、これは完全な分散で正確にランダムではありません(モジュラスはややハックです)。
実際の分布で実際のランダム性が必要な場合は、Boost.Randomを調べてください。
direction
列挙型の場合:
enum Direction {
UP,
DOWN,
LEFT,
RIGHT
} direction;
C / C ++では、列挙定数は整数として表されます。最初の値、UP
は0に対応し、DOWN
は1、というように続きます。
だからあなたはただ呼び出すことができます:
movePlayer(map, &positionPlayer, static_cast<Direction>(rand() % 4));
movePlayer
これは、ランダムに選択された方向の値で呼び出されます。
の範囲を狭めるためにモジュラス演算子を使用することは必ずしもお勧めできませんrand()
。より均一な分布を持つものが必要な場合は、他の方法を検討する必要があります。
rand()は必ずしも良いとは限りません。<random>
おそらくより良いオプションです。
C ++ 11:
#include <random>
#include <iostream>
enum Direction : char {
north, east, south, west
};
std::ostream &operator<< (std::ostream &os, Direction d) {
switch (d) {
case Direction::north : return os << "North";
case Direction::east : return os << "East";
case Direction::south : return os << "South";
case Direction::west : return os << "West";
}
}
std::uniform_int_distribution<Direction> random_direction
{Direction::north, Direction::west};
int main() {
// you can use any of several different sources of random values depending on your needs
std::mt19937 eng;
for (int i=0;i<10;++i)
std::cout << random_direction(eng) << '\n';
}
方向を暗黙的にintに変換したくない場合は、次enum class
の定義を使用できrandom_direction
ます。
template<typename Engine>
Direction random_direction(Engine &&eng) {
std::uniform_int_distribution<> dist
{int(Direction::north),int(Direction::west)};
return Direction(dist(std::forward<Engine>(eng)));
}
より良い方法は、rand()%4の前にsrand(time(0))を呼び出すことです。これにより、プログラムを実行するたびに、異なる乱数のセットが生成されます。srand()なしでrand()を呼び出すと、プログラムが実行されるたびに同じ乱数のセットが生成されます。