マクロで作ったマインスイーパーの解説 詳細編 経過時間をカウントする
どうもこんにちは。
今回もマクロで作ったマインスイーパーのコード解説をしていきます。
どんな感じのマインスイーパーになっているかはこちらからご覧ください。
programminghajimetemita.hatenablog.com
今回は経過時間をカウントするマクロについて解説します。
では早速内容に入ります。
1.コードの内容
まずはコード全体の内容についてご紹介します。
2.マインスイーパーの挙動
言うまでもないかもしれませんが、経過時間のカウントに関してのマインスイーパーの挙動は以下のとおりです。
・ゲーム開始時から1秒ずつ時間をカウントする
なお、マインスイーパーのマクロの仕様上、経過時間を表示する部分は一桁ずつセルが異なっています。
参考までにゲーム画面を載せておきます。
右上の赤字が経過時間であり、"026"とあるのはそれぞれの数字が別々のセルに入力されているということです。
そのため、単に、経過時間をカウントしそれを表示するのではなく、
カウントした時間を一桁ずつ別々のセルに表示する必要があります。
上記はマインスイーパ
ーの挙動ではありませんが、
この仕様を踏まえてコード設計を行う必要がある点、留意が必要です。
ではコードの内容解説に入ります。
3.コードの内容解説
変数tに1を加算する処理です。1秒ごとにこの処理を行うことで、変数tが経過時間を表すようになります。
なお、1秒ごとに1加算する処理は以下のコードで行っています。
Application.Waitのコードではマクロの実行を指定秒数中断することができます。
ここで記述した処理を実行すると、マクロの実行を1秒間中断することになります。
その後、Callで"cnt_time"を呼び出しています。
これにより"t=t+1"の処理を含む、経過時間をカウントするマクロを実行することができます。
上記2つのコードはDo~Loopに挟まれていますので、
一定の終了条件を満たすまで上記2つのコードの実行が繰り返されることになります。
つまり、一秒中断⇒時間カウント⇒一秒中断⇒時間カウント・・・と繰り返されることになり、
ゲーム開始後から経過時間を一秒ずつカウントする挙動を実現できるわけです。
以上で変数tが経過時間を表すようになります。
後はカウントした経過時間をそれぞれのセルにどうやって表示させるかです。
経過時間の一番右の桁(一の位)を表示させる処理です。
一の位は、常に、変数tの右から一番目の数字であるため、
Right関数を利用することで簡単に取得することが可能です。
経過時間が2桁数字(10~99)のときの真ん中の桁(十の位)を表示させる処理です。
経過時間が2桁のとき、十の位は変数tの左から一番目の数字になるため、
Left関数を利用して十の位を取得しています。
経過時間が3桁数字(100~999)のときの真ん中の桁(十の位)と一番左の桁(百の位)を表示させる処理です。
二行目のコードが十の位を表示させる処理です。
経過時間が3桁のとき、十の位は変数tの真ん中に位置するため、
Mid関数を利用して十の位を取得しています。
三行目のコードが百の位を表示させる処理です。
経過時間が3桁のとき、百の位は変数tの左から一番目の数字になるため、
Left関数を利用して取得しています。
経過時間が4桁以上(999~)になるときの真ん中の桁(十の位)と一番左の桁(百の位)を表示させる処理です。
考え方はこれまでと同じで変数tの桁数から十の位や百の位が何番目に位置するかを考えて、
その位置にある数字を関数で取得してきています。
なお、厳密には経過時間が5桁になるとき、6桁になるとき、と場合分けする必要がありますが、
マインスイーパーを一問解くのにそこまで時間はかからないだろうと考えて、
それらの場合分けは省略しています。
以上で経過時間をカウントするマクロのコード解説を終わります。
4.特に重要なコード
3.で解説したコードのうち、特に重要と考えるコードについて振り返りたいと思います。
経過時間をカウントするマクロで肝になるのは、"1秒ずつ時間をカウントする"部分です。
これを実行するコードは以下のとおりです。
繰返処理(Do~Loop)とマクロ中断(Application.Wait)と組み合わせて時間をカウントするマクロを実行することで、
一秒待機⇒時間カウント(t=t+1)⇒一秒待機⇒時間カウント・・・
というように処理させることができ、経過時間をカウントすることが可能になります。
5.おわりに
今回は経過時間をカウントするマクロについて解説しました。
次回は爆弾の残個数をカウントするマクロについて解説しようと思います。
ではまた。