VBAサンプル集
Excel将棋:クラスの設計(№2)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2020-08-31

Excel将棋:クラスの設計(№2)


VBA マクロ Excel将棋

Excelで将棋を作ってみましょう。
人vs人で動かしてゲームとして成立するところまでが当面の目標です。


今回は、VBAクラスの設計になります。
設計といっても、どのようなプロパティ・メソッドをもたせるかといった概要だけです。
詳細はVBAを書きながら決めていく予定です。
したがって、以下のクラスのメンバーもVBA実装で変更する可能性はあります。

作成するクラスの役割と作成順

将棋進行クラス

ゲーム全体を管理します。
主な役割としては、
・シートと他のクラスの受け渡し
・ルール制御
・消費時間管理

以下のオブジェクトを保持する。
・将棋盤オブジェクト
・先手駒台オブジェクト
・後手駒台オブジェクト

WithEventsを使い、任意のシートでゲーム可能にする。

将棋盤クラス

将棋盤を管理します。
2次元配列に駒クラスのオブジェクトを入れる。
シートとは完全に切り離して作成。

駒台クラス

駒台の駒を管理するのみ。
駒の種類と数だけ管理できれば良い。

駒クラス

駒1つを1つのオブジェクトとして作成
駒の種類、駒の移動、駒の位置等、駒ごとの情報を保持

位置クラス

将棋盤の2次元配列内の位置情報として使用。
・行
・列
この情報だけを持たせる
ユーザー定義型では制限が多いためクラスを使用

※後に、位置クラスをデフォルトインスタンスに変更
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前に作った位置クラスをデフォルトインスタンスに変更します。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。

移動クラス

将棋盤の2次元配列内で駒が移動できる位置情報として使用。
・行
・列
・回数
この情報だけを持たせる
ユーザー定義型では制限が多いためクラスを使用

現在位置からのオフセットとその繰り返し最大数
前に1つだけ進める場合は、-1,0,1
前に突き当たるまで進めるなら、-1,0,8、盤は9*9なので回数は最大で8

-1,-1 -1,0 -1,1
0,-1 現在 0,1
1,-1 1,0 1,1

クラスの作成順

・駒クラス、位置クラス、移動クラス
・駒台クラス
・将棋盤クラス
・将棋進行クラス
この順で作成していく予定です。
細かい部品から作成していく感じになります。
したがって、下に行くほど設計がずれていく可能性があります。

作成するクラスのメンバー一覧

以下は作成予定の各クラスのPublicメンバーのみになります。
現時点での予定なので、実装段階で変更は発生すると思います。
※各クラス作成時の変更は、極力このページに反映しておきます。
また、Privateメンバーは適宜作成していきます。

将棋進行クラス

種別 名称 説明
プロパティ 将棋盤 シートのRange
プロパティ 先手持駒 シートのRange
プロパティ 後手持駒 シートのRange
プロパティ 先手消費時間 シートのRange
プロパティ 後手消費時間 シートのRange
プロパティ 手数 シートのRange
プロパティ 棋譜 シートのRange
プロパティ 将棋盤色 シートのRange
プロパティ 駒選択色 シートのRange
メソッド 駒配置 駒を並べる
「大橋流」でアニメーションさせたい
メソッド 駒選択 選択駒の移動可能セルの協調表示
既に選択されている場合は解除
メソッド 着手 引数(元位置, 先位置, 駒名)
元位置:-1,-1は初期配置
元位置:0,0は駒台から
反則(禁じ手)等の判定を行い、禁じ手の場合はFalseを返す
相手の駒を取る場合は駒台へ追加
駒台から打った場合は駒台から削除
シート全体の更新
メソッド 盤面表示 盤面の2次元配列をシートに表示する
2次元配列はcls将棋盤の現在盤面で取得する
メソッド 終局判定 これは結構難しい・・・
持駒を含めた全ての駒を使って受けがないかの判定

将棋盤クラス

