見出し画像

Excel(VBA)で簡単なゲームを作る

こんにちは「つけらっとゲームス」プログラム担当のとちです。
今回は「ゲームを作ってみたいけど、どうしたら作れるの?」にお答えする記事のひとつです。

Unityなどのゲームエンジンを使うのは難しそう、もうちょっと馴染みのあるソフトを使ってゲーム作れないかなーっていう方にオススメ!
Excel使って簡単なゲームを作ってみましょう!

なお、この記事のスクショ等についてなんですが、
わたしのPCに入っているMicrosoft office Home and Business 2016で作ったので、皆さんのお手元のExcelと微妙に異なるかもです。ご了承ください。



こんなゲームができます!

今回作るのは簡単なゲームです。
サイコロ2つを振って出る目を予想して「6以下」「7」「8以上」の中から当てはまるものを選びます。

正解するとコインが1枚増えますが、ハズレると1枚減ります。
コインが10枚になるとクリア、0枚になるとゲームオーバーです。

当たるとコインが1枚増えてます!

Excelの準備

とりあえずExcelを起動します。
ファイル名はとりあえず何でもいいのですが「TEST.xlsm」としましょう。

Excelのファイルを新規作成すると拡張子が「.xlsx」になるかもしれません。
その場合は「ファイル」を選んで、

その次に「名前を付けて保存」を選んで見てください。

このあと、保存する場所を選ぶと下のようなウィンドウが出てきます。
「ファイルの種類」を選択してみると…

名前を付けて保存、ファイルの種類を変更しておきますね!

マクロ有効ブックの拡張子は「.xlsm」だったりするんですね……
なので今のうちに「TEST.xlsm」にしておくと良いでしょう!

ホーム画面に戻っていたら、もう一度「ファイル」を選んでください。
すると以下の画面が表示されるハズ、ここで「オプション」を選びます。

Excelのオプション画面が表示されるので、
その中の「リボンのユーザー設定」を選びましょう。

リボンをカスタマイズする画面に切り替わります。
リボンのユーザー設定にある「開発」のチェックボックスをクリックして、チェックマークを表示できたら「OK」ボタンをクリックしましょう。

すると、下のスクショの場所に「開発」と表示されるようになってるハズ、
これをクリックすると…

開発タブの中身が表示されます。普段のExcelでは見慣れないボタン類が出てきましたね。この中の「Visual Basic」を選んで開発を進めます。


ゲーム画面を作る

これまた見慣れない画面が出てきましたが大丈夫。怖くないですよ。
この中の「挿入」>「ユーザーフォーム」を選んでください。

すると、こんな画面になるハズです。
この中にゲームで使用する画面を作っていきます。

ツールボックスにある「A」の部分をクリックします。
(下のスクショの青地になっているところ、オンマウス状態でしばらくすると「ラベル」と表示されます)

この状態で先ほど作った「UserForm1」で左ドラッグ(左クリックしたままマウスを動かす)すると、下の画面の様になります。
「Label1」と表示された長方形が作られました。

今後、文字を画面表示する時はツールボックスの「ラベル」を使います。

※ツールボックスが無かったら?

もし画面上にツールボックスが見つからない場合は、下のスクショのように「表示」>「ツールボックス」を選ぶと画面表示されます。

※作成中にこんな画面がでたら?

画面を作っている最中に、ダブルクリックしちゃうと次のような画面が表示されると思います。

表示されてる英文は違うかも知れませんが、こんな画面が出てきたら?

これはプログラムコードを入力する画面です。
プログラムコードは後で作るので、いまは慌てずに「×」ボタンを押して、このウィンドウを消しちゃいましょう。

ラベルを置いていく

完成したゲーム画面を見ると、いくつかのラベルを使用しているのがわかりますね。というわけで、ラベルを大体の位置に置いて行きましょう。

ゲーム画面
とりあえず6個のラベルを作ります。

Label1の設定変更

それではラベルの設定を変えていきましょう。
下のスクショは「Label1」を選んでいる状態です。画面左下にプロパティという部分があり、ここには「Label1」の現在の設定が表示されています。

Label1 のプロパティを変更しましょう!

「Caption」の欄に「Label1」とありますが、この部分を選んで文章を入力します。完成品のこの部分は「コイン」とあるので、そのまま「コイン」と入力しておきます。

同様に「オブジェクト名」を「CoinTitle」に変更しておきます。

フォントは自由に設定して構いません。
プロパティの中にある「Font」を選ぶと「…」ボタンが表示されるので、それをクリック、フォントをお気に入りのものに変更しましょう。

Label2の設定変更

Label2の設定も変更していきます。

