2018年6月21日木曜日

EXCEL VBAで簡単倉庫番 その1

パズルゲームの定番といえば倉庫番。
EXCEL VBAで倉庫番を作ってみたいと思います。
きちんとしたグラフィックのものを作るのは面倒ですので、セルに記号を表示する形にします。
矢印キーで動かせるようにしたいですね。
キー入力を判定するプログラムを書いてもいいですが、今回はイベントプロシージャーを使うことにします。
ブックを開くとかワークシートをダブルクリックするとか、変更するとか、
ブックやワークシートに対する動作をイベントと言います。
特定のイベントが発生したときに特定のプログラムが動くようにすることができます。
これがイベントプロシージャーです。
矢印キーを押すと、選択されているセルの位置が変わりますので、
ワークシートのSelectionChangeというイベントを使うことにします。
これは選択されたセルが変わるというイベントです。
ワークシートが開かれたときに特定のセルに位置付けておいて、
このイベントが発生したときに選択されているセルの位置を調べれば、
どの矢印キーが押されたのか分かります。
マウスで他のセルをクリックしてもイベントが発生するんのですが、
隣接していないセルの場合は無視するようにしておけばよいでしょう。
ENTERやTABを押したときにも移動するようになりますが、特に問題はありませんね。

では実際に作ってみましょう。
とりあえず、プレイヤーの移動と荷物を押すことができるものを用意しました。
新規にExcelのブックを作り、Visual Basicの画面を表示し、左に表示されている
ワークシートのどれか(ここではSheet3とします)をダブルクリックし、次のコードを貼り付けます。

☆☆☆↓ここから
Const YY = 2, XX = 12

Private Sub Worksheet_Activate()
CHARA = UCase(Cells(YY, XX))
If CHARA <> "E" Then
Cells.ClearContents

For WY = 1 To 10
For WX = 1 To 10
If WX = 1 Or WX = 10 Or WY = 1 Or WY = 10 Then Cells(WY, WX) = "□"
Next WX
Next WY
Cells(3, 3) = "○"
Cells(4, 4) = "○"
Cells(5, 5) = "□"
Cells(6, 6) = "□"
Cells(6, 7) = "□"

Cells(YY - 1, XX) = "↑"
Cells(YY, XX - 1) = "←"
Cells(YY + 1, XX) = "↓"
Cells(YY, XX + 1) = "→"
Columns("A:M").EntireColumn.AutoFit
Cells(2, 2) = "△"
Cells(YY + 2, XX) = 2
Cells(YY + 2, XX + 1) = 2
Cells(YY, XX).Select
End If
End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
CHARA = UCase(Cells(YY, XX))
If CHARA <> "E" Then
DY = Target.Row - YY: DX = Target.Column - XX
If Abs(DY) + Abs(DX) = 1 Then
CY = Cells(YY + 2, XX): CX = Cells(YY + 2, XX + 1)
NY = CY + DY: NX = CX + DX
NY2 = NY + DY: NX2 = NX + DX
CELL1 = Cells(NY, NX)
If CELL1 <> "□" And CELL1 <> "○" Then
Cells(NY, NX) = "△"
Cells(CY, CX) = ""
Cells(YY + 2, XX) = NY: Cells(YY + 2, XX + 1) = NX
End If
If CELL1 = "○" Then
CELL2 = Cells(NY2, NX2)
If CELL2 <> "□" And CELL2 <> "○" Then
Cells(NY2, NX2) = "○"
Cells(NY, NX) = "△"
Cells(CY, CX) = ""
Cells(YY + 2, XX) = NY: Cells(YY + 2, XX + 1) = NX
End If
End If
End If
Cells(YY, XX).Select
End If
End Sub
☆☆☆↑ここまで

VBAの画面を閉じてSheet3に切り替えるとゲーム画面っぽいものが表示されます。
□は壁、△はプレイヤー、○は荷物です。
矢印キーで△が動きます。
壁があるところは通れません。
荷物は1個だけ押して動かすことができます。
進行方向に荷物や壁がある場合は動かせません。

簡単に仕組みを解説します。
Worksheet_Activateイベントで画面の初期化を行います。
これはそのワークシートがアクティブになったというイベントです。
そのシートが表示されたときに発生します。
画面をクリアし、壁、プレイヤー、荷物を配置し、セルの幅を調整します。
↑←→↓で囲まれたセルが選択された状態にします。
この状態で矢印キーを押すと、選択されたセルは上下左右に隣接するセルのどれかに移動し、
Worksheet_SelectionChangeイベンとが発生します。
このイベントでは移動後のセルの位置が分かります。
移動後のセルの内容が「↑」であれば↑キーが押されたと判断し、その方向に移動する処理を行います。
マウスで「↑」のセルをクリックした場合も同じ処理になります。
他のセルをクリックした場合は何もしないようにしています。
矢印の方向に応じて移動先のセルを計算し、移動先のセルの内容により処理を行います。
移動先のセルが壁であれば移動不可。
移動先のセルが空白であればプレイヤーのみの移動です。
移動先のセルに「△」を書き込んで、移動元のセルの内容を消します。
移動先に荷物がある場合はもう一つ先のセルが空白かどうか調べます。
空白の場合は荷物とプレイヤーを移動させます。
「↓」の下に表示されている2つの数字は、プレイヤーのY座標とX座標です。
Y行目のX列目にいますよということです。

「E」または「e」を入力するとマクロが動作しないようになりますので、
□や○を書いたり消したりして、好きな面を作ることができます。
入力した「E」「e」を消すとマクロが動作するようになります。
一行目の壁を消してそこから上に移動しようとしたりするとエラーになりますのでご注意ください。
△の場所を変えたい場合は座標も書き換えてください。
□、○以外は無視されます。

これで倉庫番っぽいものはできました。
次回は荷物を置く場所も設定して、クリア判定までしてくれるようにしたいと思います。

0 件のコメント:

コメントを投稿