Mesoscopic Programming

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

ヌメロン製作講座第13回:棋譜データ構造の設計

前回までで設定データの基本的な処理ができたので、今回からは棋譜データの処理に入ります。
今回は棋譜データ構造の設計です。

修正ソースファイル
  1. Numer0n.h


棋譜データ構造体

ヌメロンの棋譜の種類は、コール&ジャッジまたはアイテム使用です。1つのデータには手番とデータ種別、そしてデータ種別毎のパラメータを格納します。

struct Record

1つの棋譜データを格納する構造体です。

struct Record
{
    MoveID      move;
    DataID      did;

    union
    {
        Call        call;
        ItemHighLow itemHighLow;
        ItemDouble  itemDouble;
        ItemTarget  itemTarget;
        ItemSlash   itemSlash;
        ItemShuffle itemShuffle;
        ItemChange  itemChange;
    };
};

move は手番の種類(先攻、後攻)です。
did はデータ種別です。
そして union は各データ種別に対応するパラメータ構造体を格納するための共用体です。

enum DataID

データの種別を表す識別子です。

enum DataID
{
    DATA_NULL = 0,
    DATA_CALL,
    DATA_ITEM_HIGHLOW,
    DATA_ITEM_DOUBLE,
    DATA_ITEM_TARGET,
    DATA_ITEM_SLASH,
    DATA_ITEM_SHUFFLE,
    DATA_ITEM_CHANGE,
    MAX_DATA
};

それぞれ以下に示す内容を表します。

  1. DATA_CALL
    • コール&ジャッジデータ
  2. DATA_ITEM_HIGHLOW
    • ハイ&ローアイテム使用データ
  3. DATA_ITEM_DOUBLE
    • ダブルアイテム使用データ
  4. DATA_ITEM_TARGET
    • ターゲットアイテム使用データ
  5. DATA_ITEM_SLASH
    • スラッシュアイテム使用データ
  6. DATA_ITEM_SHUFFLE
    • シャッフルアイテム使用データ
  7. DATA_ITEM_CHANGE
    • チェンジアイテム使用データ

struct Call

コールデータ構造体です。

struct Call
{
    Number      number;
    Column      eat;
    Column      byte;
};

number は設定ナンバー、eat はイート数、byte はバイト数です。

struct ItemHighLow

ハイ&ローアイテム使用データ構造体です。

struct ItemHighLow
{
    Rank        rank;
    HighLowID   highlows[ MAX_COLUMN ];
    Column      high;
    Column      low;
};

ハイ&ローアイテムデータのパラメータは、ルール設定によって以下の3種類のパタンに分けられます。

  1. ヌメロン第1~2回大会
    • rank は攻撃側が指定した相手の設定ナンバーの位です。highlow[ 0 ] はその位のハイまたはローの種別です。
  2. ヌメロン第3回大会
    • high は相手の設定ナンバーのハイの数です。low はローの数です。
  3. ヌメロン第4~6回大会
    • highlows 配列は相手の設定ナンバーのすべての位のハイまたはローの種別です。

struct ItemDouble

ダブルアイテム使用データ構造体です。

struct ItemDouble
{
    Rank        rank;
    DigitID     digit;
};

rank は相手が指定した攻撃側の設定ナンバーのオープンしたい位です。digit はその番号です。

struct ItemTarget

ターゲットアイテム使用データ構造体です。

struct ItemTarget
{
    DigitID     digit;
    Rank        rank;
};

digit は攻撃側が指定したターゲット番号です。rank は使用している位です。ただし未使用の場合は 0 です。

struct ItemSlash

スラッシュアイテム使用データ構造体です。

struct ItemSlash
{
    DigitID     slash;
};

slash は相手が設定ナンバーとして使用している番号のうち、最大値から最小値を引いたスラッシュナンバーです。

struct ItemShuffle

シャッフルアイテム使用データ構造体です。

struct ItemShuffle
{
    Number      number0;
    Number      number;
};

アイテムを使用した手番の設定ナンバーが未設定ならばパラメータはありません。もし設定ナンバーが既知ならば number0 はシャッフル前の設定ナンバー、そして number はシャッフル後の設定ナンバーです。

struct ItemChange

チェンジアイテム使用データ構造体です。

struct ItemChange
{
    Rank        rank;
    DigitID     digit;
    HighLowID   highlow;
    DigitID     digit2;
};

ルールの種別によって以下の2種類に分かれます。

  1. ヌメロン第1~5回大会
    • rank はチェンジする位です。digit はチェンジ前の番号です。設定ナンバーが既知の場合は digit2 はチェンジ後の番号です。
  2. ヌメロン第6回大会
    • rank はチェンジする位です。digit はチェンジ前のハイまたはローの種別です。設定ナンバーが既知の場合は digit2 はチェンジ後の番号です。

以上です。
次回は棋譜データグリッドの作成です。