概要:なぜ今、VBAでオセロを作るのか
Excel VBAを習得する道のりにおいて、多くの学習者は「単なるデータの集計」や「帳票出力」の自動化で止まってしまいます。しかし、真のプログラミング思考を養うためには、「状態の変化を管理する」というロジックが必要不可欠です。本連載では、誰もが知るボードゲーム「オセロ」を題材に、VBAでゲームエンジンを構築する方法を解説します。
オセロは、8×8のグリッドという「二次元配列」と、「相手の石を挟む」という「探索アルゴリズム」の組み合わせで構成されています。これらを学ぶことは、業務システムにおける複雑なデータ照合や、動的な範囲操作のスキルを飛躍的に向上させることに直結します。単なる遊びではなく、高度なロジック設計の訓練として、オセロ開発に挑戦しましょう。
詳細解説:盤面の表現とオブジェクトの配置
オセロの盤面をExcelで表現する際、最も直感的なのは「セル」をマス目として利用することです。しかし、セルの背景色を直接変更するだけでは、プログラムの処理速度が低下したり、誤操作によるレイアウト崩れのリスクが生じます。
まず、盤面の状態を管理するための「論理盤面」と、画面に表示する「物理盤面」を分けて考える必要があります。具体的には、メモリ上で二次元配列を定義し、そこに「0:空、1:黒、2:白」という数値を格納します。そして、この配列の状態を監視し、変化があった時だけセルを再描画する「イベント駆動型」の設計を目指します。
VBAにおいて重要なのは、Worksheet_SelectionChangeイベントの活用です。ユーザーがセルをクリックした瞬間、その座標を特定し、ゲームロジックへ値を渡す。この流れを構築することで、Excelが単なる表計算ソフトから、インタラクティブなアプリケーションへと変貌を遂げます。
サンプルコード:盤面の初期化とクリックイベントの実装
まずは、8×8の盤面を描画し、初期配置(中央の4マス)を行うための基礎コードを紹介します。以下のコードを標準モジュールとシートモジュールに分けて記述してください。
' 標準モジュール:ゲームの初期化ロジック
Public GameBoard(1 To 8, 1 To 8) As Integer
Sub InitializeGame()
Dim i As Integer, j As Integer
' 盤面のクリア
Cells.Clear
Range("A1:H8").RowHeight = 40
Range("A1:H8").ColumnWidth = 8
' 配列とセルの初期化
For i = 1 To 8
For j = 1 To 8
GameBoard(i, j) = 0
With Cells(i, j)
.Borders.LineStyle = xlContinuous
.Interior.Color = RGB(0, 128, 0)
End With
Next j
Next i
' 初期配置
PlaceDisk 4, 4, 1: PlaceDisk 5, 5, 1
PlaceDisk 4, 5, 2: PlaceDisk 5, 4, 2
End Sub
Sub PlaceDisk(r As Integer, c As Integer, color As Integer)
GameBoard(r, c) = color
With Cells(r, c)
.Interior.Color = IIf(color = 1, vbBlack, vbWhite)
.Shape = xlCircle ' 簡易的に円形表現は図形挿入が必要
End With
End Sub
' シートモジュール:クリックイベント
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 8 Or Target.Column > 8 Then Exit Sub
' ここに石を置く処理を呼び出す
MsgBox "選択された位置: " & Target.Row & ", " & Target.Column
End Sub
実務アドバイス:拡張性とメンテナンス性を高めるために
実務でマクロを組む際、多くの開発者が陥る罠が「コードのハードコーディング」です。例えば、盤面のサイズを「8」と直接書かずに、定数(Const)として定義しておくことが重要です。将来的に「リバーシ」のようなボードサイズの変更を求められた際、定数を書き換えるだけで対応できる設計にしておくべきです。
また、エラーハンドリングについても意識してください。ユーザーが盤面外をクリックしたり、既に石がある場所をクリックしたりするケースは必ず発生します。これらの「例外」をいかにスマートに処理するか(On Error GoToやIf文でのバリデーション)は、業務システムの安定性に直結します。
さらに、パフォーマンス向上のためのヒントとして、`Application.ScreenUpdating = False`を適切に使いましょう。石を置くたびに画面更新を行うと、PCの負荷が高まります。一連の計算が終わった後に一度だけ画面を更新する癖をつけることで、VBAプログラムの挙動は劇的に軽快になります。
まとめ:次ステップへの展望
今回の№1では、盤面の定義と初期化という、ゲーム開発における「土台」について解説しました。オセロの面白さは、ここから先にある「石がひっくり返るアルゴリズム」にあります。
次回以降の連載では、以下のステップを予定しています。
1. 特定の方向に石を探索し、挟めるかを判定するロジック
2. 実際に石をひっくり返す再帰的な処理
3. ターン制の管理とパス判定
4. コンピュータ(AI)の思考ルーチン実装
オセロ制作を通じて学ぶことは、単なるゲーム作りではありません。複雑なビジネス要件を小さな単位に分解し、それをプログラムとして組み上げる「エンジニアリングの本質」です。ぜひ、今回のコードを自分のPCで動かし、セルに色が付く感動を味わってください。そして、次のステップへ進む準備を整えておきましょう。VBAの可能性は、あなたの工夫次第で無限に広がります。
