仕事が一段落したので、気分転換にExcelでゲームを作ってみた。ゲームの作成って、コアのアルゴリズムよりも画面作成が結構めんどくさかったりする。でも、Excelなら、普段慣れたシートやセルを使えば、見栄え良くなくても取り合えず動くものは何とか作れる。ということで、ライツアウトもどきを、できる限り短いコードになるよう作ってみた。
コードはこんだけ。我ながら短くまとめられた。
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画面も作ればちゃんと動きますし、こんな変形画面のものも簡単に作れます。
つぎ作るのは、オセロかな?