【VBAリファレンス】VBAで学ぶプログラミングの真髄:オセロ開発から紐解く配列とアルゴリズムの実践

スポンサーリンク

概要:オセロ開発がプログラミング能力を飛躍させる理由

VBAを習得する際、多くの学習者は「セルへの読み書き」や「単純なループ処理」で足踏みをしてしまいます。しかし、真のプロフェッショナルを目指すのであれば、メモリ上のデータを自在に操る「データ構造」と、論理を組み立てる「アルゴリズム」の理解が不可欠です。本シリーズ第3弾となる今回は、オセロというゲームを通じて、二次元配列の活用、石を裏返す判定ロジック、そしてイベント駆動型プログラミングの神髄を解説します。なぜオセロなのか?それは、盤面という二次元空間の中で、周囲8方向を走査するという「動的な探索処理」が必要だからです。この処理をマスターすれば、データ分析業務における複雑な抽出ロジックも、いとも簡単に書けるようになるはずです。

詳細解説:盤面管理と探索ロジックの設計思想

オセロの盤面は8×8のマス目で構成されています。これをExcelのセルだけで管理しようとすると、計算速度が極端に遅くなり、コードも煩雑になります。プロの現場では、必ず「メモリ上の配列」を主軸に置き、画面(セル)への出力を最小限に抑える設計を行います。

今回の核心は「8方向探索」です。ある座標(r, c)に石を置いたとき、上下左右、および斜め方向に相手の石が連続して存在し、その先に自分の石があるかどうかを判定します。この処理を「再帰」や「ループ」を用いていかに効率よく記述するかが鍵となります。

判定のアルゴリズムは以下のステップを踏みます。
1. 現在の盤面状態(配列)のコピーを作成する。
2. 石を置こうとする地点から、8方向それぞれに対してベクトル(Δr, Δc)を定義する。
3. 相手の石が続く限り探索を継続し、最後に自分の石が出現すれば「挟んだ」とみなす。
4. 挟んだ石を反転させるフラグを立て、最終的に配列を更新する。

このロジックを実装することで、単なる「マクロの記録」から卒業し、本格的なシステム開発の基礎体力を養うことができます。

サンプルコード:石を裏返すコアロジック

以下に、オセロの中核となる「石を裏返す処理」の一部を抜粋したコードを紹介します。このコードは、二次元配列「Board(1 to 8, 1 to 8)」を操作する想定です。


' 8方向のベクトル定義
Dim dr As Variant, dc As Variant
dr = Array(-1, -1, -1, 0, 0, 1, 1, 1)
dc = Array(-1, 0, 1, -1, 1, -1, 0, 1)

' 指定した座標(r, c)から探索
Public Sub FlipStones(ByVal r As Integer, ByVal c As Integer, ByVal myColor As Integer)
    Dim i As Integer, j As Integer
    Dim nr As Integer, nc As Integer
    Dim flipList As Collection
    Set flipList = New Collection
    
    Dim opponent As Integer
    opponent = IIf(myColor = 1, 2, 1)
    
    ' 8方向を順次チェック
    For i = LBound(dr) To UBound(dr)
        Dim tempList As Collection
        Set tempList = New Collection
        nr = r + dr(i)
        nc = c + dc(i)
        
        ' 相手の石が続く間ループ
        Do While nr >= 1 And nr <= 8 And nc >= 1 And nc <= 8
            If Board(nr, nc) = opponent Then
                tempList.Add Array(nr, nc)
            ElseIf Board(nr, nc) = myColor Then
                ' 自分の石があれば挟んだと判断、リストを確定させる
                If tempList.Count > 0 Then
                    Dim item As Variant
                    For Each item In tempList
                        Board(item(0), item(1)) = myColor
                    Next item
                End If
                Exit Do
            Else
                ' 空白なら挟めない
                Exit Do
            End If
            nr = nr + dr(i)
            nc = nc + dc(i)
        Loop
    Next i
    
    ' 最後に置いた石を反映
    Board(r, c) = myColor
End Sub

実務アドバイス:なぜこのロジックが実務に直結するのか

このオセロのコードを見て、「ゲームを作らないから関係ない」と思った方は、非常に勿体ないことをしています。実務の現場では、以下のような場面でこのロジックの応用が求められます。

・「取引先A社から始まって、複数の下請けを経由し、最終的に自社に納品される流れ」の追跡。
・「特定の条件を満たすまで、複雑な階層構造を持つデータを辿る(再帰探索)」必要がある業務フローの自動化。
・膨大な行数を持つExcelファイルから、特定のパターンを持つ連続データを抽出し、一括置換を行う処理。

特に「8方向探索」は、グラフ理論におけるノードの探索や、ネットワーク経路分析の基本そのものです。オセロという極めて論理的なゲームを題材にすることで、条件分岐(If文)の入れ子構造を整理する能力が養われ、結果として「メンテナンス性の高いコード」を書くための視点が身につきます。また、変数のスコープを意識したモジュール設計は、大規模なVBAプロジェクトを開発する際の必須スキルです。

まとめ:VBAを「魔法」から「科学」へ

VBAを単なる「手作業を減らす道具」として使う段階から、「業務を効率化するシステムを設計する技術」へ昇華させる。これが、本シリーズを通じて読者の皆さんに伝えたかったことです。オセロというフレームワークの中で、配列を操作し、盤面を更新し、勝敗を判定する。この一連のプロセスは、小規模なデータ処理ツールから、企業内の基幹システム連携に至るまで、あらゆるプログラミング業務の原型となります。

今回の学習で最も重要なのは、「コードを写経すること」ではなく、「なぜそのアルゴリズムを選択したのか」を自分自身に問いかけることです。例えば、なぜCollectionオブジェクトを使用したのか?なぜ二次元配列を用いたのか?その「選択理由(意図)」こそが、あなたのエンジニアとしての価値を決定づけます。

次回以降は、この盤面をGUIとしてExcelシート上に描画する方法や、コンピュータの思考ルーチン(AI)の実装について深く掘り下げていきます。VBAの可能性は、あなたが想像しているよりも遥かに広大です。このオセロ開発を通じて、ぜひその広大な世界への切符を手にしてください。プログラミングの楽しさは、論理が現実のデータとして形を成した瞬間にこそあります。さあ、次はあなたの番です。このコードをベースに、自分なりの改良を加え、世界に一つだけのオセロを完成させてください。それが、プロフェッショナルへの第一歩となります。

タイトルとURLをコピーしました