概要:なぜ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学習のスタートラインです。次回の記事では、移動判定の詳細ロジックと、イベント駆動による操作について掘り下げていきます。徹底的にコードと向き合い、技術力を研ぎ澄ませてください。
