非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

Excel/VBAでパックマンを作る

      2017/10/04

Excel方眼紙を使ってパックマンを作ってみました。

まだゲームとしては成り立っておらず、壁も敵キャラもいません。単に矢印キーでパックマンが上下左右に動くだけですね。壁もこれからです。

とりあえず、パックマンを矢印キーで動かすような基本的なところを押さえました。

[ad#top-1]

動画でみるExcelパックマン

動画でざっとした動きを紹介します。上下左右に動いていますがパソコンの矢印キーで動かしています。

 

動画にはありませんが、実際は赤丸で示したフォームが現れます。こいつが矢印キーをキャッチしてくれるんですね。シート上ではキーイベントが拾えないみたいなので。フォームをダブルクリックすると終了します。

 

ソースコード

まだ、パックマンのキー操作だけですが、ソースコードを書き留めておきます。もう少し完成度が上がったらGitHubにアップします。

Startボタン押下時

Excelシート右上の「Start」ボタンを押すとパックマンが開始されます。

開始コードは以下の通り。まずは4行目にスタート時のパックマンを描画します。座標と、”RIGHT”というのは「右向き」という意味です。

Sub start()
  Range("A2:ZZ200").Interior.Pattern = xlNone

  Call packman(7, 7, "RIGHT") 'パックマンの描画 座標(7,7)
  Call UserForm1.setPos(7, 7) 'フォームに開始座標をセット
  UserForm1.Show 'フォーム起動
End Sub
 

 

packmanプロシージャ

パックマンを描画するプロシージャは下記の通りです。pack配列はパックマンを描画するためのデータです。右向き、左向き、上向き、下向きのそれぞれに対応しています。描画前に1セル後ろの1列分の色を消しているので、あたかも進んでいるように見えるってわけですね。

Sub packman(posx, posy, direct)
  Dim pack As Variant

  If direct = "RIGHT" Then
    If posx > 150 Then Exit Sub
    pack = Array( _
           Array(0, 0, 1, 1, 0), _
           Array(0, 1, 1, 1, 1), _
           Array(1, 1, 1, 0, 0), _
           Array(0, 1, 1, 1, 1), _
           Array(0, 0, 1, 1, 0) _
          )
    Range(Cells(posy - 2, posx - 3), Cells(posy + 2, posx - 3)).Interior.Pattern = xlNone
  ElseIf direct = "LEFT" Then
    If posx < 7 Then Exit Sub
    pack = Array( _
           Array(0, 1, 1, 0, 0), _
           Array(1, 1, 1, 1, 0), _
           Array(0, 0, 1, 1, 1), _
           Array(1, 1, 1, 1, 0), _
           Array(0, 1, 1, 0, 0) _
           )
         Range(Cells(posy - 2, posx + 3), Cells(posy + 2, posx + 3)).Interior.Pattern = xlNone
  ElseIf direct = "UP" Then
    If posy < 7 Then Exit Sub 
    pack = Array( _ 
           Array(0, 1, 0, 1, 0), _ 
           Array(1, 1, 0, 1, 1), _ 
           Array(1, 1, 1, 1, 1), _ 
           Array(0, 1, 1, 1, 0), _ 
           Array(0, 0, 1, 0, 0) _ 
           ) 
    Range(Cells(posy + 3, posx - 2), Cells(posy + 3, posx + 2)).Interior.Pattern = xlNone 
  ElseIf direct = "DOWN" Then 
    If posy > 70 Then Exit Sub
    pack = Array( _
           Array(0, 0, 1, 0, 0), _
           Array(0, 1, 1, 1, 0), _
           Array(1, 1, 1, 1, 1), _
           Array(1, 1, 0, 1, 1), _
           Array(0, 1, 0, 1, 0) _
           )
    Range(Cells(posy - 3, posx - 2), Cells(posy - 3, posx + 2)).Interior.Pattern = xlNone
  End If

  For i = 0 To UBound(pack)
    For j = 0 To UBound(pack(i))
      If pack(i)(j) = 1 Then
        Cells(posy - 2 + i, posx - 2 + j).Interior.Color = 49407
      Else
        Cells(posy - 2 + i, posx - 2 + j).Interior.Pattern = xlNone
      End If
    Next j
  Next i

  Call UserForm1.setPos(posx, posy)
End Sub
 

 

UserForm

スタートボタンを押したときに各矢印キーに応じて座標を指定しつつ前出のpackmanプロシージャを呼び出しているわけです。

Dim lastposx As Integer
Dim lastposy As Integer
Sub setPos(x, y)
  lastposx = x
  lastposy = y
End Sub

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyUp Then
    Call packman(lastposx, lastposy - 1, "UP")
  ElseIf KeyCode = vbKeyDown Then
    Call packman(lastposx, lastposy + 1, "DOWN")
  ElseIf KeyCode = vbKeyLeft Then
    Call packman(lastposx - 1, lastposy, "LEFT")
  ElseIf KeyCode = vbKeyRight Then
    Call packman(lastposx + 1, lastposy, "RIGHT")
  End If
End Sub
 

 

とりあえずこんな感じです。今後は迷路みたいな壁を作ってそこを通るような動きをさせようと思います。

※続編です。

 

[ad#ad-1]

スポンサーリンク

 - Excel, VBA