Mesoscopic Programming

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

ヌメロン製作講座第17回:分析データ構造体の作成

分析データ構造体を作成します。

  • 分析データ表示画面

  • 修正ソースファイル

Numer0n.h
Numer0n.cpp
main.h
main.cpp


struct Analyze

分析データ構造体です。

struct Analyze
{
    BOOL        valids[ MAX_COLUMN ][ MAX_DIGIT ];
    BOOL        decides[ MAX_DIGIT ];
    Number      candids[ MAX_CANDID ];
    LONG        maxCandid;
    LONG        prob;

    VOID        Init( MoveID move );
    VOID        InitCandidate( BOOL * buffer, Number maxNumber );
    VOID        CollectCandidate( BOOL * buffer, Number maxNumber );
};
  • 内容
  1. valids
    • 各桁ごとの有効番号配列
  2. decides
    • 確定番号配列
  3. candids
    • 正解候補ナンバー配列
  4. maxCandid
    • 正解候補配列数
  5. prob
    • 正解候補数(=正解確率の逆数)
  6. VOID Init()
    • 分析データ初期化
  7. VOID InitCandidate()
    • 正解候補初期化
  8. VOID CollectCandidate()
    • 正解候補数カウント

VOID Analyze :: Init()

VOID Analyze :: Init( MoveID move )
{
    Number  maxNumber   = ( Number ) ColumnToRank( maxColumn );
    BOOL    * buffer    = ( BOOL * ) malloc( sizeof ( BOOL ) * maxNumber );

    ZeroMemory( this, sizeof * this );

    for ( int digit = 0; digit < MAX_DIGIT; digit++ )
    {
        for ( int column = 0; column < maxColumn; column++ )
        {
            valids[ column ][ digit ] = ( players[ Enemy( move ) ].cards[ digit ] > 0 );
        }
    }

    InitCandidate( buffer, maxNumber );
    CollectCandidate( buffer, maxNumber );
    free( buffer );
}
  • 処理内容
  1. 相手のロストカードを有効番号から除外します。
  2. 正解候補としてすべての番号の組み合わせを buffer に作成します。
  3. 正解候補数をカウントします。

VOID Analyze :: InitCandidate()

正解候補ナンバー配列を初期化します。

VOID Analyze :: InitCandidate( BOOL * buffer, Number maxNumber )
{
    Array   array;
    BOOL    result;

    ZeroMemory( buffer, sizeof ( BOOL ) * maxNumber );

    for ( int number = 0; number < maxNumber; number++ )
    {
        NumberToArray( number, array );

        result = TRUE;

        for ( int column = 0; result && column < maxColumn; column++ )
        {
            for ( int column2 = column + 1; result && column2 < maxColumn; column2++ )
            {
                if ( array[ column ] == array[ column2 ] )
                {
                    result = FALSE;
                }
            }
        }

        if ( result )
        {
            buffer[ number ] = TRUE;
        }
    }
}
  • 処理内容
  1. すべての候補ナンバーについて各桁ごとの番号配列に変換します。
  2. 複数の桁で番号が重複するナンバーは正解候補から除外します。

VOID Analyze :: CollectCandidate()

正解候補数をカウントします。

VOID Analyze :: CollectCandidate( BOOL * buffer, Number maxNumber )
{
    ZeroMemory( candids, sizeof candids );

    maxCandid   = 0;
    prob        = 0;

    for ( int number = 0; number < maxNumber; number++ )
    {
        if ( buffer[ number ] )
        {
            if ( maxCandid < MAX_CANDID )
            {
                candids[ maxCandid++ ] = number;
            }

            prob++;
        }
    }
}
  • 処理内容
  1. 正解候補ナンバー配列をカウントします。