★トランプクラス3★


残りは

・カードを配る(1枚)

・カードを戻す(1枚)

の2つの関数です。


カードを配る


デッキからカードを1枚配る関数を考えます。

「デック」を使っていますので、「デック」の先頭から1枚カードを取り出し、戻り値で返すように作ります。

<sample program cpp060-01>

/* Deck.h */

#pragma once

#include "Card.h"

#include <deque>

#include <cstdlib>
#include <ctime>

class Deck {
public:

    static const int CARD_MAX;

    Deck();

    void Initialize();

    void Shuffle();

    Card Deal();

    void Show() const;

private:

    std::deque<Card> m_deqCard;
};

本体の方は「デック」先頭のデータを取り出す、先頭のデータを消す、取り出しておいたデータを戻す、とう流れで作ります。

<sample program cpp060-02>

/* Deck.cpp */

#include "Deck.h"

#include <algorithm>

const int Deck::CARD_MAX = Card::SUIT * Card::NUMBER;

Deck::Deck()
{
    srand((unsigned int)time(NULL));
}

void Deck::Initialize()
{
    Card work;

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

            work.SetData(i, j + 1);

            m_deqCard.push_back(work);
        }
    }
}

void Deck::Shuffle()
{
    std::random_shuffle(m_deqCard.begin(), m_deqCard.end());
}

Card Deck::Deal()
{
    Card work = m_deqCard.front();

    m_deqCard.pop_front();

    return work;
}

void Deck::Show() const
{
    for (int i = 0; i < CARD_MAX; i++) {
        m_deqCard[i].Show();
    }
}

テスト


新しい関数を追加しましたので、テストします。

main関数を開いて次のように変更してください。

<sample program cpp060-03>

/* Main.cpp */

#include "Main.h"

int main()
{
    Deck deck;

    deck.Initialize();

    deck.Shuffle();

    Card card = deck.Deal();

    card.Show();

    return 0;
}

<実行結果>

ク ラ ブ:J
続行するには何かキーを押してください・・・

※何度か実行してみてください。


カードを戻す


デッキの最後尾にカードを戻す関数を作りましょう。

<sample program cpp060-04>

/* Deck.h */

#pragma once

#include "Card.h"

#include <deque>

#include <cstdlib>
#include <ctime>

class Deck {
public:

    static const int CARD_MAX;

    Deck();

    void Initialize();

    void Shuffle();

    Card Deal();

    void Back(const Card &card);

    void Show() const;

private:

    std::deque<Card> m_deqCard;
};

引数としてデッキに戻すカードを「const参照」で渡しています。

本体も作ります。

<sample program cpp060-05>

/* Deck.cpp */

#include "Deck.h"

#include <algorithm>

const int Deck::CARD_MAX = Card::SUIT * Card::NUMBER;

Deck::Deck()
{
    srand((unsigned int)time(NULL));
}

void Deck::Initialize()
{
    Card work;

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

            work.SetData(i, j + 1);

            m_deqCard.push_back(work);
        }
    }
}

void Deck::Shuffle()
{
    std::random_shuffle(m_deqCard.begin(), m_deqCard.end());
}

Card Deck::Deal()
{
    Card work = m_deqCard.front();

    m_deqCard.pop_front();

    return work;
}

void Deck::Back(const Card &card)
{
    m_deqCard.push_back(card);
}

void Deck::Show() const
{
    for (int i = 0; i < CARD_MAX; i++) {
        m_deqCard[i].Show();
    }
}

デッキの中身を表示するデバッグ用関数もありますので、テストは皆さんでやってみてください。


これでベースとなる「トランプのデッキ」クラスが出来上がりました。

これを使って、色々なトランプゲームが作れそうです。

イメージが出来た方は、色々とチャレンジしてみてください。


次へ

戻る

目次へ