ヌメロン製作講座第27回:Change アイテム処理
今回は Change アイテム処理を実装します。
enum ErrorID(ファイル読込みエラーコード)
棋譜データファイル読込み時の以下のエラーコードを追加しました。
- ERR_CHANGE_RANK
- Change アイテムデータの位数読込みエラー
- ERR_CHANGE_DIGIT
- Change アイテムデータのチェンジ前番号読込みエラー
- ERR_CHANGE_HIGHLOW
- Change アイテムデータの High or Low 読込みエラー
- ERR_CHANGE_DIGIT2
- Change アイテムデータのチェンジ後番号読込みエラー
ヌメロングローバル関数として以下の関数を追加しました。
- Number ChangeRankDigit( Number number, Rank rank, DigitID digit )
- ナンバーの指定した位の番号をチェンジしたナンバーを取得
- Rank ThinkChangeRank( MoveID move )
- Change アイテムのチェンジする位思考ルーチン
- DigitID ThinkChangeDigit( MoveID move, Rank rank )
- Change アイテムのチェンジする番号思考ルーチン
- Rank GetCanChangeRank( MoveID move )
- チェンジ可能な位を取得
- BOOL CanChangeRank( MoveID move, Rank rank )
- 指定された位がチェンジ可能なら真
- BOOL CanChangeColumn( MoveID move, Column column )
- 指定された桁がチェンジ可能なら真
- BOOL CanChangeDigit( MoveID move, DigitID digit )
- 指定された番号がチェンジ可能なら真
- 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 アイテム対応処理を追加しました。
- 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 ); } ~中略~ }
処理内容
- まず正解候補ナンバー群を初期化
- チェンジ前の番号が High ならチェンジする位の Low 番号をすべて無効化
- 同様にチェンジ前が Low ならすべての High を無効化
- もしヌメロン第1~5回大会ルールならチェンジ前番号が開示されているので、その番号を無効化
class Numer0n(ヌメロンクラス)
Save() 関数と Load() 関数に Change アイテム対応処理を追加しました。
- BOOL Save( LPCTSTR path )
- BOOL Load( LPCTSTR path )
- Change アイテム対応処理追加
struct Cell(セル構造体)
関連する既存関数に Change アイテム処理を追加しました。
- BOOL GetRecordText( PTCHAR text )
- セル表示文字列取得関数
- BOOL GetRecordEditParam( EditParam & edit )
- セル編集開始関数
- BOOL SetRecordEditData( EditParam & edit )
- セル編集終了関数
以上です。