【EXCELでローグを作る】第2回指定したセルに文字を表示する

EXCEL
スポンサーリンク

今回は前回の予告通り、カーソルではなく自キャラを「@」に変更して移動させる事に挑戦します。
そんな大した事はしないです。指定したセルに文字を書き込んでやるだけです。
それでは行ってみましょう!

スポンサーリンク

プレーヤーシンボルの「@」を表示する

プレーヤーを表示するということでまずはプレーヤークラスを作成します。

プロジェクトにクラスオブジェクトを追加します。

メンバー変数にPlayerの位置を示す「X」「Y」を宣言します。メンバー変数にクラス外部から勝手にアクセス出来ないようにPrivate変数にしておきます。

メンバー変数にアクセスするためにPropertyを用意します。

Property Get プロパティ名() as 型
値を取得する
Property Let プロパティ名(変数名 as 型)
メンバー変数に値を設定する(値型)
Property Set プロパティ名(変数名 as 型)
メンバー変数に値を設定する(オブジェクト)

クラスはNEWされたタイミング(インスタンス作成時)は初期化メソッドClass_Initialize()が自動で呼ばれます。ここでメンバー変数の初期化などを行っておきます。今回は座標の初期値(1,1)を設定しています。

Option Explicit

'' Playerクラス

Private x As Integer    '' 主人公の座標 X
Private y As Integer    '' 主人公の座標 Y

'' プロパティ X
Public Property Get posX() As Integer
    posX = x
End Property

Public Property Let posX(argX As Integer)
    x = argX
End Property

'' プロパティ Y
Public Property Get posY() As Integer
    posY = y
End Property

Public Property Let posY(argY As Integer)
    y = argY
End Property

'' クラスの初期化
Private Sub Class_Initialize()
    '' 主人公の位置を初期化
    posX = 1
    posY = 1
End Sub

ゲーム開始ボタンを作って、そのクリックイベントに初期化をするようにします。これで下準備は完了です。

GameStart

このボタンのクリックイベントでPlayaerクラスをNEWします。

いよいよPlayaerを表示します。

Cells(row, column) プロパティ
指定された行列にあるセルの情報を返却する(Rangeオブジェクト)
Valueプロパティ
Rangeオブジェクトのプロパティ。Rangeが示すセルの値

このプロパティを組み合わせればセルに値を表示できます。

前回移動のクリックイベントを記載した、今回のマクロの核になるmodRogueに記載します。

Option Explicit

'' プレーヤー
Private myPlayer As Player

'' =========== 移動のクリックイベントは省略 

''------------
'' ゲーム開始
''------------
Sub Start_Click()
    '' 主人公の作成
    Set myPlayer = New Player
    
    '' 主人公の表示
    DisplayPlayer
End Sub

'' プレーヤーを表示する
Sub DisplayPlayer()
    '' プレーヤーをPlayerクラスが保持する座標のセルに表示する
    Cells(myPlayer.posY, myPlayer.posX).Value = "@"
End Sub

これで完成です。

動作を確認してみましょう。

GameStart前

GameStart後

無事、A1のセルに”@”が表示されました!

Playerを移動させよう!

無事表示されたので次は移動です。

基本的な処理の流れは次の通りになります。

  1. 今の位置から”@”を消す
  2. Playerを移動させる(ボタンに応じた移動量)
  3. 移動した場所に”@”を表示

この3つの処理になります。

前回はアクティブセルを移動する処理を記述しました。今回はそちらを改良します。すでに領域外に出ないような判定が入っているので、それを活かしながら改造します。

削除用のメソッドを作成する

今いるところからPlayerを削除するには、セルに空白を設定すればOKです。削除用のメソッドを用意しておきます。

Playerの移動はPlayerクラスに任せる

Playerの移動はPlayerクラスに任せます。具体的には移動用のメソッドをPlayerクラスに実装して、そのメソッドを呼び出すだけにします。

8方向+位置をステイさせる9の移動用メソッドを今回用意します。

  • MoveUP()
  • MoveUR()
  • MoveRT()
  • MoveDR()
  • MoveDN()
  • MoveDL()
  • MoveLT()
  • MoveUL()
  • MoveST()

移動量などはPlayerの属性に応じてになるので、移動量も外部からしてしません(今回は1固定で作ります)。

これらを実装する事で”@”が縦横無尽に移動するようになりました!!

まとめの実装

最後に今回の実装を記述しておきます。

modRogue(標準モジュール)

Option Explicit

'' プレーヤー
Private myPlayer As Player