Label2は現在のコインの数を表示する場所です。
オブジェクト名を「NowCoin」とします。Captionは「5」にします。
ゲームオーバーとクリアに関わるコイン数ですから、ちょっとだけ他のラベルよりアピールしたいところですね。

そこで「BorderStyle」の欄を変更します。
「BorderStyle」の欄を選択すると「▼」ボタンが表示されますので、
これをクリックするとプルダウンメニューが出てきます。
「1-fmBorderStyleSingle」に切り替えましょう。これで枠線が出ます。

数字が左揃えだとカッコ悪いので「TextAlign」も変更しましょう。
「TextAlign」の欄を選択し「▼」ボタンをクリックします。
「2-fmTextAlignCenter」にすると中央揃えになります。

他のLabelの設定変更

これまでの作業を見るとラベルを作って、プロパティを変更することで画面にゲーム画面が作られていくのがわかりました。
ですので、他のラベルもプロパティを変更してきます。

Label3のオブジェクト名を「CoinTani」に、Captionを「枚」にします。

Label4のオブジェクト名を「GameMessage1」に、Captionを「サイコロを振って出た目の合計は?」に変更します。

Label5のオブジェクト名を「GameMessage2」に、Captionを「正解するとコインが1つ増えるよ!」にします。

Label6のオブジェクト名を「Answer」に、Captionを「コイン10枚になったらゲームクリア!」とします。

これらを設定し終えると、こんな感じの画面になっていると思います。

コマンドボタンを置く

次は選択肢のボタンを作っていきましょう。
ツールボックスの中の「コマンドボタン」を選んでください。
(オンマウスでしばらく待つと「コマンドボタン」と表示されます)

ラベルを作った時と同じように、UserForm1の上で左ドラッグ(左クリックしたままマウスを動かす)するとボタンができます。
完成品の画面を見直すと選択肢は3つなので、こちらもボタンを3つ作っておきます。

というわけで、ボタンを3つ作りました。
この後でラベルと同様にプロパティ欄を変更していきます。

コマンドボタンの設定変更

作ったCommandButton1を選択するとプロパティ欄に、CommandButton1の内容が表示されます。

CommandButton1のオブジェクト名を「BeforeSeven」に、Captionを「6以下が出る」に変更します。

同様にCommandButton2、CommandButton3も変更しましょう。

CommandButton2のオブジェクト名を「JustSeven」に、Captionを「7が出る」に変更します。

CommandButton3のオブジェクト名を「AfterSeven」に、Captionを「8以上が出る」に変更します。

この作業が終わるとUserForm1は、こんな感じになってるハズです。

サイコロ画像を置く

次にサイコロの画像を置きましょう!
ツールボックスの「イメージ」を選びましょう。
(オンマウスでしばらく待つと「イメージ」と表示されます)

ラベルやコマンドボタンと同様にユーザーフォームの上で左ドラッグ(左クリックしたままマウスを動かす)をします。これを12個作ります。
作る場所はとりあえず広い所に置いておきます。
……すると、下のようなスクショのような感じになります。

Image1~Image12が作れたら、次はサイコロの画像を当てはめていきます。
プロパティの中にあるPictureを選ぶと「…」ボタンが表示されます。
画像ファイルを選ぶとImageの表示が画像ファイルのモノに変更されます。

今回はテキトーに準備した以下の画像にしました。

jpgやgifであればサイコロ画像は好みの画像で構いません。

それぞれ12個のImageのプロパティ欄で設定変更していきます。
オブジェクト名とPictureを以下の様に変更しましょう!

数が多いので少し疲れますが…
この作業が終わると次のスクショのようになると思います。

次に、サイコロ画像を重ねていきます。それぞれのサイコロ画像を左クリックで選択、その後で左ドラッグすると動かせます。

dImageの後の数字に注目。
10の桁が「1」は1個目のサイコロという意味です。
10の桁が「2」は2個目のサイコロという意味です。

dImage11~dImage16を重ね合わせます。
dImage21~dImage26を重ね合わせます。

ゲーム画面の完成

最後に少し画面を整えて…
これでようやくゲーム画面が完成しました!


プログラムコードを書く

それでは、ゲームが動くようにプログラムコードを書きましょう。
ユーザーフォームの「6以下が出る」をダブルクリックしてください。
下のスクショの画面が表示されると思います。

Private Sub BeforeSeven_Click()

End Sub

と、表示されていますね。
これはオブジェクト名「BeforeSeven」のボタンをクリックした際のプログラムコードを書くところです。

ここまでの作業で随分と長い記事になっておりますので、
プログラムコードの解説は次回にしたいと思います。

とはいえ、動くところまで作っちゃいたいですよね。
では、先ほどのコードを一旦全て消してください。
そして以下のコードをコピー&ペーストしてください。

