2006 年 6 月 8 日 19 時 12 分

PuzzleSolver #6: 飾り付け


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


[写真] [写真]


だいぶ満足できるところまできたが、
もう少し飾り付けをしよう。解答中の行を可視化したい。

現在は、縦横のヒントを順に検索するだけだが、
行や列の解答を求めようとしても答えが出ない場合、
その行について調べてあきらめたのか、
まったく調べていないかがわかりにくいからだ。

解答中の行が見えるようにしておけば、
明らかに現状では解けない行に対する処理などの
無駄な処理を見つけやすくなる。

それによって、将来的に、行や列の難易度を考慮して、
効率的に行を選択する処理などを追加できるかもしれない。

通知には、PuzzleAnswer と同じようにイベントを使う。

では、行列の着目に関するイベントを定義しよう。

    Public Event ColumnSelected(ByVal Index As Long)
    Public Event RowSelected(ByVal Index As Long)

そして、Solve メソッド内にある、
PuzzleLine の Solve を呼ぶ直前に、
イベントを発生させるコードを追加する。

    ' イベント追加
    RaiseEvent ColumnSelected(c)
    lResult = m_oColumns(c).Solve()

行についても同じ。

    RaiseEvent RowSelected(r)
    lResult = m_oRows(r).Solve()

これによって、行の解答をはじめる直前にイベントが起きる。

さて、SolveAction でこれを受け取ってみよう。
SolveAction のフィールド変数として、
WithEvents つきで宣言する。

    ' ソルバクラスのイベントを受け取る
    Private WithEvents m_oSolver As PuzzleSolver

そして、SolveAction の Execute メソッドに、
PuzzleSolver のイベントに接続するコードを追加する。
m_oAnswer に代入していた直前でかまわない。

    ' イベントに接続する
    Set m_oSolver = oSolver
    Set m_oAnswer = oSolver.Answer

オブジェクトボックスを使って、
イベントハンドラのスケルトンを入力し、中身を埋める。

    Private Sub m_oSolver_ColumnSelected(ByVal Index As Long)
        ' Call m_oAnswerRange(0, Index + 1).Select
        Call m_oAnswerRange.Columns(Index + 1).Select
        Call Wait(0.1)
    End Sub

着目列選択のイベントがきたら、
解答欄の列に該当する範囲を選択される。
Range の Columns プロパティを参照すれば楽に書ける。

個人的には、列全体を選択するのは好きではないので、
列のひとつ上のセルを選択するようなコードも書いた。
コメントアウトしているのがそれである。好みの問題かな。

    Private Sub m_oSolver_RowSelected(ByVal Index As Long)
        ' Call m_oAnswerRange(Index + 1, 0).Select
        Call m_oAnswerRange.Rows(Index + 1).Select
        Call Wait(0.1)
    End Sub

行についてもまったく同じだ。
Columns と同様、Rows プロパティがある。

では、実行してみよう。
日記には画像しか載せられないので、
イメージが伝わりにくいと思うが、なかなか面白い。



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