2006 年 5 月 24 日 19 時 18 分

PuzzleLine #2: テスト用の仮実装


このアーカイブは同期化されません。 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 の準備は整った。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.