VBAでライツアウトもどきを作ってみる

 仕事が一段落したので、気分転換にExcelでゲームを作ってみた。ゲームの作成って、コアのアルゴリズムよりも画面作成が結構めんどくさかったりする。でも、Excelなら、普段慣れたシートやセルを使えば、見栄え良くなくても取り合えず動くものは何とか作れる。ということで、ライツアウトもどきを、できる限り短いコードになるよう作ってみた。
f:id:Hanamaru:20140223174936j:plain

コードはこんだけ。我ながら短くまとめられた。

Private Sub Worksheet_BeforeDoubleClick _
    (ByVal Target As Range, Cancel As Boolean)

    Dim iRange As Range
    Dim myRange As Range

    With Target
        If .Value <> "●" And .Value <> "○" Then
            Exit Sub
        End If
        Set myRange = Union(Target, .Offset(0, -1), _
            .Offset(-1, 0), .Offset(0, 1), .Offset(1, 0))
    End With
        
    For Each iRange In myRange
        With iRange
            If .Value = "●" Then
                .Value = "○"
            Else
                If .Value = "○" Then
                    .Value = "●"
                End If
            End If
        End With
    Next
    
End Sub

普通のゲームみたいに、無限ループ使うのでなく、ダブルクリックした時だけ動くようにした。コードはゲーム画面とするシートに打ち込んだ。画面はシンプルで、壁は■、消えてるライトは○、点いてるライトは●とした。描画機能はなく、自分でシート上に入力して画面を作る。

キモは、この部分。

Set myRange = Union(Target, .Offset(0, -1), .Offset(-1, 0), _
    .Offset(0, 1), .Offset(1, 0))

クリックした部分を含め、その上下左右の部分のライトを反転させるので、その範囲をUnionを使ってmyRangeに入れてしまい、あとはFor Eachを使ってループして反転処理を行う。

試作画面は、3×3としたが、意外に難しく、なかなか合わない。もちろん5×5画面も作ればちゃんと動きますし、こんな変形画面のものも簡単に作れます。
f:id:Hanamaru:20140223175936j:plain

つぎ作るのは、オセロかな?