2006 年 5 月 25 日 23 時 0 分

PuzzleSolver #4: いよいよテスト


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真]


さて、PuzzleSolver を仕上げてテストをやろう。

PuzzleSolver は、PuzzleLine を呼ぶだけで OK だ。
取りあえず、縦横全ての行に対して、
1 度ずつ Solve を呼び出すことにしよう。

Public Sub Solve()

    Dim c As Long
    Dim r As Long
   
    For c = 0 To m_oAnswer.Width - 1
        Call m_oColumns(c).Solve
    Next
   
    For r = 0 To m_oAnswer.Height - 1
        Call m_oRows(r).Solve
    Next

End Sub

Answer プロパティプロシージャを仕上げていなかった。
フィールド m_oAnswer を返却し、
PuzzleSolver の利用者が解答を取得できるようにする。

Public Property Get Answer() As PuzzleAnswer
    Set Answer = m_oAnswer
End Property

よし、これで PuzzleSolver の準備はできた。
では、いよいよ PuzzleSolver の利用元である、
Solve マクロ(Macros モジュール)を作ろう。

Public Sub Solve()

    Dim oLoader As PuzzleSheetLoader
    Dim oSolver As PuzzleSolver
    Dim oAnswer As PuzzleAnswer
   
    Dim x As Long
    Dim y As Long

    ' 問題を読み込み
    Set oLoader = New PuzzleSheetLoader
    Call oLoader.Construct(Selection)
   
    ' ソルバに渡す
    Set oSolver = New PuzzleSolver
    Call oSolver.Construct(oLoader)
   
    ' 解く
    Call oSolver.Solve
   
    Set oAnswer = oSolver.Answer

    For x = 0 To oAnswer.Width - 1
        For y = 0 To oAnswer.Height - 1
       
            Select Case oAnswer(x, y)
            Case CELL_CHECKED:
                Selection(y + 1, x + 1).Value = "×"
           
            Case CELL_FILLED:
                Selection(y + 1, x + 1).Value = "■"
           
            End Select
        Next
    Next
End Sub

まずローダを作成して問題を内部形式に変換させ、
ソルバを作成して問題を読み込ませる。
そして、Solve メソッドを呼び出し、
縦横について 1 度ずつ解析させ、
その結果を取得して画面に表示する。

よし、ではいよいよ試してみよう。
テストに使う問題は、5/5 の日記の問題だ。

http://mixi.jp/view_diary.pl?id=129399396&owner_id=2300658

解答セル範囲を選択し、
ツール→マクロ→マクロ(もしくは、Alt+F8)で呼び出し、
Solve マクロを実行する。

どうだ?

……結果は、画像のようになった。
明らかに、忘れていることがあるようだ。



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