概要
Excel VBAを用いて「将棋」という複雑なボードゲームを実装する際、最も頭を悩ませるのが「駒の移動ロジック」です。駒にはそれぞれ固有の利き(移動可能範囲)があり、さらに盤上の他の駒との位置関係や、自分のターンであるかといった判定も必要になります。本稿では、Excelのセルを盤面に見立て、VBAの配列と条件分岐を駆使して「駒を動かす」という核心部分を徹底的に解説します。単に駒を移動させるだけでなく、将棋のルールに基づいた「合法手」の判定に至るまでの設計思想を学び、あなたのExcelゲーム開発スキルを一段階引き上げましょう。
詳細解説
Excelで将棋を実装する場合、一般的に81個のセルを将棋盤と見なします。しかし、単にセルの値を書き換えるだけでは不十分です。プログラミングの視点では、「盤面状態の保持(データモデル)」「移動可能範囲の計算(ルールエンジン)」「画面の描画(ビュー)」の3層を分離することが極めて重要です。
駒の移動を実現するためには、以下のステップを踏む必要があります。
1. 選択した駒の情報を取得する:クリックされたセルがどの駒で、どちら側の陣営かを確認します。
2. 駒ごとの移動ルールを定義する:歩兵なら前へ1マス、飛車なら縦横に障害物まで、といったロジックを配列や定数で管理します。
3. 障害物チェック:移動先に自駒があるか、敵駒があるか、あるいは盤外かを判定します。
4. 移動の確定と盤面更新:移動が許可された場合、データ配列を更新し、セルの背景色や駒の文字を再描画します。
特に重要なのが「相対座標」の考え方です。盤面を9×9の二次元配列(または1次元の81要素配列)として捉え、現在の位置から「どの方向にいくつ進めるか」をベクトル(dx, dy)として定義することで、コードの重複を劇的に減らすことができます。
サンプルコード
以下は、飛車(Rook)の動きを想定した、移動可能か判定するロジックの一部です。
' 飛車の移動可能判定(簡略版)
' curRow: 現在の行, curCol: 現在の列, targetRow: 目的地の行, targetCol: 目的地の列
' board(): 盤面データ(0:空, 1:自駒, -1:敵駒)
Function IsValidMoveHisha(curRow As Integer, curCol As Integer, targetRow As Integer, targetCol As Integer, board() As Integer) As Boolean
Dim dRow As Integer, dCol As Integer
Dim i As Integer
' 縦または横の移動でなければならない
If curRow <> targetRow And curCol <> targetCol Then
IsValidMoveHisha = False
Exit Function
End If
' 方向を算出
dRow = Sgn(targetRow - curRow)
dCol = Sgn(targetCol - curCol)
' 途中経路に駒がないかチェック
Dim r As Integer, c As Integer
r = curRow + dRow
c = curCol + dCol
Do While r <> targetRow Or c <> targetCol
If board(r, c) <> 0 Then
IsValidMoveHisha = False ' 途中に駒がある
Exit Function
End If
r = r + dRow
c = c + dCol
Loop
' 最終目的地に自駒がなければ移動可能
If board(targetRow, targetCol) = 1 Then
IsValidMoveHisha = False
Else
IsValidMoveHisha = True
End If
End Function
このコードでは、`Sgn`関数を使用して移動方向を正規化しています。これにより、飛車のどの方向への移動も同じロジックで判定可能になります。
実務アドバイス
実務でVBAを使う場合、ゲーム開発で培う「オブジェクト指向的な考え方」が非常に役立ちます。
まず、駒を「クラス」として実装することを推奨します。`clsPiece`クラスを作成し、`MoveRule`というメソッドを持たせることで、飛車や角、歩などの各駒が自身のルールを保持できるようになります。これにより、メインのプロシージャは「駒.CanMoveTo(ターゲット)」と呼び出すだけで済み、コードの保守性が飛躍的に向上します。
また、Excelの「Worksheet_SelectionChange」イベントを使用する場合、クリックのたびに重い再描画が走らないよう注意が必要です。`Application.ScreenUpdating = False`を適切に活用し、描画処理を最小限に抑えることが、サクサクとした操作感を生む秘訣です。
さらに、将棋には「二歩」や「打ち歩詰め」といった特殊なルールが存在します。これらは移動ロジックとは別に「判定関数」を用意し、移動を確定させる直前に呼び出す「バリデーター」として実装するのが鉄則です。複雑なルールほど、メイン処理から切り離して独立させることが、デバッグを容易にするコツです。
まとめ
Excel VBAによる将棋開発は、プログラミングの基礎から応用までを網羅する素晴らしい学習プロジェクトです。駒を動かすという一見単純な動作の裏には、配列の操作、再帰的な探索、条件分岐の最適化といった、エンジニアとして不可欠なスキルが詰まっています。
今回紹介した「相対座標による移動判定」と「移動経路のチェック」は、他のボードゲーム開発においてもそのまま応用が効く考え方です。まずは飛車のような単純な直線移動から実装し、徐々に桂馬のような飛び越しが必要な駒へと拡張していくのが、挫折しないための近道です。
VBAは古くからある言語ですが、ロジックを組む力は現代のどの言語でも通用します。Excelという身近な環境を最高のラボとして、ぜひ自分だけの将棋システムを完成させてください。複雑な仕様を一つずつクリアした先には、開発者としての大きな成長が待っています。次回のステップでは、これに「AI(コンピュータ思考)」を組み込むためのアルゴリズムを解説していく予定です。挑戦を続けてください。
