たんぶるぐりーふ

プログラミングなど。

ExcelVBAではじめるローグライク開発 #1

f:id:pandorina463:20171214143144p:plain

shichiです。さいきんswichがお家に来ました。64以来の据え置きです。 ちなみに上の画像は二年前くらいに作ったクソゲーです。今回は作り直します。

突然ですがみなさん、VBAはご存知でしょうか。 wikipediaで検索してみると、

VBA

と出てきますが、今回は一番上のVisual Basic for Applicationsのお話。

VBAとは?

簡単にいってしまうとエクセルで行われる様々な作業をマクロを組んで自動化するための言語です。 例えば毎回毎回七面倒な書類を同じ形式で作っている時とか、ひょんなことから何万件もあるデータを分類したり整理しなくてはならなくなった時に使います。 今回はエクセルのセルをマスに見立ててローグライクを実装していくといった方針でやっていきたいと思います。

ローグライクとは?

さて、数あるゲームの中でもローグライクというものが如何なる物か。ローグライクの定義は地球の砂粒の数より多いと私の中で話題ですが、ここは国民的websiteであらせれるwikipediaさんに 「ok,google ローグライクの定義を教えて」 をしてみましょうか。。。

ローグライクゲーム(Rogue-like games)は、ローグと同様の特徴を持っているコンピュータRPGの総称である。 ローグライクゲームでは伝統的に全ての情報を文字で表示するが(テキストユーザインタフェース)、オプションでキャラクターや地形等の情報をグラフィカルに表示できるものもある。また、チュンソフトが制作している不思議のダンジョンシリーズ等のコンシューマー用のローグライクゲームでは、グラフィック表示が標準になっている。

ん〜〜よくわかんない。下の動画みたいな感じの物だと思っていただければいいと思う。最近のだとポケモン不思議のダンジョンとかトルネコとか。

主人公の表示・移動について

どのようなゲームを作るにおいても必要となるのが、主人公の描画です。それなくしてゲームの完成はありえないといっても過言ではないくらい。ここで登場するのがVBA。とりあえず選択中のセルに主人公 @ を表示・移動してみましょう。

まずはゲームのバックグラウンド処理などをするbgシートとgameシートを作成しましょう。また、bgシートのcells(1,1)とcells(1,2)を主人公位置の変数置き場とします。別に他でもいいですけど。とりあえず初期位置として下図のように入力しておいて下さい。

以下が主人公を表示するためのコードです。 gameシート関数にコードを追加していきます。

↓ここです

Dim target_before As String
Dim game_sheet, bg_sheet As Worksheet

Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = False
    Set bg_sheet = ThisWorkbook.Sheets("bg")
    Set game_sheet = ThisWorkbook.Sheets("game")
    
    Call draw_chara(Target)
    
End Sub

Sub draw_chara(ByVal Target As Range)
    target_before = bg_sheet.Cells(1, 2)
    game_sheet.Range(target_before) = ""
    bg_sheet.Cells(1, 2) = Target.Address
    
    Target = "@"
End Sub

うごいた!!

f:id:pandorina463:20171215131746g:plain

コードの詳細について説明すると、Worksheet_SelectionChangeと言うのはワークシート関数の一つで、ワークシートの選択範囲を常に監視しています。選択範囲の変更が有ると実行されるので、コレをキャラ移動の実装に用いたわけです。

そしてTargetというのが現在選択されている範囲となります。 draw_chara内では予めbgシートに保存してあったTarget変更前の場所をtarget_beforeとして取得し、描画されている@を削除。引数として受け取ったTargetの場所に主人公を表す記号で有る@を表示し、現在の場所をbgシートに格納しています。

ローグライクにおいては、主人公の行動を一つのターンとして消費します。そのためこの移動を皮切りにWorksheet_SelectionChangeの中にアイテム取得とかそこら辺の実装をしていけばいいというわけです。

主人公が広大なエクセル世界を探索できるようになったみたいですね。 次回はマップの自動生成アルゴリズムとかそこら辺について話したいと思います。