アルゴリズムは膨大にあると書きましたが、中にはゲームに使えそうなものもあります。
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関数も内部で乱数を使っているようなので、乱数の種をセットする必要があります。
何かゲームを作る時に、思い出して使ってみてください。