【VBAリファレンス】Excel VBAでゼロから作る将棋プログラム:ロジック構築の極意と実践的コードの解説

スポンサーリンク

概要:なぜExcel VBAで将棋を作るのか

多くのプログラミング学習者が、VBAを習得する過程で「退屈な事務自動化」という壁にぶつかります。しかし、VBAは単なるデータ処理ツールではありません。配列、再帰呼び出し、イベント駆動型プログラミング、そしてオブジェクト指向の考え方までを包括的に学べる「最強の演習題材」が、実はExcelの中に眠っているのです。それが「将棋」です。
本稿では、VBA学習の第1弾として、将棋盤の表現から駒の配置、そして移動ロジックの基礎を構築する手法を解説します。このプロジェクトを通じて、単なる「動くコード」ではなく、「メンテナンス性が高く、論理的な構造を持つコード」を書くための思考プロセスを養います。

詳細解説:盤面管理とデータ構造の設計

将棋をVBAで実装する際、最も重要なのは「盤面をどう表現するか」です。初心者ほど「セルそのものを盤面として扱う」というミスを犯します。しかし、真のプロは「メモリ上の配列」を盤面とし、Excelのシートはあくまで「可視化のためのインターフェース」として分離します。

1. 盤面のデータ構造
9×9の将棋盤は、2次元配列 `board(1 To 9, 1 To 9)` で管理します。各要素には駒の種類(ID)を格納します。例えば、1は歩、2は香車といった具合です。この方式を採用することで、移動判定時に「その座標に何があるか」を瞬時に参照でき、処理速度が飛躍的に向上します。

2. 移動ロジックの抽象化
駒にはそれぞれ「動きのルール」があります。これをハードコーディングで `If` 文を羅列すると、コードはすぐに収拾がつかなくなります。ここでは、「駒のID」ごとに「移動可能範囲(相対座標)」を定義した配列を用意し、それをループで回す手法を推奨します。これにより、新しい駒を追加する際もコードの変更を最小限に抑えることが可能です。

サンプルコード:盤面初期化と駒の配置

以下のコードは、Excelシート上に9×9の盤面を描画し、初期配置をセットするプロシージャです。まずはここから始めてください。


Option Explicit

' 盤面配列の定義
Public Const BOARD_SIZE As Integer = 9
Public board(1 To BOARD_SIZE, 1 To BOARD_SIZE) As String

' 盤面の初期化と描画
Sub InitializeShogiBoard()
    Dim r As Integer, c As Integer
    
    ' 配列の初期化(空にする)
    For r = 1 To BOARD_SIZE
        For c = 1 To BOARD_SIZE
            board(r, c) = ""
        Next c
    Next r
    
    ' 初期配置のセット(簡略版:歩のみ)
    For c = 1 To BOARD_SIZE
        board(3, c) = "歩"
        board(7, c) = "と"
    Next c
    
    ' シートへの反映
    Call RenderBoard
End Sub

' シートへの描画処理
Sub RenderBoard()
    Dim r As Integer, c As Integer
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)
    
    ' 盤面のクリア
    ws.Cells.ClearContents
    
    ' 配列の内容をセルに転記
    For r = 1 To BOARD_SIZE
        For c = 1 To BOARD_SIZE
            ws.Cells(r, c).Value = board(r, c)
            ' セルのデザイン調整
            With ws.Cells(r, c)
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .ColumnWidth = 5
                .RowHeight = 30
                .Borders.LineStyle = xlContinuous
            End With
        Next c
    Next r
End Sub

実務アドバイス:コードの保守性と拡張性

VBAで複雑なアプリケーションを作る際、最も陥りやすい罠が「スパゲッティコード」です。将棋のような複雑なロジックを扱う場合、以下の3点を徹底してください。

1. データの分離(Model-View-Controller)
前述した通り、計算を行う「ロジック層」と、セルを描画する「表示層」を明確に分けてください。これにより、将来的にユーザーインターフェースをユーザーフォームに変更したとしても、ロジックコードを一切書き換える必要がなくなります。

2. 定数の活用
「3」や「9」といった数値をコード内に直接書かないでください。`Const BOARD_SIZE As Integer = 9` のように定義することで、将来的に「10×10の変則将棋を作りたい」となった際、1箇所の修正で対応可能になります。

3. デバッグ用ログの出力
将棋の移動ロジックはバグが発生しやすい箇所です。`Debug.Print` を活用し、イミディエイトウィンドウに「どの駒が、どの座標からどの座標へ移動したか」を逐次出力させる習慣をつけましょう。

まとめ:VBAエンジニアとしての成長のために

将棋プログラムの作成は、プログラミングにおける論理的思考力のトレーニングとして非常に優れています。駒の動きをコードに落とし込む作業は、業務における「複雑な業務フローを自動化する」ことと本質的に同じです。

今回紹介した基礎部分を実装できたら、次は「成りの判定」「持ち駒の管理」「合法手(王手放置の禁止)の判定」へとステップアップしてください。これらを一つずつクリアしていくことで、あなたは「VBAで書ける人」から「VBAで設計できる人」へと確実に進化します。

プログラミングは書いた量に比例して技術が向上します。まずはこのサンプルコードを打ち込み、Excel上で駒が並ぶ感動を味わってください。そこからが、真のVBA学習のスタートラインです。次回の記事では、移動判定の詳細ロジックと、イベント駆動による操作について掘り下げていきます。徹底的にコードと向き合い、技術力を研ぎ澄ませてください。

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