TsudaMay-2014概要コンソールで動作する簡易なマインスイーパー(下図は実行画面)をC++で書いたので、簡単に説明する。本稿で解説するマインスイーパーのソースコードは以下から取得できる。自由に改変して再配布してOKだぞ。その中に10個の爆弾が潜んでいる。プレイヤーのミッションはそれらの爆弾を全て見つけることだ。指定して開けることができる。そこに爆弾があるとゲームオーバーだ。爆弾が無い場合は、そのマス目の周り(8近傍)にある爆弾の数が表示される。その数字を頼りに爆弾以外のマスを全て開けることに成功すると、ゲームクリアとなるぞ。画面説明マインスイーパーをやったことある人であれば、スクリーンショットを見れば意味がわかると思うが、念の為に説明しておく。マス目が隠れている状態を表す。これが表示されたらゲームオーバーだ。オープンされたマス目で、周りに爆弾がひとつも無いことを表す。オープンされたマス目で、数値は周りのマス目の爆弾数を表す。定数ソースコードには数値を直接書くのはなるべく避けなくてはいけない。ソースを読むときに、数値の意味が分からないことがあるし、後で変更したいときにどこを変えていいかわからず、保守性に問題があるからだ。変更したい時は全置換すればいいと思うかもしれないが、同じ数字が使ってあると、そううまくはいかない。本プログラムで定義した定数は以上の3つだけだ。盤面に隠れている爆弾数、盤面の縦横サイズだ。本プログラムでは盤面のデータ構造に2次元配列を採用することにした。必要な情報は、各マス目に爆弾があるかどうか、そのマス目の周りにいくつ爆弾があるか。そのマスが開かれているかどうかだ。型のグローバルな2次元配列で表現している。していることに注意してほしい。これは、境界チェックを省くために、上下左右にそれぞれ1マス余計に確保しているのだ。このように実際に表示される部分より余分にデータを確保するテクニックはとてもよく使う。マスターして使えるようになって欲しいテクニックのひとつだ。盤面初期化を行う関数だ。全範囲について、全てのマス目を閉じた状態、爆弾は無し、周りの爆弾数は0に設定する。ソースコードは下記のようになる。等の盤面外の部分については必ずしも初期化する必要は無いのだが、ものはついでなので初期化している。変更するとよいだろう。初期化されるので、この処理は不要ではないかと思う人もいるかもしれないが、ゲームは何回も行うものなので、2回目の時は1回目のデータを消すために初期化が必須である。爆弾を盤面に配置する処理を行う。}設置する爆弾の個数分だけ、for文で回す。範囲の乱数を発生させる。