Mesoscopic Programming

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

ヌメロン製作講座第27回:Change アイテム処理

今回は Change アイテム処理を実装します。

プレイ画面

Change アイテムを使用した例です。

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


enum ErrorID(ファイル読込みエラーコード)

棋譜データファイル読込み時の以下のエラーコードを追加しました。

  1. ERR_CHANGE_RANK
    • Change アイテムデータの位数読込みエラー
  2. ERR_CHANGE_DIGIT
    • Change アイテムデータのチェンジ前番号読込みエラー
  3. ERR_CHANGE_HIGHLOW
    • Change アイテムデータの High or Low 読込みエラー
  4. ERR_CHANGE_DIGIT2
    • Change アイテムデータのチェンジ後番号読込みエラー


ヌメロングローバル関数として以下の関数を追加しました。

  1. Number ChangeRankDigit( Number number, Rank rank, DigitID digit )
    • ナンバーの指定した位の番号をチェンジしたナンバーを取得
  2. Rank ThinkChangeRank( MoveID move )
    • Change アイテムのチェンジする位思考ルーチン
  3. DigitID ThinkChangeDigit( MoveID move, Rank rank )
    • Change アイテムのチェンジする番号思考ルーチン
  4. Rank GetCanChangeRank( MoveID move )
    • チェンジ可能な位を取得
  5. BOOL CanChangeRank( MoveID move, Rank rank )
    • 指定された位がチェンジ可能なら真
  6. BOOL CanChangeColumn( MoveID move, Column column )
    • 指定された桁がチェンジ可能なら真
  7. BOOL CanChangeDigit( MoveID move, DigitID digit )
    • 指定された番号がチェンジ可能なら真
  8. BOOL CanChangeHighLow( MoveID move, HighLowID highlow )
    • 指定された High or Low がチェンジ可能なら真

Rank ThinkChangeRank()

チェンジ位思考ルーチン

Rank ThinkChangeRank( MoveID move )
{
    Column  columns[ MAX_COLUMN ];
    int     count = 0;

    for ( int column = 0; column < maxColumn; column++ )
    {
        if ( CanChangeColumn( move, column ) )
        {
            columns[ count++ ] = column;
        }
    }

    if ( count == 0 )
    {
        return 0;
    }

    return ColumnToRank( columns[ rand() % count ] );
}
処理内容
  • チェンジ可能な位をリストアップしランダムで選択

DigitID ThinkChangeDigit()

チェンジ番号思考ルーチン

DigitID ThinkChangeDigit( MoveID move, Rank rank )
{
    DigitID digits[ MAX_DIGIT ];
    int     count = 0;
    Array   array;
    DigitID digit;
    BOOL    result;

    NumberToArray( players[ move ].number, array );

    digit = array[ RankToColumn( rank ) ];

    for ( int digit2 = 0; digit2 < MAX_DIGIT; digit2++ )
    {
        result = TRUE;

        if ( players[ move ].cards[ digit2 ] <= 0 )
        {
            result = FALSE;
        }
        else if ( IsHigh( digit ) && IsLow( digit2 ) )
        {
            result = FALSE;
        }
        else if ( IsLow( digit ) && IsHigh( digit2 ) )
        {
            result = FALSE;
        }
        else for ( int column2 = 0; column2 < maxColumn; column2++ )
        {
            if ( array[ column2 ] == digit2 )
            {
                result = FALSE;

                break;
            }
        }

        if ( result )
        {
            digits[ count++ ] = ( DigitID ) digit2;
        }
    }

    if ( count > 0 )
    {
        return digits[ rand() % count ];
    }

    return DIGIT_NULL;
}
処理内容
  • チェンジ可能な番号をリストアップしランダムで選択


struct Analyze(分析データ構造体)

Change アイテム対応処理を追加しました。

  1. VOID AddData( BOOL * buffer, Number maxNumber, MoveID move, const Record & record )
    • Change アイテム対応処理追加

VOID Analyze :: AddData()

棋譜データ追加による分析データ更新処理

VOID Analyze :: AddData( BOOL * buffer, Number maxNumber, MoveID move, const Record & record )
{
    ~中略~

    else if ( record.did == DATA_ITEM_CHANGE )
    {
        InitCandidate( buffer, maxNumber, move );

        column = RankToColumn( record.itemChange.rank );

        for ( int digit = 0; digit < MAX_DIGIT; digit++ )
        {
            if ( players[ enemy ].cards[ digit ] > 0 )
            {
                if ( record.itemChange.highlow == HIGH )
                {
                    valids[ column ][ digit ] = IsHigh( digit );
                }
                else
                {
                    valids[ column ][ digit ] = IsLow( digit );
                }
            }
        }

        if ( rule < RULE_NUMER0N6 )
        {
            for ( int column = 0; column < maxColumn; column++ )
            {
                valids[ column ][ record.itemChange.digit ] = FALSE;
            }
        }

        CandidateByValid( buffer, maxNumber );
        ValidateByCandidate( buffer, maxNumber );
    }

    ~中略~
}
処理内容
  1. まず正解候補ナンバー群を初期化
  2. チェンジ前の番号が High ならチェンジする位の Low 番号をすべて無効化
  3. 同様にチェンジ前が Low ならすべての High を無効化
  4. もしヌメロン第1~5回大会ルールならチェンジ前番号が開示されているので、その番号を無効化


class Numer0n(ヌメロンクラス)

Save() 関数と Load() 関数に Change アイテム対応処理を追加しました。

  1. BOOL Save( LPCTSTR path )
  2. BOOL Load( LPCTSTR path )
    • Change アイテム対応処理追加


enum EditModeID(編集モード識別子)

以下の入力モードを追加しました。

  1. EDIT_DIGIT2
    • チェンジ後の番号入力モード


struct Cell(セル構造体)

関連する既存関数に Change アイテム処理を追加しました。

  1. BOOL GetRecordText( PTCHAR text )
    • セル表示文字列取得関数
  2. BOOL GetRecordEditParam( EditParam & edit )
    • セル編集開始関数
  3. BOOL SetRecordEditData( EditParam & edit )
    • セル編集終了関数

以上です。