VBAサンプル集オセロを作りながらマクロVBAを学ぼう№3
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第3回です。いよいよ自分の石を置いて、相手の石をひっくり返す処理に進むのですが、その前に、そもそも自分の石を置ける場所はどこなのか…。クリックしたセルは、自分の石を置いて良いセルなのかの判定が必要です。
では、マクロVBAで実現するには・・・ まずは、上記の8方向に進むにはどうすれば良いかになります。 セルの記述は、Cells(i, j)として、 上方向には、 1つ上は、Cells(i - 1, j) 2つ上は、Cells(i - 2, j) ・・・ つまり、行を1ずつ減らし、列は変えないことになります。 右上方向には、 1つ右上は、Cells(i - 1, j + 1) 2つ上は、Cells(i - 2, j + 2) ・・・ つまり、行を1ずつ減らし、列は1ずつ増やすことになります。ことになります。
行列数の増減を表にまとめると、 方向 行 列 上 -1 0 右上 -1 +1 右 0 +1 右下 +1 +1 下 +1 0 左下 +1 -1 左 0 -1 左上 -1 -1整理すると、 行は、-1,0,+1 列は、-1,0,+1 この3通りの組み合わせになっています。 つまり、 For i = -1 To 1 For j = -1 To 1 この組み合わせで良いことになります。 この組み合わせは、For~Nextをネストすれば良いことになります。
For i = -1 To 1 For j = -1 To 1 'ここで相手の石を挟めるかの判定をします。 Next Nexti=0,j=0の時は移動しないので無視して問題ありません。 これで、8方向ができましたので、 次は相手の石を挟めるかの判定になります。
1方向に向かって次々に置かれている石を判定していくことになりますが、終端が必要です。 判定の終了条件は、 ・空白(石が置かれていない) ・自分の石が置かれている 空白があれば、連続が途切れたということ (盤面の四方には、空白セル(茶色の部分)があるので盤面を超えません。) つまり、空白で終了した場合は、相手の石を挟んでいないということ、 つまり、自分の石が出てくることが必要条件です。 そして、それまでに相手の石があれば、相手の石を挟んでいるということになります。 8方向のいずれか一つの方向だけでも相手石を挟めれば、そこに自分の石を置ける。
自分の石を置ける場所の判定の整理・判定セルから、8方向に検査を進める ・8方向は、 For i = -1 To 1 For j = -1 To 1 これをネストする ・1方向に向かって順に置かれている石を判定 終了条件は、 ・空白(石が置かれていない) ・自分の石が置かれている 自分の石が置かれていて終了した時、それまでに相手の石があるか ・8方向のいずれか一つでも、上記条件を満たせば、自分の石が置ける
№4へ続きます。 全体の目次 はじめに №1.シートの用意と標準モジュールの挿入 №2.ブックを開いたときの処理と初期配置 №3.自分の石を置ける場所の判定の整理 №4.自分の石を置ける場所の判定の実装 №5.シート機能を拡張して今後の準備 №6.黒石白石を交互に打って相手の石をひっくり返す №7.パス確認、終局確認、石数取得マクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第7回です。前回までで、黒石白石を交互に打つことができるようになりましたが、まだまた不都合な点があります。石を打つ場所がない時に、パスが出来ないから先に進まない… 全部石が埋まっても、何も変化がない… そもそも、どっちが勝っているのかもわからない……
№8.石を置ける場所の表示とアニメーション №9.PC対戦の実装 №10.置く場所に重みを付けて少しだけ強く №11.相手の応手を評価してさらに強く №12.PC対PCの対戦で強さを確認 №13.パラメーターと重みを調整してさらに強く №14.やはり「待った」が欲しい №15.棋譜で対局を再現 №16.これまでを振り返りつつ全体のまとめ 新着記事 NEW ・・・新着記事一覧を見る アクセスランキング ・・・ ランキング一覧を見る このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。 掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。 本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。 This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.