ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

マップにランダムに配置する

2次元のマップに複数のキャラクターをランダムに配置しようと思い、xとyをランダムで求めようとしたが、これだとすでに配置した位置が出てしまうことがある。
そこで、2次元の配列を1次元の配列で表し、配列に先頭からキャラクターを詰めて代入。その配列をシャッフルし、再び2次元の配列に戻してやれば、ランダムに配置することが出来る。
実際にvectorアルゴリズムのshuffleを利用して試してみたのが次のコード。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void){
    int w=4; // マップ幅
    int h=4; // マップ高さ
    int num=8; // 配置するもの個数
    
    // vectorに並べる
    std::vector<int> vec;
    for(int i=0; i<w*h; ++i) {
        if(i < num) { vec.push_back(1); }
        else { vec.push_back(0); }
    }
    // シャッフルする
    std::random_device seed_gen;
    std::mt19937 engine(seed_gen());
    std::shuffle(vec.begin(),vec.end(),engine);
    // 配列にコピー
    int map[w][h];
    for(int y=0; y<h; ++y) {
        for(int x=0; x<w; ++x) {
            map[x][y] = vec[y*w+x];
            cout << map[x][y] << ' ';
        }
        cout << '\n';
    }
    cout << '\n';
}

出力例:
0 0 0 1 
1 0 1 1 
1 1 0 1 
0 0 1 0