● ゲーム MIneSweeperの解説

ダウンロード前に内容を確認したい方、及びコードを改変したい方は以下をご一読ください。

●ゲームの説明

ダウンロードしたファイルを解凍した後できるMSwpr.xlsファイルを開くと、左図のような画面が表示されます。

10×10の水色の盤面がゲームができる場所となります。

地雷が埋まっているセルを避けて、より多くのセルを開けていくことを競うゲームです。

1)「Reset(Start)」ボタンを押して、開始メッセージに応答してください。 ゲームが始まり、水色盤面のどこでもクリックできるようになります。(2回目以降は、前回の内容がクリアされます)

2)盤面をクリックするとセルが開き、中身が表示されます。
地雷が埋まっている場所を開くとマークが、 クリックしたセルの上下・左右・斜め隣に地雷が埋まっている場合は、警告マーク△が表示されます。 その他のセルはセーフマーク○が出ます。

3)地雷を5個開けた時点で、ゲームは終了します。

4)「Display」ボタンを押すと、プレイ途中の場合はゲームを中止して、地雷が埋まっている場所をすべて公開します。

5)右欄のスコアは、Mine…地雷を開けた数、Safe…安全にセルを開けた数、Score…Safe−Mineを得点としています。
●Module1の説明

「Alt」+「F11」でVBエディタを起動してください。左図のコードは標準モジュールのModule1に記述しています。

(1)は変数の宣言。他のプロシージャで共用できるようにPublicで定義しています。
上の3つは開いた地雷数、セルを安全に開けた数、スコアをカウントするためのものです。 4番目の変数gFlgは、ゲームの開始を判断するためのフラグ。gFlg=Trueの場合のみゲームがプレイできるようにするためです。
データ型の詳細は下記の表を参照してください。

(2)の「DspCnt()」はサブルーチンとして利用するためのプロシージャ。 「cmdReset」プロシージャから呼び出されます。
コメントにあるようにカウンタの表示とスコアが40を超えた場合にメッセージを出す処理を受け持っています。
Constは定数の宣言で、OKOKと40はまったく同じ値であることを意味します。
定数の内容は途中で変更できないので、処理の途中で誤って内容を書き換えてしまう心配もなく変数より安全です。
もちろん直接sCntと40を比較しても、一向にかまいません。
●「Reset(Start)」ボタン処理の説明

「cmdReset_Click( )」はSheet1に配置された「Reset(Start)」ボタンを押したときに実行されるプロシージャです。

まずボタンが押されたら必ずすべてのカウンタをクリアし、シートのカウンタ表示をリセットしています。
ゲーム盤面もループを使って1セルずつ内容を消去して、初期状態に戻します。変数iが行位置・jが列位置を示しています。

次に地雷を30個盤面に埋める作業を行っています。これには乱数(Rnd命令)を利用していて、行位置3〜12と列位置2〜11までの適当な数を発生させるようにしています。

Rnd命令をそのまま実行してしまうと、小数点以下の数しか取り出せないので、いったん10倍または9倍したうえでInt関数を使って整数のみを取得するという方法で実現しています。
さらに発生させた乱数に+3または+2することで下限の調整を行っています。そのままでは盤面のアドレス範囲外の数まで取得してしまいますので。
また、乱数を取り出す前にRandomize命令を追加することで、同じ乱数パターンが繰り返されることを防いでいます。

最後に”GAME START”メッセージを出して、応答があればgFlgをTrueにしてゲームをスタートさせます。

Range命令を入れているのは、セルポインタを盤面外に出しておくことで、いつでもSelectionChangeイベント(次に説明)が発生するようにするためです。
●セル選択処理の説明

このSelectionChangeは、ワークシート上のセルを選択したときに発生するイベントです。ただし注意しなければいけないことは、既に選択済みのセルをそのまま再度選択してもイベントは発生しないということです。必ず新しいセルの選択が行われた時のみ反応します。

まず「On Error Goto」命令でエラートラップを行っています。これはセルを選択するとき、誤って2つ以上のセルを同時に選択してしまうことがあるためです。エラートラップを行わないと、エラーが発生した時点でプログラムが中断してしまいます。これを避けるためにエラーを感知したらいったんメッセージを表示し、「OK」で応答するとゲームが再開するようにしてあります。

次にgFlg変数をチェックし、Trueの場合のみ以下のコード(判定処理)を実行します。
判定内容は、(1)クリックされたセル番地が範囲内(ゲーム盤面)かの判断、(2)セルの中身についての判定、(3)ゲームオーバーの判定等を行っています。

地雷が埋まっていると判定した場合は、フォントの色を赤に変更し画面で確認できるようにしています。

ニアミスの判定は、クリックされたセルの上下左右、斜め四方を調べることで行います(8箇所)。探索場所に1個でも地雷が埋まっていれば、クリックされたセルに△を表示してプレイヤーに地雷が近いことを知らせます。

「Call DspCnt」はスコア計算とワークシートにカウント数を表示させるためのプロシージャを呼び出すためのコードです。
このプロシージャは、標準モジュール1に記述しています。(「標準モジュール1の説明」を参照)
●「Display」ボタン処理の説明

盤面上に埋まっている地雷すべてを、フォントカラーを赤にすることで画面上に表示しています。普段はフォントカラーを盤面の色と同じ水色にしてあるので、プレイヤーからは見えません。

最後にgFlg変数をFalseに変更することで、ゲームが続行できないようにしてあります。再びゲームを続けるためには「Reset(Start)」ボタンを押して、前のカウンタをクリアする必要があります。

以上。