VBAサンプル集
Excel将棋:駒クラスの単体テスト(№4)

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

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


VBA マクロ Excel将棋

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


今回は、前回の№3. Excel将棋:駒クラスの作成、この単体テストになります。
・位置クラス ・移動クラス ・駒クラス ・駒クラスVBAの解説 ・使用しているVBAの参考ページ ・Excel将棋の目次
駒クラスは、今後作成していく駒台クラス、将棋盤クラスで使用するものです。
駒台クラス、将棋盤クラスを作成する前に、最低限の動きは確認しておかなければなりません。

もちろん、しっかり細部までテストしたほうが良いのですが、
今の時点では、今後作成していく駒台クラス、将棋盤クラスによっては仕様変更も発生するかもしれません。
これらのクラスのテストでもバグを潰せるので、
ここでは単体テストとして、基本的な動作のテストをしておきます。
ただし、基本的な動作のテストといっても、テストコードはそれなりのコード量になります。

駒クラスのテスト内容

VBA マクロ Excel将棋

駒クラスを使って、この駒配置をします。
駒の配置が出来たら、
先手の、飛、と、香
後手の、角、銀
これらの移動可能位置が正しいかを確認します。

テストVBAコードでは、配列を見やすいようにイミディエイトに出力します。

駒クラスのテスト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の結果

イミディエイト ウィンドウの出力です。
VBEの使い方:イミディエイト ウィンドウ
・イミディエイト ウィンドウの表示 ・イミディエイト ウィンドウの基本的な使い方 ・イミディエイト ウィンドウの高度な使い方 ・イミディエイト ウィンドウの最後に
↑↓は先手後手を表しています。
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将棋の目次

№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」をお願いいたします。
本文下部へ