ヌメロン製作講座第24回:Target アイテム処理
今回は Target アイテム処理を実装します。
enum ErrorID(ファイル読込みエラーコード)
棋譜データファイル読込み時の以下のエラーコードを追加しました。
- ERR_TARGET_DIGIT
- Target アイテムの指定番号読込みエラー
- ERR_TARGET_RANK
- Target アイテムの位数読込みエラー
DigitID ThinkTargetDigit();
Target 番号を決めるためのコンピュータ思考ルーチンを追加しました。
DigitID ThinkTargetDigit( MoveID move ) { Analyze & anal = anals[ move ][ maxRecord ]; int max = 0; int count; int counts[ MAX_DIGIT ]; DigitID digits[ MAX_DIGIT ]; ZeroMemory( counts, sizeof counts ); for ( int digit = 0; digit < MAX_DIGIT; digit++ ) { count = 0; for ( int column = 0; column < maxColumn; column++ ) { if ( anal.valids[ column ][ digit ] ) { if ( ++count > counts[ digit ] ) { counts[ digit ] = count; } } } if ( counts[ digit ] > max ) { max = counts[ digit ]; } } count = 0; for ( int digit = 0; digit < MAX_DIGIT; digit++ ) { if ( counts[ digit ] == max ) { digits[ count++ ] = ( DigitID ) digit; } } if ( count > 0 ) { return digits[ rand() % count ]; } return ( DigitID ) ( rand() % MAX_DIGIT ); }
処理内容
- すべての番号の有効位数を調べ、もっとも数の多い番号をリストアップしてその中からランダムで選択して返す
struct Analyze(分析データ構造体)
Target アイテム対応処理を追加しました。
前回忘れていた Double アイテム対応処理も追加しました。
- VOID AddData( BOOL * buffer, Number maxNumber, MoveID move, const Record & record );
- Double アイテム対応処理追加
- Target アイテム対応処理追加
VOID Analyze :: AddData()
VOID Analyze :: AddData( BOOL * buffer, Number maxNumber, MoveID move, const Record & record ) { MoveID enemy = Enemy( move ); ~中略~ if ( record.move == move ) { ~中略~ // Target アイテムの処理 else if ( record.did == DATA_ITEM_TARGET ) { if ( record.itemTarget.rank == 0 ) { for ( int column = 0; column < maxColumn; column++ ) { valids[ column ][ record.itemTarget.digit ] = FALSE; } } else { column = RankToColumn( record.itemTarget.rank ); for ( int digit = 0; digit < MAX_DIGIT; digit++ ) { if ( digit != record.itemTarget.digit ) { valids[ column ][ digit ] = FALSE; } } for ( int column2 = 0; column2 < maxColumn; column2++ ) { if ( column2 != column ) { valids[ column2 ][ record.itemTarget.digit ] = FALSE; } } } CandidateByValid( buffer, maxNumber ); ValidateByCandidate( buffer, maxNumber ); } ~中略~ } else if ( record.move == enemy ) { // Double アイテムの処理 if ( record.did == DATA_ITEM_DOUBLE ) { column = RankToColumn( record.itemDouble.rank ); for ( int digit = 0; digit < MAX_DIGIT; digit++ ) { if ( digit != record.itemDouble.digit ) { valids[ column ][ digit ] = FALSE; } } CandidateByValid( buffer, maxNumber ); ValidateByCandidate( buffer, maxNumber ); } ~中略~ } }
処理内容
- Target アイテム処理
- 指定番号が未使用の場合
- その番号をすべての位の有効番号から除外する
- 指定番号が使用されている場合
- 使用されている位の有効番号から指定番号以外を除外する
- 使用されていない位の指定番号を有効番号から除外する
- Double アイテム処理
- まず Double アイテムは相手が有利になるアイテムなので相手の分析データを更新する
- オープンされた位の使用番号以外の有効番号を除外する
- それ以外の位は使用番号を有効番号から除外する
class Numer0n(ヌメロンクラス)
Save() 関数と Load() 関数に Target アイテム対応処理を追加しました。
- BOOL Save( LPCTSTR path )
- BOOL Load( LPCTSTR path )
- Target アイテム対応処理追加
struct Cell(セル構造体)
関連する既存関数に Target アイテム処理を追加しました。
- BOOL GetRecordText( PTCHAR text )
- セル表示文字列取得関数
- BOOL GetRecordEditParam( EditParam & edit )
- セル編集開始関数
- BOOL SetRecordEditData( EditParam & edit )
- セル編集終了関数
以上です。