このアーカイブは同期化されません。 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 マクロを実行する。
どうだ?
……結果は、画像のようになった。
明らかに、忘れていることがあるようだ。