種別 名称 説明
プロパティ 現在盤面 駒オブジェクトが入っている2次元配列から表示名の2次元配列を作成する
プロパティ 盤面履歴 現在盤面をCollection
プロパティ 手数 現在手数を戻す
プロパティ 棋譜 1手ずつCollectionに追加
棋譜は、Ki2形式とします。
▲5ニ銀右上成
・先手▲後手△
・到達地点の筋
・到達地点の段
・駒の種類
・駒の相対位置(複数ある場合)
・駒の動作(複数ある場合)
・成・不成・打
プロパティ 棋譜履歴 最終手をCollection
プロパティ 先手 先手True、後手False
メソッド 着手 引数(元位置, 先位置, 駒名, Optional 手番)
元位置:-1,-1は初期配置
元位置:0,0は駒台から
手番省略時は、プロパティ手番に従う
以下を更新する。
最終手、2次元配列、盤面履歴、棋譜履歴
メソッド 終局判定 これはかなり難しい・・・
持駒を含めた全ての駒を使って受けがないかの判定が必要

2次元配列(1 To 9, 1 To 9)の各要素に駒オブジェクト(駒クラスのインスタンス)を入れて管理します。

駒台クラス

種別 名称 説明
プロパティ 駒台一覧 金,1;歩,3
メソッド 駒追加 オブジェクトで追加
メソッド 駒削除 名称で削除

駒クラス

種別 名称 説明
プロパティ 正式名称 飛車、角行、金将、銀将、桂馬、香車、歩兵
プロパティ 表示名称 飛、角、金、銀、桂、香、歩
プロパティ 成駒名称 龍、馬、金、成銀、成桂、成香、と
プロパティ 表示順 駒台の表示順
プロパティ 先手 先手True、後手False
プロパティ 成り 先りTrue、未成りFalse
プロパティ 駒位置 縦横(行列)で取得・設定
プロパティ 駒移動 別表参照
プロパティ 成駒移動 別表参照
メソッド 駒作成 駒の正式名称を受け取って、その駒特有の情報を設定する
メソッド 駒位置設定 駒位置プロパティの設定を行・列で行う
メソッド 移動可能位置 駒が移動できる位置をcls位置(行、列)のCollectionで返す

位置クラス

種別 名称 説明
変数 1~9
変数 1~9

将棋では筋、段と言い、筋は右から1,2,…となります。
しかし、ここでは配列の位置としての行・列の数値で管理します。

移動クラス

種別 名称 説明
変数 1~9
変数 1~9
変数 回数 1~8

将棋では筋、段と言い、筋は右から1,2,…となります。
しかし、ここでは配列の位置としての行・列の数値で管理します。

駒の移動の定義

王将 飛車 角行 金将 銀将 桂馬 香車 歩兵
-1,-1,1
-1,0,1
-1,1,1
0,-1,1
0,1,1
1,-1,1
1,0,1
1,1,1
-1,0,-8
1,0,8
0,-1,-8
0,1,8
-1,-1,8
-1,1,8
1,-1,8
1,1,8
-1,-1,1
-1,0,1
-1,1,1
0,-1,1
0,1,1
1,0,1
-1,-1,1
-1,0,1
-1,1,1
1,-1,1
1,1,1
-2,-1,1
-2,1,1
-1,0,-8,0 1,0,1
龍王 龍馬 成銀 成桂 成香
-1,0,-8
1,0,8
0,-1,-8
0,1,8
-1,-1,1
-1,1,1
1,-1,1
1,1,1
-1,-1,8
-1,1,8
1,-1,8
1,1,8
-1,0,1
0,-1,1
0,1,1
1,0,1
-1,-1,1
-1,0,1
-1,1,1
0,-1,1
0,1,1
1,0,1
-1,-1,1
-1,0,1
-1,1,1
0,-1,1
0,1,1
1,0,1
-1,-1,1
-1,0,1
-1,1,1
0,-1,1
0,1,1
1,0,1
-1,-1,1
-1,0,1
-1,1,1
0,-1,1
0,1,1
1,0,1

Excel将棋の目次