''------------
'' 上に移動
''------------
Sub U_Click()
    If 1 < myPlayer.posY Then
        UnDisplayPlayer
        myPlayer.MoveUP
        DisplayPlayer
    End If
End Sub

''------------
'' 右上に移動
''------------
Sub UR_Click()
    If 1 < myPlayer.posY And myPlayer.posX < 10 Then
        UnDisplayPlayer
        myPlayer.MoveUR
        DisplayPlayer
    End If
End Sub

''------------
'' 右に移動
''------------
Sub R_Click()
    If myPlayer.posX < 10 Then
        UnDisplayPlayer
        myPlayer.MoveRT
        DisplayPlayer
    End If
End Sub

''------------
'' 右下に移動
''------------
Sub DR_Click()
    If myPlayer.posY < 10 And myPlayer.posX < 10 Then
        UnDisplayPlayer
        myPlayer.MoveDR
        DisplayPlayer
    End If
End Sub

''------------
'' 下に移動
''------------
Sub D_Click()
    If myPlayer.posY < 10 Then
        UnDisplayPlayer
        myPlayer.MoveDN
        DisplayPlayer
    End If
End Sub

''------------
'' 左下に移動
''------------
Sub LD_Click()
    If myPlayer.posY < 10 And 1 < myPlayer.posX Then
        UnDisplayPlayer
        myPlayer.MoveDL
        DisplayPlayer
    End If
End Sub

''------------
'' 左に移動
''------------
Sub L_Click()
    If 1 < myPlayer.posX Then
        UnDisplayPlayer
        myPlayer.MoveLT
        DisplayPlayer
    End If
End Sub

''------------
'' 左上に移動
''------------
Sub UL_Click()
    If 1 < myPlayer.posY And 1 < myPlayer.posX Then
        UnDisplayPlayer
        myPlayer.MoveUL
        DisplayPlayer
    End If
End Sub

''------------
'' ゲーム開始
''------------
Sub Start_Click()
    '' 主人公の作成
    Set myPlayer = New Player
    
    '' 主人公の表示
    DisplayPlayer
End Sub

''----------------------
'' プレーヤーを表示する
''----------------------
Sub DisplayPlayer()
    Cells(myPlayer.posY, myPlayer.posX).Value = "@"
End Sub

''----------------------
'' プレーヤーを消す
''----------------------
Sub UnDisplayPlayer()
    Cells(myPlayer.posY, myPlayer.posX).Value = ""
End Sub

 

Player(クラス)

Option Explicit

'' 主人公クラス

Private x As Integer    '' 主人公の座標 X
Private y As Integer    '' 主人公の座標 Y

Private moveDist As Integer '' 移動量

'' プロパティ X
Public Property Get posX() As Integer
    posX = x
End Property

Public Property Let posX(argX As Integer)
    x = argX
End Property

'' プロパティ Y
Public Property Get posY() As Integer
    posY = y
End Property

Public Property Let posY(argY As Integer)
    y = argY
End Property

'' クラスの初期化
Private Sub Class_Initialize()
    '' 主人公の位置を初期化
    posX = 1
    posY = 1
    
    '' 移動量を初期化
    moveDist = 1
End Sub

'' 上に移動
Public Sub MoveUP()
    posX = posX
    posY = posY - moveDist
End Sub

'' 右上
Public Sub MoveUR()
    posX = posX + moveDist
    posY = posY - moveDist
End Sub

'' 右
Public Sub MoveRT()
    posX = posX + moveDist
    posY = posY
End Sub

'' 右下
Public Sub MoveDR()
    posX = posX + moveDist
    posY = posY + moveDist
End Sub

'' 下
Public Sub MoveDN()
    posX = posX
    posY = posY + moveDist
End Sub

'' 左下
Public Sub MoveDL()
    posX = posX - moveDist
    posY = posY + moveDist
End Sub

'' 左
Public Sub MoveLT()
    posX = posX - moveDist
    posY = posY
End Sub

'' 左上
Public Sub MoveUL()
    posX = posX - moveDist
    posY = posY - moveDist
End Sub

'' ステイ
Public Sub MoveST()
    posX = posX
    posY = posY
End Sub

 
次回は敵キャラを表示して動かしてみたいと思います!
 

最後までお付き合い頂きありがとうございました。

よろしければはてなブックマークやいいね!などお願いします。

 

また、ブログランキングに参加していますので、お帰りの際にポチッとして頂けると嬉しいです。

ブログランキング・にほんブログ村へ
にほんブログ村

コメント