Mesoscopic Programming

タコさんプログラミング専門

ヌメロン製作講座第7回:ヌメロンクラスの作成

今回はヌメロンクラスのデータ部分を実装します。前回仮表示だった表示内容が以下のように正式なものになります。

f:id:hidakas1961:20120919024548j:plain:w200

修正ソースファイル
  1. Numer0n.h *1
  2. Numer0n.cpp
  3. main.h
  4. main.cpp

class Numer0n

今回の実装は表示に必要なデータと初期化のみです。

class Numer0n
{
public :

    TCHAR       title[ MAX_STRING ];
    Column      maxColumn;
    RuleID      rule;
    Player      players[ MAX_MOVE ];

    Numer0n();

    VOID        Init();
};

メンバ変数の内容は以下の通りです。

  1. title
    • 棋譜データのタイトル
  2. maxColumn
    • 設定桁数
  3. rule
    • ハイ&ローとチェンジのルール
  4. players
    • 先攻後攻のプレイヤーデータ
Numer0n :: Numer0n()
Numer0n :: Numer0n()
{
    ZeroMemory( this, sizeof * this );
}

コンストラクタです。
仮想関数を使用していないので自分自身をゼロクリアしています。

VOID Numer0n :: Init()
VOID Numer0n :: Init()
{
    time_t      timer;
    struct tm   * tm;

    time( & timer );

    tm = localtime( & timer );

    sprintf( title, "%s %d/%d/%d %d:%02d", appName, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min );

    maxColumn   = 3;
    rule        = RULE_NUMER0N6;

    for ( int move = 0; move < MAX_MOVE; move++ )
    {
        players[ move ].Init( ( MoveID ) move );
    }
}

ヌメロンデータの初期化を行います。
タイトルは初期化時の日付と時刻です。
設定桁数はヌメロン予選試合と同じ3桁とします。
ルールは現時点で最新版のヌメロン第6回大会ルールとします。
プレイヤーデータの初期化はプレイヤー構造体側で行います。

struct Player

プレイヤーデータ構造体です。
なぜクラスでなく構造体なのかというとそれは曖昧です。プレイヤーデータと言うくらいなので、データなら構造体で良いんじゃね?

struct Player
{
    MoveID      move;
    TCHAR       name[ MAX_STRING ];
    TypeID      type;
    SHORT       cards[ MAX_DIGIT ];
    SHORT       items[ MAX_ITEM ];
    Number      number;
    Number      open;
    TCHAR       text[ MAX_STRING ];

    VOID        Init( MoveID move );
    LPCTSTR     DispName();
};

メンバ変数の内容は以下の通り。

  1. move
    • 手番タイプ(先攻、後攻)
  2. name
    • プレイヤー名文字列
  3. type
    • プレイヤータイプ(人間、コンピュータ)
  4. cards
    • 0~9の各所持カード枚数
  5. items
    • 6種類の各アイテム所持数
  6. number
    • 設定ナンバー
  7. open
    • 公開設定ナンバー
  8. text
    • プレイヤー名表示文字列作成用バッファ

変数の意味については特に説明するまでも無いと思いますが、設定ナンバーと別に公開設定ナンバーを用意したのはコンピュータ対戦や番組の非公開プレイヤーの再現を目論んでのことです。

VOID Player :: Init()
VOID Player :: Init( MoveID move )
{
    ZeroMemory( this, sizeof * this );

    this->move  = move;
    type        = TYPE_MAN;

    for ( int digit = 0; digit < MAX_DIGIT; digit++ )
    {
        if ( digit < DIGIT_5 )
        {
            cards[ digit ]  = 1;
        }
        else
        {
            cards[ digit ]  = 2;
        }
    }

    items[ ITEM_HIGHLOW ]   = 1;
    items[ ITEM_DOUBLE ]    = 1;
    items[ ITEM_SHUFFLE ]   = 1;
}

プレイヤーデータを初期化します。
これも仮想関数を持たないので自分自身をゼロクリアしてます。
あとは番組内容に照らし合わせて各変数の初期値を設定しています。

LPCTSTR Player :: DispName()
LPCTSTR Player :: DispName()
{
    size_t len = strlen( name );

    if ( len == 0 )
    {
        sprintf( text, "%s(%s)", moveNames[ move ], typeNames[ type ] );
    }
    else
    {
        strcpy( text, name );
    }

    return text;
}

画面に表示するプレイヤー名を作成します。
初期状態ではプレイヤー名が設定されていないので、その場合は手番とプレイヤータイプを代わりに表示します。

以上です。
次回は設定画面の入力機能を実装します。

*1: Numer0n.h と Numer0n.cpp は新規なのでビルドの際はプロジェクトに追加してください