このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
今日は PuzzleSolver のコンストラクタを作る。
行や列、解答を独立したオブジェクトとして管理するので、
PuzzleSolver はそれらを構築するだけだ。
コンストラクタを作る。今回も一般的なエラー処理は省く。
Public Sub Construct(ByVal Loader As IPuzzleLoader)
Dim x As Long
Dim y As Long
' 解答状況クラスを構築
Set m_oAnswer = New PuzzleAnswer
Call m_oAnswer.Construct(Loader)
' 行オブジェクトを構築する
ReDim m_oRows(0 To Loader.Height - 1)
For y = 0 To Loader.Height - 1
Set m_oRows(y) = New PuzzleLine
Call m_oRows(y).Construct(m_oAnswer, Loader.RowHints(y), False, y)
Next
' 列オブジェクトを構築する
ReDim m_oColumns(0 To Loader.Width - 1)
For x = 0 To Loader.Width - 1
Set m_oColumns(x) = New PuzzleLine
Call m_oColumns(x).Construct(m_oAnswer, Loader.ColumnHints(x), True, x)
Next
End Sub
オブジェクトの階層構造はここで構築される。
PuzzleSolver は最上位で、
PuzzleAnswer や PuzzleLine が、その下につく形となる。
PuzzleLine はそれぞれ PuzzleHintCollection を持つ。
役割分担によって階層化されているのだ。
呼び出し側が利用するのは、PuzzleSolver と PuzzleAnswer。
PuzzleAnswer は解答状態なので、
ユーザが解答に変更を加えても対応できるように、
呼び出し元に Answer プロパティとして公開している。
それ以外にユーザが操作するのは、
PuzzleSolver の Solve メソッドだけだ。
PuzzleSolver の起動窓口である、Solve メソッドでは、
このオブジェクト階層をたどりながら、
問題を解いていくことになるのだが、
実装のためには、アルゴリズムについて考える必要がある。