★シャッフル★


アルゴリズムは膨大にあると書きましたが、中にはゲームに使えそうなものもあります。

random_shuffle関数はコンテナの要素の中をシャッフルする関数です。

C言語編でポーカーを作った時を思い出して、サンプルを作ってみましょう。


まずは、定数と構造体、main関数を作ります。

デッキはベクタで作ります。

<sample program cpp025-01>

#include <iostream>
#include <algorithm>
#include <vector>

static const int SUIT = 4;
static const int NUMBER = 13;
static const int CARD = SUIT * NUMBER;

struct Card {
    int number;
    int suit;
};

int main()
{
    std::vector<Card> vecDeck;

    return 0;
}

構造体の作業領域を用意し、52枚分のデータをpush_backします。

とりあえず、デッキがきちんと出来ているか確かめるコードも入れましょう。

<sample program cpp025-02>

#include <iostream>
#include <algorithm>
#include <vector>

static const int SUIT = 4;
static const int NUMBER = 13;
static const int CARD = SUIT * NUMBER;

struct Card {
    int number;
    int suit;
};

int main()
{
    std::vector<Card> vecDeck;

    Card work;

    for (int i = 0; i < SUIT; i++) {
        for (int j = 0; j < NUMBER; j++) {

            work.suit = i;
            work.number = j + 1;

            vecDeck.push_back(work);
        }
    }

    for (int i = 0; i < CARD; i++) {
        std::cout << "Number = " << vecDeck[i].number << " : "
            << "Suit = " << vecDeck[i].suit << std::endl;
    }

    return 0;
}

<実行結果>

Number = 1 : Suit = 0
Number = 2 : Suit = 0
Number = 3 : Suit = 0
Number = 4 : Suit = 0
Number = 5 : Suit = 0
Number = 6 : Suit = 0
Number = 7 : Suit = 0
Number = 8 : Suit = 0
Number = 9 : Suit = 0
Number = 10 : Suit = 0
Number = 11 : Suit = 0
Number = 12 : Suit = 0
Number = 13 : Suit = 0
Number = 1 : Suit = 1
Number = 2 : Suit = 1
Number = 3 : Suit = 1
Number = 4 : Suit = 1
Number = 5 : Suit = 1
Number = 6 : Suit = 1
Number = 7 : Suit = 1
Number = 8 : Suit = 1
Number = 9 : Suit = 1
Number = 10 : Suit = 1
Number = 11 : Suit = 1
Number = 12 : Suit = 1
Number = 13 : Suit = 1
Number = 1 : Suit = 2
Number = 2 : Suit = 2
Number = 3 : Suit = 2
Number = 4 : Suit = 2
Number = 5 : Suit = 2
Number = 6 : Suit = 2
Number = 7 : Suit = 2
Number = 8 : Suit = 2
Number = 9 : Suit = 2
Number = 10 : Suit = 2
Number = 11 : Suit = 2
Number = 12 : Suit = 2
Number = 13 : Suit = 2
Number = 1 : Suit = 3
Number = 2 : Suit = 3
Number = 3 : Suit = 3
Number = 4 : Suit = 3
Number = 5 : Suit = 3
Number = 6 : Suit = 3
Number = 7 : Suit = 3
Number = 8 : Suit = 3
Number = 9 : Suit = 3
Number = 10 : Suit = 3
Number = 11 : Suit = 3
Number = 12 : Suit = 3
Number = 13 : Suit = 3
続行するには何かキーを押してください・・・

上手くいっているようです。

では、random_shuffle関数を使ってみましょう。

引数も見たら分かるようになってきていると思います。

<sample program cpp025-02>

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <ctime>

static const int SUIT = 4;
static const int NUMBER = 13;
static const int CARD = SUIT * NUMBER;

struct Card {
    int number;
    int suit;
};

int main()
{
    std::vector<Card> vecDeck;

    srand((unsigned int)time(NULL));

    Card work;

    for (int i = 0; i < SUIT; i++) {
        for (int j = 0; j < NUMBER; j++) {

            work.suit = i;
            work.number = j + 1;

            vecDeck.push_back(work);
        }
    }

    std::random_shuffle(vecDeck.begin(), vecDeck.end());

    for (int i = 0; i < CARD; i++) {
        std::cout << "Number = " << vecDeck[i].number << " : "
            << "Suit = " << vecDeck[i].suit << std::endl;
    }

    return 0;
}

<実行結果>

Number = 12 : Suit = 1
Number = 8 : Suit = 2
Number = 1 : Suit = 2
Number = 9 : Suit = 0
Number = 11 : Suit = 3
Number = 3 : Suit = 2
Number = 2 : Suit = 1
Number = 2 : Suit = 2
Number = 5 : Suit = 3
Number = 7 : Suit = 0
Number = 5 : Suit = 2
Number = 4 : Suit = 2
Number = 11 : Suit = 1
Number = 2 : Suit = 0
Number = 12 : Suit = 2
Number = 9 : Suit = 1
Number = 6 : Suit = 0
Number = 8 : Suit = 1
Number = 2 : Suit = 3
Number = 6 : Suit = 3
Number = 10 : Suit = 2
Number = 8 : Suit = 0
Number = 1 : Suit = 3
Number = 6 : Suit = 1
Number = 4 : Suit = 0
Number = 10 : Suit = 3
Number = 13 : Suit = 2
Number = 3 : Suit = 3
Number = 8 : Suit = 3
Number = 4 : Suit = 1
Number = 11 : Suit = 0
Number = 13 : Suit = 3
Number = 10 : Suit = 1
Number = 7 : Suit = 2
Number = 7 : Suit = 3
Number = 6 : Suit = 2
Number = 9 : Suit = 3
Number = 4 : Suit = 3
Number = 10 : Suit = 0
Number = 12 : Suit = 3
Number = 5 : Suit = 0
Number = 5 : Suit = 1
Number = 13 : Suit = 1
Number = 13 : Suit = 0
Number = 1 : Suit = 0
Number = 3 : Suit = 1
Number = 7 : Suit = 1
Number = 9 : Suit = 2
Number = 3 : Suit = 0
Number = 1 : Suit = 1
Number = 11 : Suit = 2
Number = 12 : Suit = 0
続行するには何かキーを押してください・・・

random_shuffle関数も内部で乱数を使っているようなので、乱数の種をセットする必要があります。

何かゲームを作る時に、思い出して使ってみてください。


次へ

戻る

目次へ