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 ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- Excel将棋:駒クラスの単体テスト(№4)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。