チェス盤表現の単体テスト


9

したがって、これは少し外れ値の質問です。

私はチェスライブラリを、基本的にゼロから作成しています。GUIやエンジンで使用することを意図して、コードの多くをここ見つけることができます。(ゲームはグランドチェスですが、この質問の目的ではそれは重要ではありません。)

現在、ユニットテストを作成して、関数が期待どおりに機能することを確認しています。そして、私がテストメイト、ステイルメイト、チェック、リーガル、イリーガルなどで分類された、私が使用および作業できる、推奨されるポジションのライブラリまたはデータベースの種類があるかどうか疑問に思っていました。

tl; drコードを単体テストするためのポジションのリストを探しています。

現在のテストはここにあります。数日ごとに追加します。ただし、コードをデバッグする前に、テストが完全であることを確認したいと思います。(それらの半分は現在失敗しています)。

編集:明確にするため:エンジン(「ベストムーブ」)テストを探していません。ボード表現(「これは位置チェックメイトです」)テストを探しています。エンジンテスト用にパズルをいくつか並べています。


バリアントをコーディングしています。標準のチェスデータセットは機能しません。だから私はあなたが一人でいるのではないかと心配しています。
SmallChess 2016

@StudentT私は私が始めることができる何かを探しています。通常のデータベースは問題なく動作します。ご存知のとおり、私はそれを編集できます。
asibahi 2016

1
多くのそのようなテストセットがあります、標準的なチェスでのperftのような戦術的な演習に満足していますか?
SmallChess 2016

@StudentT私はグーグル経由で何も見つけることができなかったので、なぜ私はここで尋ねています。どんな情報も参考になります。
asibahi 2016

あなたがテストしたいことは、ボード表現でほとんどtpがありません。移動を行ったり、行ったり、ポジションをインポートした後、ボードの表現をテストする必要があります。仲間/行き詰まりの検出には評価機能が必要であり、合法性の位置をテストすることはそれ自体の機能であり、理事会の表現をチェックすることよりもはるかに多くのことを行う必要があります。
Queeg

回答:


1

あなたの質問を読んでいるとき、私の直感はあなたのスコープがユニットテストには複雑すぎるということです。私は、無料の電子書籍のユニットテストを簡潔に一読することをお勧めします。しかし、私はチェスのコードを書いた経験はありません(たぶんあなたのパラダイムは異なります)-私は生計のためのソフトウェアをしますが。

単体テストは非常に単純で、1つのことを行う関数をテストする必要があります。次に、関数を、それらが機能するというある程度の妥当な期待と組み合わせることができます。たとえば、特定の動きが合法であるかどうかを判断するために、各ピースの単体テストを期待しています。それが王を抑えているかどうかを決定するための各ピースの単体テスト。各ピースが攻撃している場所などを特定するためのテスト。

ポジションのテストは非常に複雑な単体テストのようであり、徹底的に行うのははるかに困難です。代わりに、小さな関数に対して小さなテストを記述し、それらが個々に機能することを知ってください-位置を評価することは、単純な関数を繰り返すことの問題です。

良い(強制ではない)動きの位置をテストしたい場合、ユニットテストはチェスエンジンの長期的な開発と強さを人為的に制限すると思います...ユニットテストのバイナリ結果は、エンジンに強制的に毎回同じ動き。

また、既知のエンドゲームを持つメイトへの「最も直接的な」パスのユニットテストの追加も検討します。既知の開口部を通過するための単体テストも追加したいと思います。中間のゲームユニットテストははるかに難しくなります。おそらく、ポジションを接続し、エンジンが使用可能な結果(バイナリレスポンス)を生成することを評価します。

エンジンの一連のポジションを評価する質問については、この質問をhttps://stackoverflow.com/に "chess"タグを付けて配置することをお勧めします。


答えてくれてありがとう。ただし、質問の下のコメントの会話からおそらくわかるように、エンジンアルゴリズムをテストするつもりはありません。私はまだそれらに到達していませんでした。私のコードが、ボード上の立った位置がチェックメイトなのか、それともステイルメイトなのかを認識しているかどうかをテストしようとしています。実際、その質問を投稿してから、単体テストケースとして使用するポジションの小さなコレクションを作成しました。それを回答として投稿するかもしれません。(誰かがこれに対する報奨金を提供したことに私は完全に驚いています。)
asibahi 2017年

これは質問の答えにはなりません。
SmallChess 2017年

1
さらに、単体テストに関する注意事項は間違っています。
SmallChess 2017年

@asibahiコメントセクションに投稿するのに十分な担当者がいないため、回答を追加する必要がありました。私は、あなたがこの質問をプログラミングフォーラム(stackexchange)でよりよく提供されると本当に思います。しかし、このコメントについて...あなたはすでに個々の単体テストを識別しました->各ピーステストについて、合法的な動きがあります。それを繰り返して各ピースに対してfalseを返す場合は、行き詰まり、またはチェックしている場合はチェックメイトになります。あなたはそのためにポジションの膨大なコレクションを必要としません。現在の状態について各ピースを個別にテストすることにより、複数のピースを反復して位置を評価できます。
ポール

0

これは古い質問ですが、このブログで提示されている概念は役立つと思いました:http : //scionsoftware.com/blog/write-tests-by-playing-chess

GUIでチェスゲームをプレイし、ファイルにシリアル化することでチェス盤の状態をキャプチャするメカニズムがあるという考え方です。

テストケースごとにこれらのファイルに名前を付け、定義したテストメソッドにフィードすることができます。IsLegal; IsDraw

自然なUIを使用してこれらのテストケースを作成する主な理由の1つは、作成の容易さ以外に、十分な条件も移動数に依存していることです:キャスティング、エンパッサント、描画条件。


0

(一般的に)チェスエンジンの単体テストデータベースは知りません。もちろん、完全な単体テストを書くことはほとんど不可能です。

プロパティベースのテスト(HaskellのQuickCheck、F#環境はわかりませんが、F#のような環境は確かに存在します)などの代替のテスト手法を探索できます。これは、大量の「位置」を自動的に生成してテストできますあなたが定義したプロパティを使用します。

これが少し役立つことを願っています:)!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.