Excel将棋:駒クラスの単体テスト(№4)

Excelで将棋を作ってみましょう。
人vs人で動かしてゲームとして成立するところまでが当面の目標です。
駒台クラス、将棋盤クラスを作成する前に、最低限の動きは確認しておかなければなりません。
今の時点では、今後作成していく駒台クラス、将棋盤クラスによっては仕様変更も発生するかもしれません。
これらのクラスのテストでもバグを潰せるので、
ここでは単体テストとして、基本的な動作のテストをしておきます。
ただし、基本的な動作のテストといっても、テストコードはそれなりのコード量になります。
駒クラスのテスト内容

駒の配置が出来たら、
先手の、飛、と、香
後手の、角、銀
これらの移動可能位置が正しいかを確認します。
駒クラスのテストVBAコード
Option Explicit
Sub test1()
Const 先手 As Boolean = True
Const 後手 As Boolean = False
ReDim ary盤(1 To 9, 1 To 9) As cls駒
Call 着手(ary盤, 5, 5, "飛車", 先手)
Call 着手(ary盤, 7, 5, "金将", 先手)
Call 着手(ary盤, 5, 8, "歩兵", 先手)
Call 着手(ary盤, 9, 9, "香車", 先手)
Call 着手(ary盤, 2, 5, "歩兵", 先手)
ary盤(2, 5).成り = True
Call 着手(ary盤, 4, 4, "銀将", 後手)
Call 着手(ary盤, 3, 5, "歩兵", 後手)
Call 着手(ary盤, 2, 8, "角行", 後手)
Call Print盤(ary盤)
Debug.Print vbLf; ary盤(5, 5).表示名称 & "(5, 5)"
Call PrintArray(col位置2Array(ary盤(5, 5).駒移動可能位置(ary盤)))
Debug.Print vbLf; ary盤(2, 5).表示名称 & "(2, 5)"
Call PrintArray(col位置2Array(ary盤(2, 5).駒移動可能位置(ary盤)))
Debug.Print vbLf; ary盤(9, 9).表示名称 & "(9, 9)"
Call PrintArray(col位置2Array(ary盤(9, 9).駒移動可能位置(ary盤)))
Debug.Print vbLf; ary盤(2, 8).表示名称 & "(2, 8)"
Call PrintArray(col位置2Array(ary盤(2, 8).駒移動可能位置(ary盤)))
Debug.Print vbLf; ary盤(4, 4).表示名称 & "(4, 4)"
Call PrintArray(col位置2Array(ary盤(4, 4).駒移動可能位置(ary盤)))
End Sub
Private Function 着手(ByRef ary() As cls駒, _
ByVal 行 As Integer, _
ByVal 列 As Integer, _
ByVal 駒名 As String, _
ByVal 先手 As Boolean) As cls駒
Dim obj駒 As New cls駒
Call obj駒.駒作成(駒名, 先手, 行, 列)
Set ary(行, 列) = obj駒
'駒作成の戻りを使って、以下のように記述できます。
'Set ary(行, 列) = obj駒.駒作成(駒名, 先手, 行, 列)
'さらに、以下いずれかの方法でDimも書かずに1行で記述することも可能
'Set ary(行, 列) = VBA.CVar(New cls駒).駒作成(駒名, 先手, 行, 列)
'Set ary(行, 列) = CallByName(New cls駒, "駒作成", VbMethod, 駒名, 先手, 行, 列)
End Function
Sub Print盤(ByRef ary盤() As cls駒, Optional separator As String = "")
Dim i As Long, j As Long
Dim sTemp As String, sPrint As String
For i = LBound(ary盤, 1) To UBound(ary盤, 1)
sPrint = ""
For j = LBound(ary盤, 2) To UBound(ary盤, 2)
If ary盤(i, j) Is Nothing Then
sTemp = "・ "
Else
sTemp = ary盤(i, j).表示名称
sTemp = sTemp & IIf(ary盤(i, j).先手, "↑", "↓")
End If
sPrint = sPrint & sTemp & separator
Next
Debug.Print sPrint
Next
End Sub
Function col位置2Array(ByVal col位置 As Collection) As Variant
Dim ary(1 To 9, 1 To 9) As Integer
Dim obj位置 As cls位置
For Each obj位置 In col位置
ary(obj位置.行, obj位置.列) = 1
Next
col位置2Array = ary
End Function
Sub PrintArray(ByRef ary, Optional separator As String = "")
Dim i As Long, j As Long, str As String
For i = LBound(ary, 1) To UBound(ary, 1)
str = ""
For j = LBound(ary, 2) To UBound(ary, 2)
If j > LBound(ary, 2) Then str = str & separator
str = str & ary(i, j)
Next
Debug.Print str
Next
End Sub
駒の位置指定が将棋の棋譜と違うので、テストでは戸惑ってしまいます。
将棋の棋譜では、
筋段→右からの列数 + 上からの行数
上記VBAでは、
行列→上からの行数 + 左からの列数
シートとやり取りするクラス、将棋進行クラスでこの変換を行う予定です。
それまでは、頭の中で変換することにします。
将棋として見るのではなく、配列として見れば行列の指定は戸惑う事はありませんので。
駒クラスのテストVBAの結果
0,1は、1が移動可能位置です。
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ と↑・ ・ 角↓・
・ ・ ・ ・ 歩↓・ ・ ・ ・
・ ・ ・ 銀↓・ ・ ・ ・ ・
・ ・ ・ ・ 飛↑・ ・ 歩↑・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ 金↑・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ 香↑
飛(5, 5)
000000000
000000000
000010000
000010000
111101100
000010000
000000000
000000000
000000000
と(2, 5)
000111000
000101000
000010000
000000000
000000000
000000000
000000000
000000000
000000000
香(9, 9)
000000001
000000001
000000001
000000001
000000001
000000001
000000001
000000001
000000000
角(2, 8)
000000101
000000000
000000101
000001000
000010000
000000000
000000000
000000000
000000000
銀(4, 4)
000000000
000000000
001000000
000000000
001110000
000000000
000000000
000000000
000000000
Excel将棋の目次
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- Excel将棋:駒クラスの単体テスト(№4)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
