ヌメロン製作講座第7回:ヌメロンクラスの作成
今回はヌメロンクラスのデータ部分を実装します。前回仮表示だった表示内容が以下のように正式なものになります。
修正ソースファイル
class Numer0n
今回の実装は表示に必要なデータと初期化のみです。
class Numer0n { public : TCHAR title[ MAX_STRING ]; Column maxColumn; RuleID rule; Player players[ MAX_MOVE ]; Numer0n(); VOID Init(); };
メンバ変数の内容は以下の通りです。
- title
- 棋譜データのタイトル
- maxColumn
- 設定桁数
- rule
- ハイ&ローとチェンジのルール
- 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(); };
メンバ変数の内容は以下の通り。
- move
- 手番タイプ(先攻、後攻)
- name
- プレイヤー名文字列
- type
- プレイヤータイプ(人間、コンピュータ)
- cards
- 0~9の各所持カード枚数
- items
- 6種類の各アイテム所持数
- number
- 設定ナンバー
- open
- 公開設定ナンバー
- 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; }
画面に表示するプレイヤー名を作成します。
初期状態ではプレイヤー名が設定されていないので、その場合は手番とプレイヤータイプを代わりに表示します。
以上です。
次回は設定画面の入力機能を実装します。