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

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

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


VBA マクロ Excel将棋

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


今回は、前回の№3. Excel将棋:駒クラスの作成、この単体テストになります。
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒クラスの作成になります。駒クラスに必要な部品クラスとして、位置クラスと移動クラスを先に作成してから駒クラスの作成に進みます。
駒クラスは、今後作成していく駒台クラス、将棋盤クラスで使用するものです。
駒台クラス、将棋盤クラスを作成する前に、最低限の動きは確認しておかなければなりません。

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

駒クラスのテスト内容

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の使い方:イミディエイト ウィンドウ
VBE(VisualBasicEditor)は、VBAで使われるコードエディタ、コンパイラ、デバッガ、その他の開発支援ツールが統合された開発環境です。ここではイミディエイトウィンドウの使い方について説明します。イミディエイトウィンドウの表示 メニュー「表示」→「イミディエイトウィンドウ」ショートカット:Ctrl+G 初期設定では、
↑↓は先手後手を表しています。
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マクロVBAの学習素材として将棋を作ってみましょう。
№2. Excel将棋:クラスの設計
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、VBAクラスの設計になります。設計といっても、どのようなプロパティ・メソッドをもたせるかといった概要だけです。
№3. Excel将棋:駒クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒クラスの作成になります。駒クラスに必要な部品クラスとして、位置クラスと移動クラスを先に作成してから駒クラスの作成に進みます。
№4. Excel将棋:駒クラスの単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の№3.Excel将棋:駒クラスの作成、この単体テストになります。駒クラスは、今後作成していく駒台クラス、将棋盤クラスで使用するものです。
№5. Excel将棋:駒台クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒台クラスの作成と単体テストになります。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№6. Excel将棋:位置クラスをデフォルトインスタンスに変更
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前に作った位置クラスをデフォルトインスタンスに変更します。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№7. Excel将棋:将棋盤クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、いよいよ将棋盤クラスを作成します。駒クラスを2次元配列(1To9,1To9)に入れて将棋盤全体を管理します。
№8. Excel将棋:将棋進行クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、シートとやり取りする将棋進行クラスを作成します。ここまでは、作成したクラスのテスト実行用のVBAを別途作成し、結果をイミディエイトウィンドウに表示して確認していました。
№9. Excel将棋:駒を動かす
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を動かします。駒を動かせるように将棋進行クラスを拡張します。将棋進行クラスの完成はまだまだこれからですが、駒を動かせるようになるとゲームらしくなってきます。
№10. Excel将棋:相手の駒を取る、持ち駒を打つ
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、相手の駒を取ったり、持駒を打ったりできるようにします。取った駒は駒台へ移し、駒台から駒を選んで打てるようにします。
№11. Excel将棋:駒を成る
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を成れるようにします。ただし、将棋では成らない選択も出来ますので、成れるタイミングで成るか成らないかを選択できるようにします。
№12. Excel将棋:棋譜をユーザーフォームに表示する
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、ユーザーフォームを作成し、初手からの棋譜を表示できるようにします。シート操作ができるように、ユーザーフォームはモードレスで表示します。
№13. Excel将棋:棋譜選択でその時点の盤面に戻す
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、棋譜フォームの棋譜を選択することで、その時点の盤面に戻す機能を実装します。さらに、その時点から指し継ぐこともできるようにします。
№14. Excel将棋:棋譜ファイルの出力と読込自動再生
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、KIF形式の棋譜ファイルの出力と、KIF形式の棋譜ファイルを読み込んで初手から終局までを自動再生させます。
№15. Excel将棋:反則(禁じ手)判定
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、反則(禁じ手)の判定を入れます。禁じ手は指し手そのものが出来ないようにします。※クラス名、プロシージャー名、変数名に日本語を使用しています。
№16. Excel将棋:終局(詰み)判定と打ち歩詰め
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の反則(禁じ手)の続きで「打ち歩詰め」を実装します。打ち歩詰めを判定するには、そもそも「詰み」の判定が必要です。
№17. Excel将棋:千日手と連続王手の千日手
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、千日手と反則の「連続王手の千日手」を実装します。千日手は、他とは違ってある局面だけでは判定できません。
№18 Excel将棋:ひとまず完成、これまでとこれから
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。前回でひとまず当初目標の人vs人で動かしてゲームとして成立するところまでできました。連載の途中で、急遽棋譜の出力と読み込んで自動再生も作成しました。
№19 Excel将棋:棋譜ファイルから対局一覧作成
Excelで将棋を作るシリーズの当初目標の、人vs人で動かしてゲームとして成立するところまでは完成しました。今回は機能拡張として、棋譜ファイルを読み込み対局一覧を作成します。複数の棋譜ファイルも一度に処理できるようにしています。



新着記事NEW ・・・新着記事一覧を見る

import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)
入力規則への貼り付けを禁止する|VBA技術解説(9月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