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

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

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


VBA マクロ Excel将棋

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


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

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

将棋進行クラス

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

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

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

将棋盤クラス

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

駒台クラス

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

駒クラス

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

位置クラス

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

※後に、位置クラスをデフォルトインスタンスに変更
・デフォルトインスタンスに変更する理由と方法 ・位置クラスのインポート用ソース ・cls位置とg位置の使い方の違い ・位置クラス変更に伴う駒クラスの変更 ・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将棋の目次
№2. Excel将棋:クラスの設計
・作成するクラスの役割と作成順 ・作成するクラスのメンバー一覧 ・駒の移動の定義 ・Excel将棋の目次
№3. Excel将棋:駒クラスの作成
・位置クラス ・移動クラス ・駒クラス ・駒クラスVBAの解説 ・使用しているVBAの参考ページ ・Excel将棋の目次
№4. Excel将棋:駒クラスの単体テスト
・駒クラスのテスト内容 ・駒クラスのテストVBAコード ・駒クラスのテストVBAの結果 ・Excel将棋の目次
№5. Excel将棋:駒台クラスの作成&単体テスト
・駒クラス ・駒台クラスVBAの解説 ・駒台クラスのテストVBAコード ・駒クラスのテストVBAの結果 ・Excel将棋の目次
№6. Excel将棋:位置クラスをデフォルトインスタンスに変更
・デフォルトインスタンスに変更する理由と方法 ・位置クラスのインポート用ソース ・cls位置とg位置の使い方の違い ・位置クラス変更に伴う駒クラスの変更 ・Excel将棋の目次
№7. Excel将棋:将棋盤クラスの作成&単体テスト
・将棋盤クラス ・将棋盤クラスVBAの解説 ・将棋盤クラスのテストVBAコード ・将棋盤クラスのテストVBAの結果 ・Excel将棋の目次
№8. Excel将棋:将棋進行クラスの作成
・将棋進行クラス ・将棋進行クラスVBAの解説 ・将棋進行クラスの起動方法 ・将棋盤クラスのテストVBAの結果 ・Excel将棋の目次
№9. Excel将棋:駒を動かす
・駒クラスにプロパティ追加 ・将棋進行クラスの変更点 ・将棋進行クラスのVBA ・Excel将棋の実行動作 ・Excel将棋の目次
№10. Excel将棋:相手の駒を取る、持ち駒を打つ
・主な変更追加箇所 ・全体の構成 ・Excel将棋の動作 ・Excel将棋の全VBAコード ・Excel将棋の目次
№11. Excel将棋:駒を成る
・主な変更追加箇所 ・Excel将棋の動作 ・変更したクラスのVBA ・Excel将棋の目次
№12. Excel将棋:棋譜をユーザーフォームに表示する
・棋譜について ・主な変更内容 ・ユーザーフォームの作成 ・Excel将棋の動作 ・変更したクラスのVBA ・Excel将棋の目次
№13. Excel将棋:棋譜選択でその時点の盤面に戻す
・Excel将棋の動作 ・全体構成図 ・全プロシージャー・プロパティの一覧 ・クリックで着手した時の主なプロシージャーの流れ ・Excel将棋のダウンロード ・Excel将棋の目次
№14. Excel将棋:棋譜ファイルの出力と読込自動再生
・Excel将棋の動作 ・VBAの修正箇所について ・Excel将棋のダウンロード ・棋譜KIFファイルのサンプル ・Excel将棋の目次
№15. Excel将棋:反則(禁じ手)判定
・反則(禁じ手) ・Excel将棋の動作 ・各クラスの共通で持つプロパティを整理 ・VBAの修正箇所について ・Excel将棋のダウンロード ・Excel将棋の目次
№16. Excel将棋:終局(詰み)判定と打ち歩詰め
・反則(禁じ手) ・Excel将棋の動作 ・VBAの追加・修正箇所について ・Excel将棋のダウンロード ・Excel将棋の目次
№17. Excel将棋:千日手と連続王手の千日手
・反則(禁じ手) ・Excel将棋の動作 ・VBAの修正箇所について ・Excel将棋のダウンロード ・Excel将棋の目次
№18 Excel将棋:ひとまず完成、これまでとこれから
・Excel将棋のこれから ・Excel将棋の目次 ・Excel将棋のダウンロード ・当初のクラス設計 ・作成するクラスのメンバー一覧 ・全体構成図 ・全プロシージャー・プロパティの一覧 ・全VBAコード
№19 Excel将棋:棋譜ファイルから対局一覧作成
・対局一覧のシート ・Excel将棋の動作 ・全体構成図 ・Excel将棋のダウンロード ・新規追加したVBAコード ・Excel将棋の目次



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

抜けている数値を探せ|エクセル雑感(2022-07-01)
.Net FrameworkのSystem.Collectionsを利用|VBA技術解説(2022-06-29)
迷路ネコが影分身の術を体得したら…|エクセル雑感(2022-06-27)
迷路にネコが挑戦したら、どうなるかな…|エクセル雑感(2022-06-26)
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)|エクセル雑感(2022-06-24)
「マクロの登録」で登録できないプロシージャーは?|エクセル雑感(2022-06-23)
オブジェクトのByRef、ByVal、Variant|エクセル雑感(2022-06-22)
コメントから特定形式の年月を取り出す|エクセル雑感(2022-06-19)
4,9を使わない連番作成|エクセル雑感(2022-06-17)
連番を折り返して出力|エクセル雑感(2022-06-16)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.マクロって何?VBAって何?|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.エクセルVBAでのシート指定方法|VBA技術解説




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


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



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