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 ・・・新着記事一覧を見る
最長連続出現数(ランレングス)の算出|エクセル練習問題(2025-11-15)
SQL基礎問題11:連続期間の開始月と終了月を抽出|SQL入門(2025-11-14)
セル数式における「再帰」の必要性|エクセル雑感(2025-11-10)
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算|エクセル関数応用(2025-11-10)
配列を自在に回転させる数式|エクセル関数応用(2025-11-09)
非正規化(カンマ区切り)の結合と集計:最適な手法は?|エクセル雑感(2025-11-06)
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計|SQL入門(2025-11-06)
SQL基礎問題9:特定商品購入者の平均購入金額|SQL入門(2025-11-04)
SQL基礎問題8:バスケット分析・ペア商品の出現回数|SQL入門(2025-11-04)
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出|SQL入門(2025-11-02)
アクセスランキング ・・・ ランキング一覧を見る
1.生成AIパスポート試験 練習問題(四肢択一式)|生成AI活用研究
2.最終行の取得(End,Rows.Count)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.FILTER関数(範囲をフィルター処理)|エクセル入門
8.日本の祝日一覧|Excelリファレンス
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.セルのクリア(Clear,ClearContents)|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.