№1. Excel将棋:マクロVBAの学習用
Excelで将棋を作ってみましょう。今やコンピューター将棋はプロをしのぐ強さです。しかし、Excelでそのようなソフトを作ろうと言うのではありません。と言いますか、残念ながら私には作れません、、、ExcelマクロVBAの学習素材として将棋を作ってみましょう。
№2. Excel将棋:クラスの設計
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、VBAクラスの設計になります。設計といっても、どのようなプロパティ・メソッドをもたせるかといった概要だけです。
№3. Excel将棋:駒クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒クラスの作成になります。駒クラスに必要な部品クラスとして、位置クラスと移動クラスを先に作成してから駒クラスの作成に進みます。
№4. Excel将棋:駒クラスの単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の№3.Excel将棋:駒クラスの作成、この単体テストになります。駒クラスは、今後作成していく駒台クラス、将棋盤クラスで使用するものです。
№5. Excel将棋:駒台クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒台クラスの作成と単体テストになります。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№6. Excel将棋:位置クラスをデフォルトインスタンスに変更
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前に作った位置クラスをデフォルトインスタンスに変更します。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№7. Excel将棋:将棋盤クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、いよいよ将棋盤クラスを作成します。駒クラスを2次元配列(1To9,1To9)に入れて将棋盤全体を管理します。
№8. Excel将棋:将棋進行クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、シートとやり取りする将棋進行クラスを作成します。ここまでは、作成したクラスのテスト実行用のVBAを別途作成し、結果をイミディエイトウィンドウに表示して確認していました。
№9. Excel将棋:駒を動かす
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を動かします。駒を動かせるように将棋進行クラスを拡張します。将棋進行クラスの完成はまだまだこれからですが、駒を動かせるようになるとゲームらしくなってきます。
№10. Excel将棋:相手の駒を取る、持ち駒を打つ
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、相手の駒を取ったり、持駒を打ったりできるようにします。取った駒は駒台へ移し、駒台から駒を選んで打てるようにします。
№11. Excel将棋:駒を成る
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を成れるようにします。ただし、将棋では成らない選択も出来ますので、成れるタイミングで成るか成らないかを選択できるようにします。
№12. Excel将棋:棋譜をユーザーフォームに表示する
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、ユーザーフォームを作成し、初手からの棋譜を表示できるようにします。シート操作ができるように、ユーザーフォームはモードレスで表示します。
№13. Excel将棋:棋譜選択でその時点の盤面に戻す
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、棋譜フォームの棋譜を選択することで、その時点の盤面に戻す機能を実装します。さらに、その時点から指し継ぐこともできるようにします。
№14. Excel将棋:棋譜ファイルの出力と読込自動再生
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、KIF形式の棋譜ファイルの出力と、KIF形式の棋譜ファイルを読み込んで初手から終局までを自動再生させます。
№15. Excel将棋:反則(禁じ手)判定
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、反則(禁じ手)の判定を入れます。禁じ手は指し手そのものが出来ないようにします。※クラス名、プロシージャー名、変数名に日本語を使用しています。
№16. Excel将棋:終局(詰み)判定と打ち歩詰め
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の反則(禁じ手)の続きで「打ち歩詰め」を実装します。打ち歩詰めを判定するには、そもそも「詰み」の判定が必要です。
№17. Excel将棋:千日手と連続王手の千日手
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、千日手と反則の「連続王手の千日手」を実装します。千日手は、他とは違ってある局面だけでは判定できません。
№18 Excel将棋:ひとまず完成、これまでとこれから
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。前回でひとまず当初目標の人vs人で動かしてゲームとして成立するところまでできました。連載の途中で、急遽棋譜の出力と読み込んで自動再生も作成しました。
№19 Excel将棋:棋譜ファイルから対局一覧作成
Excelで将棋を作るシリーズの当初目標の、人vs人で動かしてゲームとして成立するところまでは完成しました。今回は機能拡張として、棋譜ファイルを読み込み対局一覧を作成します。複数の棋譜ファイルも一度に処理できるようにしています。



新着記事NEW ・・・新着記事一覧を見る

import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)
入力規則への貼り付けを禁止する|VBA技術解説(9月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