残りは
・カードを配る(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();
}
}
|
デッキの中身を表示するデバッグ用関数もありますので、テストは皆さんでやってみてください。
これでベースとなる「トランプのデッキ」クラスが出来上がりました。
これを使って、色々なトランプゲームが作れそうです。
イメージが出来た方は、色々とチャレンジしてみてください。