〜盤面・駒・成り・持ち駒・二歩まで全部VBA〜
Excelで将棋を作りました。
ネタではなく、ガチで対局できる将棋です。
9×9の盤面
全駒種の移動ルール
飛び駒の障害物判定
成り(強制成りあり)
持ち駒
二歩判定
勝敗判定(王を取ったら終了)
すべて Excel + VBAだけ で実装しています。
なぜExcelで将棋?
Excelは単なる表計算ではなく、
セル = 座標系
Shapes = スプライト
Worksheet_SelectionChange = 入力イベント
VBA = ゲームロジック
という構成を持つ GUIアプリ実行環境です。
これ、ゲームエンジンと同じです。
なら将棋くらい作れるだろう、という発想から始めました。
システム構成
構成はMVC的に分離しています。
役割 実装
Model(盤面・ルール) modMain
Controller(入力) UIシート
View(描画) Shapes+セル
設定画面 UserForm
盤面と状態管理
Public Board(1 To 9, 1 To 9) As Integer
Public Hand(1 To 2, 1 To 7) As Integer
Public CurrentTurn As Integer
正の値 = 先手、負の値 = 後手
成駒は +100 で区別しています(例:歩=1、と=101)
駒の描画
セルに文字を書いているのではなく、
Shape(TextBox) で駒を描画しています。
Set shp = ws.Shapes.AddTextbox(...)
shp.TextFrame2.TextRange.Text = GetPieceName(p)
If p < 0 Then shp.Rotation = 180
後手は180度回転、成駒は赤文字。
Excelがそのまま2Dスプライトエンジンになります。
駒の移動ルール
全駒種の動きを IsLegalMove() で判定しています。
例:歩・桂・銀・金・飛・角・成駒などをすべて分岐。
Case FU
If diffX = 0 And diffY = fwd Then IsLegalMove = True
Case KA
If absX = absY Then IsLegalMove = IsPathClear(...)
Case HI
If diffX = 0 Or diffY = 0 Then IsLegalMove = IsPathClear(...)
飛び駒は IsPathClear() で途中の駒をチェック。
成り判定
ゾーン侵入で成れるようにし、
歩・香・桂の強制成りも実装しています。
If y = 1 And (absP = FU Or absP = KY) Then force = True
If y <= 2 And absP = KE Then force = True
持ち駒と二歩
持ち駒は Hand(先手/後手, 駒種) で管理。
二歩は列を走査してチェックします。
For i = 1 To 9
If Board(x, i) = FU Then 二歩
Next
勝敗判定
王を取ったら即終了。
If Abs(enemyP) = OU Then
MsgBox "勝ち"
IsGameOver = True
End If
これ、実は業務アプリの構造
このExcel将棋は、構造的には
状態管理
ルールエンジン
UIイベント
描画
を分離した 業務システムそのもの です。
違うのは対象が「将棋」なだけ。
工程管理ツールでも設備管理でも同じ構造になります。
Excelは最強のローカルGUI基盤
インストール不要
配布が簡単
VBAでロジックが書ける
Shapeで自由に描画できる
Excelは 実質ゲームエンジン兼業務フレームワーク です。
今後の拡張
現在は人対人で対局できます。
今後は:
AI(簡易探索)
王手検出
棋譜保存
を追加予定です。
まとめ
Excelは表計算ソフトではなく、
イベント駆動型GUI + スクリプト実行環境です。
将棋が動くなら、
業務アプリが作れないわけがありません。
Excelをなめると、たぶん負けます。
