Excelは単なる表計算ツールではありません。VBA(Visual Basic for Applications)を使えば、迷路を自動生成し、プレイヤーを操作して敵と戦うゲームまで作れてしまいます。
このゲームはExcelのセルを使った迷路アドベンチャーです。
主なモジュールと役割
モジュール名 概要
ゲーム開始 初期化、迷路生成、敵配置
掘り進め迷路 再帰的な迷路の自動生成
Worksheet_SelectionChange セル移動時の処理、衝突判定、戦闘
MoveEnemies 敵の自動移動処理
攻撃モードON 攻撃モードを一時的に有効化
編集する
Sub ゲーム開始()
'
初期設定
mazeSize = 21
hp = 100
ws.Cells.Clear
mazeSize:迷路サイズ(21×21)
'
迷路配列の準備
ReDim maze(1 To mazeSize, 1 To mazeSize)
For i = 1 To mazeSize
For j = 1 To mazeSize
maze(i, j) = 1
Next j
Next i
すべてのセルを壁(黒)にしておき、あとから通路を掘っていきます。
Call 掘り進め迷路(2, 2)
'
迷路をシートに描画
For i = 1 To mazeSize
For j = 1 To mazeSize
With ws.Cells(i, j)
.Value = ""
.ColumnWidth = 2
.RowHeight = 15
If maze(i, j) = 1 Then
.Interior.Color = RGB(0, 0,
0) ' 壁
Else
.Interior.Color = RGB(255,
255, 255) ' 通路
End If
End With
Next j
Next i
数値によって色分け(壁=黒、通路=白)してセルに反映。
'
スタート地点とゴール地点
ws.Cells(2, 2).Interior.Color = RGB(0, 255, 0) ' プレイヤー(緑)
ws.Cells(mazeSize - 1, mazeSize - 1).Interior.Color = RGB(255, 0, 0) ' ゴール(赤)
'
敵の設置
enemyCount = 5
ReDim enemies(1 To enemyCount, 1 To 2)
For i = 1 To enemyCount
Do
er = Int((mazeSize - 2) * Rnd) + 2
ec = Int((mazeSize - 2) * Rnd) + 2
Loop While maze(er, ec) = 1 Or (er = 2 And ec = 2) Or (er = mazeSize - 1
And ec = mazeSize - 1)
enemies(i, 1) = er
enemies(i, 2) = ec
ws.Cells(er, ec).Interior.Color = RGB(139, 69, 19) ' 敵:茶色
Next i
敵は5体、迷路の中にランダムに配置されます(スタート・ゴール以外)。
4. 迷路生成:Sub 掘り進め迷路(x, y)
Sub 掘り進め迷路(x As
Integer, y As Integer)
maze(y, x) = 0
0は通路。現在位置を通路に設定。
dirs = Array("N", "S", "E", "W")
'
方向をシャッフルして再帰的に進む
For i = 0 To 3
' 各方向に2マスずつ進んで掘る(奇数マスが壁、偶数マスが通路)
Select Case dirs(i)
Case "N": dx = 0: dy = -2
...
End Select
nx = x + dx
ny = y + dy
If maze(ny, nx) = 1 Then
maze(y + dy \ 2, x + dx \ 2) = 0 ' 間の壁を破壊
Call 掘り進め迷路(nx, ny)
End If
5. プレイヤー移動:Worksheet_SelectionChange
このイベントは、セルが選択された時に自動実行されます。
If Target.Cells.Count > 1 Then Exit Sub
If Target.Row < 1 Or Target.Row >
mazeSize Then Exit Sub
移動できるのは1セルずつ&迷路内のみ。
'
壁ならHPを減らし、元の場所に戻る
If c = RGB(0, 0, 0) Then
hp = hp - 10
MsgBox "壁にぶつかった!"
'
攻撃モード確認(セルAD1)
If ws.Cells(1, 30).Value = "ON" Then isAttacked = True
攻撃モードなら敵を倒せる。
'
敵と衝突
If enemies(i, 1) = playerRow And enemies(i, 2) = playerCol Then
If isAttacked Then
MsgBox "敵を倒した!"
Else
hp = hp - 20
'
ゴール判定
If playerRow = mazeSize - 1 And playerCol = mazeSize - 1 Then
MsgBox "ゴール!おめでとう!"
6. 敵の自動移動:MoveEnemies
directions = Array(Array(-1, 0), Array(1, 0), Array(0, -1), Array(0, 1))
' 上下左右
各敵が上下左右のいずれかに1マス動きます。
If maze(newRow, newCol) = 0 Then
If Not occupied Then
possibleMoves.Add Array(newRow, newCol)
通路であり、他の敵やプレイヤーがいないマスだけ候補に。
7. 攻撃モード:攻撃モードON
Sub 攻撃モードON()
Sheets(1).Cells(1, 30).Value = "ON"
MsgBox "攻撃モードON!"
End Sub
プレイヤーが任意のタイミングでONにできます(ボタンに割り当てると便利)。
次の敵との接触で発動し、自動的にOFFになります。
8. 改造・応用アイデア
✅ ゴールまでの制限時間を設ける
✅ 敵の数をレベルに応じて増やす
✅ アイテム(回復や鍵)を配置
✅ 敵の追尾AI(プレイヤーに近づく)
9. おわりに
この迷路ゲームは、VBAの面白さと可能性を体感できる絶好の教材です。
0 件のコメント:
コメントを投稿