Option Explicit
Dim dOBJ1(5) As Object                          '[変数定義]サイコロ1の出目オブジェクト配列
Dim dOBJ2(5) As Object                          '[変数定義]サイコロ2の出目オブジェクト配列

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' UserForm1 が初期化された
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Private Sub UserForm_Initialize()
    Randomize                                   ' 乱数系列初期化
    Set dOBJ1(0) = dImage11                     ' 出目1画像をサイコロ1オブジェクト配列にセット
    Set dOBJ1(1) = dImage12                     ' 出目2画像   〃
    Set dOBJ1(2) = dImage13                     ' 出目3画像   〃
    Set dOBJ1(3) = dImage14                     ' 出目4画像   〃
    Set dOBJ1(4) = dImage15                     ' 出目5画像   〃
    Set dOBJ1(5) = dImage16                     ' 出目6画像   〃
    Set dOBJ2(0) = dImage21                     ' 出目1画像をサイコロ2オブジェクト配列にセット
    Set dOBJ2(1) = dImage22                     ' 出目2画像   〃
    Set dOBJ2(2) = dImage23                     ' 出目3画像   〃
    Set dOBJ2(3) = dImage24                     ' 出目4画像   〃
    Set dOBJ2(4) = dImage25                     ' 出目5画像   〃
    Set dOBJ2(5) = dImage26                     ' 出目6画像   〃
    
    fDiceFormat                                 ' Function DiceFormat 呼出(サイコロ画像を全て非表示にする)
    dOBJ1(0).Visible = True                     ' サイコロ1オブジェクトの1を表示(初期設定)
    dOBJ2(0).Visible = True                     ' サイコロ2オブジェクトの1を表示(初期設定)
    
End Sub

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' 「6以下が出る」をクリックされた
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Private Sub BeforeSeven_Click()
    fAnswer (6)                                 'ゲーム結果を画面反映する
End Sub

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' 「7」をクリックされた
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Private Sub JustSeven_Click()
    fAnswer (7)                                 'ゲーム結果を画面反映する
End Sub

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' 「8以上が出る」をクリックされた
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Private Sub AfterSeven_Click()
    fAnswer (8)                                 'ゲーム結果を画面反映する
End Sub

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' fAnswer           ゲーム結果を画面反映する
'
'       引数        BtnSw   押されたボタンスイッチ
'
'       戻値        なし
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function fAnswer(BtnSw As Integer)
    
    Dim wDice As Integer                        '[変数定義]サイコロ2個の出目合計
    Dim wSW   As Integer                        '[変数定義]ゲーム結果 [0]あたり [1]はずれ
    Dim wTxt  As String                         '[変数定義]ゲーム結果テキスト
    
    wDice = fDiceRoll()                         ' Function fDiceRoll 呼出 (サイコロ2個の出目合計を取得)
    wSW = 1                                     ' ゲーム結果 [1]はずれ に設定
    wTxt = "残念でした..."                      ' ゲーム結果テキストを、はずれた時の文章に設定
    NowCoin.Caption = NowCoin.Caption - 1       ' ゲーム参加費用 コイン1個
    
    If BtnSw = 6 And wDice <= 6 Then wSW = 0    ' クリックボタン6以下 且つ 出目6以下 >> ゲーム結果[0]あたり に変更
    If BtnSw = 7 And wDice = 7 Then wSW = 0     ' クリックボタン7     且つ 出目7     >> ゲーム結果[0]あたり に変更
    If BtnSw = 8 And wDice >= 8 Then wSW = 0    ' クリックボタン8以上 且つ 出目8以上 >> ゲーム結果[0]あたり に変更
    
    If wSW = 0 Then                             ' ゲーム結果[0]あたり の場合
        wTxt = "おめでとう!"                   ' ゲーム結果テキストを、あたりの文章に変更
        NowCoin.Caption = NowCoin.Caption + 2   ' コインを2枚増やす
    End If
    
    wTxt = "出目は「" & wDice & "」" + wTxt     ' ゲーム結果テキストの編集
    Answer.Caption = wTxt                       ' ゲーム結果テキストを画面表示

    If NowCoin.Caption <= 0 Then                ' コインが0以下になってしまったら...
        MsgBox "Game Over"                      ' メッセージボックス「Game Over」表示
        End                                     ' ゲーム終了
    End If
    
    If NowCoin.Caption >= 10 Then               ' コインが10以上になってしまったら...
        MsgBox "Game Clear"                     ' メッセージボックス「Game Clear」表示
        End                                     ' ゲーム終了
    End If
    
