ヌメロン製作講座第17回:分析データ構造体の作成
分析データ構造体を作成します。
- 分析データ表示画面
- 修正ソースファイル
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 ); };
- 内容
- valids
- 各桁ごとの有効番号配列
- decides
- 確定番号配列
- candids
- 正解候補ナンバー配列
- maxCandid
- 正解候補配列数
- prob
- 正解候補数(=正解確率の逆数)
- VOID Init()
- 分析データ初期化
- VOID InitCandidate()
- 正解候補初期化
- 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 ); }
- 処理内容
- 相手のロストカードを有効番号から除外します。
- 正解候補としてすべての番号の組み合わせを buffer に作成します。
- 正解候補数をカウントします。
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; } } }
- 処理内容
- すべての候補ナンバーについて各桁ごとの番号配列に変換します。
- 複数の桁で番号が重複するナンバーは正解候補から除外します。
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++; } } }
- 処理内容
- 正解候補ナンバー配列をカウントします。