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

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

マクロで作ったマインスイーパーの解説 詳細編 ゲーム画面を設定する

どうもこんにちは。

 

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

今回はゲーム画面を設定する編です。

マインスイーパーのゲーム画面(下図)を設定するマクロになります。

 

では内容に入っていきましょう。

 

 

1.コードの内容

まずは、実際に記述したコードをご紹介します。

長いので一つ一つ内容を確認したい方は読み飛ばしてもらって大丈夫です。

2.各コードの解説

では上で紹介したコードについて一つずつ解説していきたいと思います。

 

これはワークシート全体をクリアするコードです。書式・値すべてクリアされます。

 

これは難易度別に異なる部分の初期設定です。

初級(e)、中級(n)、上級(h)の3つのケースに分けて処理を記述しています。

条件分岐後のそれぞれのコードの内容は以下の通りです。

・bottom_r=・・・:マス目の最下行の設定

・rightedge_c=・・・:マス目の右端列の設定

・Cells(4,9)~Cells(4,11).Value・・・:爆弾カウントの表示の初期設定
(初級=010、中級=040、上級=099)

・start_b=・・・:爆弾の初期個数の登録

 

これは各難易度で共通部分の初期設定です。

それぞれのコードの内容は以下のとおりです。

・icon_b=・・・:icon_bの値に"💣"を登録

・icon_f=・・・:icon_fの値に"🏴"を登録

・t=0:経過時間(t)の初期値(0)を登録

 

画面更新を停止するコードです。

これを記述することでマクロの処理速度が向上します。

また、マクロ実行時にすべての書式が一度に変わるように見えます。

 

オブジェクト(操作対象となるもの)のコード記述を簡略化するために使用するコードです。

これを記述することでこれ以下のコードは、

常に「Worksheets("ms").」が記述されているものと扱われます。

 

シート内のセルの書式を変更するコードです。

ゲーム画面のイメージになるようにセルの幅や背景色等の書式を変更しています。

参考までにゲーム画面のイメージを再掲します。

 

使用しているコードの処理内容は以下の通りです。

・ColumnWidth:列の幅を設定する

・RowHeight:行の高さを設定する

・Interior.ColorIndex:セルの背景色を設定する。なお、2は白色です。

・BorderAround:外枠罫線を設定する。各引数の内容は以下のとおり。

  LineStyle=罫線の種類を決定。1は実線。

  Weight=罫線の太さを決定。2は極細線。

  ColorIndex=罫線の色を決定。上ではRGBで設定したかったため省略。

  Color=罫線の色を決定。RGBで任意の色に設定可。上では灰色。

  ThemeColor=罫線の色を決定。上では省略。

・MergeCells:セルを結合する

Value:セルの値を設定する

 

マス目の外枠部分に" "を入力する処理です。
(なお、このコードではマス目部分も含めて" "が入力されますが、
後のコードでマス目部分の値をクリアするので、外枠部分にだけ残ります)

 

これは空白マスを開いたときの動作がうまく働くようにするために行っています。

空白マスを開いたときの動作では、そのマスの周囲にあるブランクマスを検索する処理を行いますが、

マス目の外枠部分に何も値が入力されていないと、外枠部分まで開く対象に加えられてしまうので、

上記処理を施して外枠部分が検索に引っかからないようにしているのです。

空白マスを開く動作を解説するときにまた詳しく説明します。

 

マス目部分の書式を設定するコードです。

With内の処理の内容は以下の通りです。

・ClearContents:セルの値をクリアする

・Borders.LineStyle:格子罫線を引く。イコールの部分で罫線の種類を決定。
上では実線(xlContinuous)

・Borders.ColorIndex:罫線の色を決定する

 

・Interior.Pattern:背景色のグラデーションを行う

・Interior.Gradient.Degree:グラデーションの角度を決定

・Interior.Gradient.ColorStops.Add(0).Color:グラデーションの第1色の色を決定

・Interior.Gradient.ColorStops.Add(1).Color:グラデーションの第2色の色を決定

⇒マス目にグラデーションカラーを施しているのは、
それがマインスイーパーのマスが隠れた状態のデザインに近しかったからです。

・HorizontalAlignment:中央ぞろえにする(行方向)

⇒マスに配置される爆弾や数字などの表示位置の調整のためです。

・Font.Size:フォントの大きさを決定

・Font.Bold:フォントを太字にする

・NumberFormatLocal:セルの値の表示形式を決定する

⇒表示形式を";;;"にすると、そのセルに値を入力しても画面上その値が見えない状態になります。

なので、各マスの値に爆弾や数字が入力されたとしても、

上記表示形式にしておけば画面上は見えません。

マインスイーパーを再現するのに適切かと思いましたのでこれを採用しました。

なお、注意点は画面上見えなくても、そのセルを選択状態にすると入力されている値が数式バー上に表示されてしまうことです。

そのため、ネタバレ防止のためにマス目のセルを選択できないようにする処理が必要になります。

 

マス目以外の部分の書式を設定するコードです。

処理内容は上で触れたものと同じですのでここでは割愛します。

なお、オブジェクトの指定にあたり"Union"というコードを使用しています。

これを使えば複数の独立したセル範囲を指定することが可能です。

 

シートの表示倍率を変更するコードです。

ゲーム画面を見やすいサイズにするための処理です。
(40%は私のPCにとって見やすいサイズであり、使用環境によってサイズは異なるかもしれません)

 

先ほどマス目の表示形式の設定のところで触れた、ネタバレ防止のための処理です。

この処理を施すと選択状態にできるセル範囲をA1に限定することが可能です。

 

画面更新を再開するコードです。

上で触れた画面更新停止と対になるコードです。

 

以上、長くなりましたがコード解説を終わります。

 

3.マインスイーパー再現に重要なコード

ここでは上記で解説したコードの中でも、マインスイーパーを再現するために特に重要と考えられるコードは何かをまとめます。

ここさえ押さえておけばOKというポイントのまとめです。

マインスイーパーの挙動別にコードを紹介していきたいと思います。

 

・爆弾や数字を見えない状態にする

⇒「NumberFormatLocal = ";;;"」を設定する!

マス目部分の書式設定で紹介していますので詳細はそちらをどうぞ)

⇒マス目が選択されないようにスクロールエリアを限定する!
 「Worksheets("").ScrollArea = XXX」

 

・空白マスを開いたとき周囲にある空白マスをすべて開く

⇒この挙動を再現するために下準備として、外枠部分に" "を入力する!
 「Range(XXX).Value = " "」

 

長々と解説してきましたが、初期設定の中で特に重要なものは上記のみです。

正直、他のコードは適当でOKだと思います。

 

4.おわりに

今回はゲーム画面を設定するコードについて解説しました。

書式設定がほとんどですので、処理内容自体は単純でわかりやすいものが多かったかと思います。

 

次回はマス目に爆弾を設置するコードについて解説したいと思います。

ではまた。