このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
さて、実装ばかりだったんので、
ちょいとテストをしてみたい。
そのために、今までのコードを埋め込み、
テストできるような体制を作ろう。
って、やっぱり実装なんだが……
まず PuzzleLine だ。
PuzzleLine には、この何日かで作っていた実装を埋め込む。
SolveLine、PackFront、PackRear はここに入れる。
そして、保留にしていた Solve メソッドを作る。
Solve は PuzzleSolver から呼ばれるメソッドで、
基本的に引数は必要ない。
PuzzleLine 自体が行のことを知っているからだ。
Solve は SolveLine を呼んで問題を解かせる訳だが、
SolveLine のインタフェースにあわせて、
状態配列を用意してやらなければならない。
それを実装すると、以下のようになる。
SolveLine 用のバッファを割り当てて SolveLine を呼び、
SolveLine が解答できた場合はそれを反映させる。
Public Function Solve() As Long
Dim eState() As CellStateConstants
ReDim eState(0 To m_lCellCount - 1)
' まず、行の解答状況をバッファにコピーする
Call CopyStatesOfLine(eState)
Solve = SolveLine(m_oHints, eState)
If Solve > 0 Then
' 解答できたセルがあれば反映する
Call ApplyStatesOfLine(eState)
End If
End Function
PuzzleAnswer からの行のコピーは、
ヘルパーメソッドである CopyStatesOfLine に任せる。
同様、PuzzleAnswer へのフィードバックは、
ヘルパーメソッドである ApplyStatesOfLine に任せる。
これで、Solve 自体はシンプルになった。
次は CopyStatesOfLine だ。
行か列かによって方向が変わるだけで、
後は PuzzleAnswer からコピーするだけなので単純だ。
' 行や列の状態をコピーする
Private Function CopyStatesOfLine(ByRef State() As CellStateConstants) As Long
Dim x As Long
Dim y As Long
Dim x As Long
Dim y As Long
If m_fColumn Then
x = m_lLineIndex
For y = 0 To m_lCellCount - 1
State(y) = m_oAnswer(x, y)
Next
Else
y = m_lLineIndex
For x = 0 To m_lCellCount - 1
State(x) = m_oAnswer(x, y)
Next
End If
End Function
ApplyStatesOfLine は CopyStatesOfLine の逆で、
これまた非常に簡単だ。
' 行や列の状態を反映する
Private Function ApplyStatesOfLine(ByRef State() As CellStateConstants) As Long
Dim x As Long
Dim y As Long
If m_fColumn Then
x = m_lLineIndex
For y = 0 To m_lCellCount - 1
m_oAnswer(x, y) = State(y)
Next
Else
y = m_lLineIndex
For x = 0 To m_lCellCount - 1
m_oAnswer(x, y) = State(x)
Next
End If
End Function
これで、PuzzleLine の準備は整った。