それでは、これまでやってきた事を元にトランプのクラスを作ってみたいと思います。
C言語編でポーカーを作りましたが、クラスにする事で色々と違いが出てきます。
C言語編では、カードの構造体を作り、カード構造体の配列をデッキとしました。
C++では、カードもデッキもクラスとして用意します。
まずは、カードクラスについて考えましょう。
必要なデータは、
・スート(絵柄) ・番号 ・選択フラグ |
です。
定数として、
・スートの数 ・番号の数 |
も必要でしょう。
あくまでもカード1枚に必要なデータですから、
・デッキに用意するカードの総数 |
はカードクラスには必要ありません。
おそらく長くなりますので、ファイル分割します。
新しいプロジェクトを作ってください。
用意するファイルは、↓の6つです。
Main.h Main.cpp Card.h Card.cpp Deck.h Deck.cpp
とりあえずmain関数が無いとエラーになりますので、main関数だけ作ります。
<sample program cpp058-01>
/* Main.cpp */
#include "Main.h" int main() { return 0; } |
次にCard.hを開き、カードクラスの宣言を書きましょう。
上で書いたメンバ変数やメンバ定数も加えます。
<sample program cpp058-02>
/* Card.h */
#pragma once class Card { public: static const int SUIT; static const int NUMBER; private: int m_suit; int m_number; bool m_bSelect; }; |
定数は他のクラスでも使う可能性があるので、「static定数」で宣言しました。
static定数はcppファイルで初期値を代入します。
メンバ変数の初期値はここでは入れませんので、コンストラクタ関数は宣言していません。
<sample program cpp058-03>
/* Card.cpp */
#include "Card.h" const int Card::SUIT = 4; const int Card::NUMBER = 13; |
static定数の初期値を設定しました。
次は、カードクラスのメンバ関数を考えます。
とりあえず必要なのは、
・スートと番号、選択フラグを設定する関数 ・カードを表示する関数 |
この2つになります。
Card.hを開き、publicにメンバ関数のプロトタイプ宣言を書きます。
<sample program cpp058-04>
/* Card.h */
#pragma once
class Card {
public:
static const int SUIT;
static const int NUMBER;
void SetData(const int suit, const int number, const bool bSelect = false);
void Show() const;
private:
int m_suit;
int m_number;
bool m_bSelect;
};
|
データをセットするSetData関数には3つの引数を渡します。
3つ目の選択フラグにはデフォルト引数を付けました。
最初は選択していない事の方が圧倒的に多いと考えたからです。
Show関数はメンバ変数を書き換えない(予定の)ため、constが付いています。
Card.cppに関数の本体を追加しましょう。
SetData関数は引数をメンバ変数に代入するだけです。
Show関数は見た目を考えて色々工夫してみます。
<sample program cpp058-05>
/* Card.cpp */
#include "Card.h" #include <iostream> #include <string> const int Card::SUIT = 4; const int Card::NUMBER = 13; void Card::SetData(const int suit, const int number, const bool bSelect) { m_suit = suit; m_number = number; m_bSelect = bSelect; } void Card::Show() const { std::string SUIT_STRING[SUIT] = { "スペード", "ハ ー ト", "ダ イ ヤ", "ク ラ ブ", }; std::string NUMBER_STRING[NUMBER] = { "A","2","3","4","5","6","7","8","9","10","J","Q","K", }; std::cout << SUIT_STRING[m_suit] << ":" << NUMBER_STRING[m_number - 1] << std::endl; } |
SetData関数の本体にはデフォルトは書きません。
Show関数で使用するため、「iostream」「string」をインクルードしました。
stringの配列を作って、見た目を考えた表示にしました。
では、1度この状態でテストしてみましょう。
Main.hを開いてCard.hをインクルードしてください。
<sample program cpp058-06>
/* Main.h */
#pragma once #include "Card.h" |
次に、main関数を開きカードクラスの実体を作って動かしてみましょう。
<sample program cpp058-07>
/* Main.cpp */
#include "Main.h"
int main()
{
Card card;
card.SetData(0, 1);
card.Show();
return 0;
}
|
<実行結果>
スペード:A 続行するには何かキーを押してください・・・
これでひとまずカードクラスは完成です。
次回はデッキクラスを作ってみましょう。