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 ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- Excel将棋:駒クラスの単体テスト(№4)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。