文系人間がプログラミングをはじめてみた。

プログラミング初心者のゼロからの勉強記録。

マクロで作ったマインスイーパーの解説 詳細編 爆弾を設置する

どうもこんばんは。

 

今回もマクロで作ったマインスイーパーの解説をしていきます。

どんな感じのマインスイーパーになっているかはこちらからご確認ください。

programminghajimetemita.hatenablog.com

 

今回は爆弾を設置する処理について解説していきたいと思います。

 

 

1.コードの内容

まずは爆弾を設置するマクロのコードをご紹介します。


このコードの中であらかじめ定義しておいた変数・定数が出てきています。

その内容について以下に記載しておきます。

■ 変数

r:行番号を表す変数

c:列番号を表す変数

bottom_r:マス目の一番下の行の行番号(難易度に応じて変化)

rightedge_c:マス目の一番右の列の列番号(難易度に応じて変化)

icon_b:爆弾マーク(💣)を表す変数
(コード上で爆弾マークを記載すると文字化けするのでセルの値を参照するようにしています)

cnt:マス目内にある爆弾の個数をカウントするための変数

start_b:爆弾の初期個数(難易度に応じて変化)

■ 定数

top_r:マス目の一番上の行の行番号

leftedge_c:マス目の一番左の列の列番号

 

2.マインスイーパーの挙動

コードの解説に入る前にマインスイーパーの挙動について触れておきます。

 

コードを一から考えるうえでは、実現したい動きを頭に入れておくことが非常に重要と私は思いますので、

少し冗長かもしれませんが触れておきたいと思います。

 

爆弾の設置に関するマインスイーパーの挙動です。

私がコードを考えたとき、以下のような特徴があると考えました。

 

・ゲーム画面のマス目内のランダムな位置に、規定個数の爆弾が設置される

・ゲームごとに爆弾の設置位置が変わる

 

上記を踏まえると、以下のような条件が必要と考えることができます

 

・マス目内のランダムな位置を取得する

・規定個数の爆弾を設置する

・設置位置は常にランダムである

 

これを念頭においてコードの内容に入っていきましょう。

 

3.コードの内容解説

では上記コードについて一つずつ解説していきます。

ゲーム画面設定時にも出てきた、画面更新停止のコードです。

これを入れておくことでマクロの処理速度を上げることができます。

 

なお、下の行で出てくる以下のコードは上記と逆で画面更新を再開するコードになります。

これを入れることでマクロで処理した結果が画面に反映されます。

 

繰返処理を行うためのコードです。

DoとLoopに挟まれたコードが、Untilの右隣に記載されている終了条件を満たすまで、

繰り返し行われます。

 

繰返処理の内容は以下で細かく解説しますが、

やっていることは、マス目内のランダムな位置に爆弾を設置する処理です。

 

また、終了条件はマス目内に設置された爆弾の個数が爆弾の初期個数に等しくなることになります。

 

総括すると、この繰返処理では、

爆弾の初期個数分、爆弾がマス目内に設置されるまで、

マス目内のランダムな位置に爆弾を設置する処理を繰り返す

という処理をやっていることになります。

 

これは乱数を初期化するために入れているコードになります。

上記コード以下の行で、マス目内のランダムな位置を設定するため、

Rnd関数を使用しています。

Rnd関数はあらかじめ定められた乱数テーブルにしたがい乱数を返すらしいので、

上記コードを使って乱数テーブルを初期化することで、

常にランダムな数値を設定できるようにしています。

 

長々と書きましたが、Rnd関数で返される数値が一定のパターンにはまらないようにするために必要ということです。

 

これはマス目内のランダムな位置(セル番地)を設定するために行っている処理です。

例えば、難易度上級であればマス目内で取りうる行番号・列番号はそれぞれ以下のとおりになります。

行番号:9~24

列番号:9~38

 

上記コードではRnd関数を使うことによって、

取りうる行・列番号のうちのいずれかの数字を取得しています。

(上記例でいえば行番号は9~24のいずれか、列番号は9~38のいずれか)

 

マス目に爆弾を設置する処理です。

まず、先ほどRnd関数を使って設定した、マス目内のランダムな位置が空白であるかを確認します。

空白であるならば、その位置の値を爆弾マークにします。

 

Rnd関数で設定した位置が空白か、という条件は入れなくても問題ないと思いますが、

入れないと、すでに爆弾マーク設置した位置に、再度爆弾マークを設置するケースが出てきますので、

繰返処理の回数が多くなる可能性があると思います。

そんなわけで、処理回数を極力減らすためにも上記条件を入れてます。

 

マス目内に設置された爆弾の個数をカウントするコードです。

COUNTIF関数を使って爆弾の個数をカウントしています。

 

Excelで通常使用するような関数(SUMとかVLOOKUPとか)もマクロ内で使用することができます。

使用するには、"WorksheetFunction"というコードを記載すればOKです。

記載すると使用できる関数のリストが表示されますのでそこから選べばよいです。

(もちろん直接手で記載しても問題ありません)

 

以上で爆弾を設置するマクロのコード解説を終わります。

 

4.特に重要なコード

これまで解説してきたコードの中で、マインスイーパーの挙動を実現するために、

特に重要なコードについて、繰り返しになりますが触れておきたいと思います。

 

2.で触れた必要条件別にコードを紹介します。

 

・マス目内のランダムな位置を取得する

Rnd関数を使って、マス目内の取りうる行・列番号をランダムに生成しています。

 

・規定個数の爆弾を設置する

繰返処理Do~Loopを使い、終了条件を「マス目内の爆弾数=規定個数」とすることで、

規定個数の爆弾が設置されるまで爆弾を設置する処理を繰り返し行っています。

 

・設置位置は常にランダムである

Randomizeで乱数テーブルを初期化することで、

Rnd関数で生成される乱数が一定のパターンにならないようにしています。

そうすることで、Rnd関数を使って設定する行・列番号が常にランダムになるようになっています。

 

5.おわりに

今回は爆弾を設置するマクロのコードについて解説しました。

次回は数字を設置するマクロについて解説したいと思います。

ではまた。