End Function

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' fDiceRoll         サイコロを2つ振った時の出目合計を返答する
'
'       引数        なし
'
'       戻値        サイコロ2つ振った時の出目合計を返答
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function fDiceRoll()
    Dim dOut1 As Integer                        ' ダイス1の出目を格納
    Dim dOut2 As Integer                        ' ダイス2の出目を格納
    
    fDiceFormat                                 ' Function fDiceFormat 呼出(サイコロ画像を全て非表示にする)
    dOut1 = fRandom(6, 1)                       ' Function fRandom     呼出(引数の値の中でランダムで数値を返答する)
    dOut2 = fRandom(6, 1)                       ' Function fRandom     呼出(引数の値の中でランダムで数値を返答する)
    
    dOBJ1(dOut1 - 1).Visible = True             ' サイコロ1オブジェクトの画像を表示
    dOBJ2(dOut2 - 1).Visible = True             ' サイコロ2オブジェクトの画像を表示
    fDiceRoll = dOut1 + dOut2                   ' サイコロ2つ振った時の出目を合計(返答用)
    Beep                                        ' Beep
    
End Function

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' fDiceFormat       サイコロ画像を全て非表示にする
'
'       引数        なし
'
'       戻値        なし
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function fDiceFormat()
    Dim i As Integer                            '[変数定義]添え字用
    
    For i = 0 To 5                              '■ ループ i が 0 から 5 になるまで繰り返し
        dOBJ1(i).Visible = False                '├ サイコロ1オブジェクトの非表示
        dOBJ2(i).Visible = False                '├ サイコロ2オブジェクトの非表示
    Next i                                      '└ 添え字のカウントアップ
    
End Function

'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'
' fRandom           引数の値の中でランダムで数値を返答する
'
'       引数        dMax 最大値
'                   dMin 最小値
'
'       戻値        dMin~dMaxの間の数値
'
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function fRandom(dMax As Integer, dMin As Integer)
    fRandom = Int(dMax * Rnd + dMin)            ' 最小~最大値の間の値を乱数を用いて返答する
End Function

コピペが終わったら、下のスクショのオレンジ丸の中にある、緑色の再生ボタンをクリックします。

動きました!
ボタンを押すとランダムにサイコロの出目が変わります。
次の出目を予想してボタンを押してみましょう。
予想が当たるとコイン+1、はずれると-1となります。
コインが10枚になるとクリア、0枚になるとゲームオーバーです。

プログラムを止めるときは、再生ボタンの右隣の右隣に「■」がありますよね、これをクリックするか、ゲーム画面の右上の「×」をクリックすることで止まります。


動かないんだけど!?(怒)

せっかくここまで作ったのに動かない!
そんなときは落ち着いて問題解決しましょう。
プログラム開発において不具合発生は普通にあることです。

(1)マクロのウィンドウが出てくる

再生ボタンを押したら次のようなウィンドウが出てくる場合は…

多分、いま作ったゲーム以外にフォーカスが移っている状態だと思います。
下のスクショのオレンジ丸の中にある「UserForm1」をダブルクリックして、ゲーム画面にフォーカスを戻して再生ボタンを押しましょう。

(2)エラーと表示される

こんな感じのエラーウィンドウが表示されたら…

コピペに失敗しているか、画面に作ったオブジェクト名が間違っているかのどちらかです。
プログラムコードを一旦全て消してコピペし直してみる。または画面に作ったオブジェクト名を確認してみましょう。

(3)ボタンを押しても反応しない

ボタンを押しても何も反応しないのであれば、やはりコピペに失敗しているか、画面に作ったオブジェクト名(特にボタンの名前)が間違っている可能性が高いです。

プログラムを停止させてプログラムコードまたはオブジェクト名を確認してみましょう。


続きます!

これで簡単ではありますが、ゲームそのものは動いているハズです。
「もうすこしルールを追加したい」といった気持ちも出てくると思います。
そして、その想いはプログラムコードを書き換えると実装可能です。

今回はプログラムコードをコピペしましたが、次回はその内容を解説していきたいと思います。

長い記事を読んでくださりありがとうございます。
そして実作業された方はお疲れ様でした!

「ゲームを作ってみたいけど、どうしたら作れるの?」にお答えする記事は他にもあります。ご興味がございましたら下記の関連記事もご覧ください。

(↓)アナログなゲームを作ってみてもいいんじゃない?っていう記事

(↓)ゲームブックを作ったので試遊だけでもいかが?っていう記事

(↓)クォリティはともかくカードゲームも作ってみたよって記事

それでは、また別の記事でお会いできるのを楽しみにしております~

この記事が参加している募集

#ゲームの作り方

871件

この記事が気に入ったらサポートをしてみませんか?