Bir satranç tahtası temsil test birimi


9

Bu biraz daha sıra dışı bir soru.

Ben esasen sıfırdan bir satranç kütüphanesi yazıyorum. Kodun çoğunu GUI ve / veya motor için kullanmak amacıyla burada bulabilirsiniz . (Oyun Büyük Satranç, ancak bu sorunun amaçları için gerçekten önemli değil.)

Şu anda işlevlerimin beklendiği gibi çalıştığını doğrulamak için birim testleri yazıyorum. Ve kontrol edebileceğim ve çalışabileceğim, Checkmate, Stalemate, Check, Legal, Yasadışı, vb.

tl; dr Kodumu sınamak için birimler listesi arıyorum.

Mevcut testlerimi burada bulabilirsiniz, birkaç günde bir ekliyorum. Ancak, ben kod hata ayıklama gitmeden önce testlerin tam olduğundan emin olmak istiyorum. (Bunların yarısı şu anda başarısız).

Düzenleme: açıklığa kavuşturmak için: Motor ("en iyi hareket") testleri aramıyorum . Ben yönetim kurulu temsil ("bu pozisyon şah mat") testleri arıyorum . Motor testi için dizilmiş birkaç bulmacam var.


Bir varyantı kodluyorsunuz. Standart satranç veri seti sizin için çalışmaz. Korkarım tek başınıza olursunuz.
SmallChess

@StudentT başlayabileceğim bir şey arıyorum. düzenli bir veri tabanı iyi olurdu, biliyorsunuz, ben bunu düzenleyebilirsiniz.
asibahi

1
BİRÇOK böyle test seti var, standart satrançta perft, taktik egzersizleri gibi bir şeyden memnun musunuz?
SmallChess

@StudentT Google üzerinden hiçbir şey bulamadım, bu yüzden neden burada soruyorum. Herhangi bir bilgi yardımcı olacaktır.
asibahi

Test etmek istediğiniz şey, kurulu temsiliyle çok az tp yapar. Hamle yaptıktan / yaptıktan veya pozisyonları içe aktardıktan sonra tahta sunumunu test etmek istersiniz. Eşi / çıkmazı tespit etmek bir değerlendirme fonksiyonu gerektirir ve yasallık için bir pozisyonu test etmek, kurul temsilini kontrol etmekten çok daha fazla şey olan bir fonksiyon olmalıdır.
Mart'ta Queeg

Yanıtlar:


1

Sorunuzu okurken, bağırsak reaksiyonum, kapsamınızın birim test için çok karmaşık olmasıdır. Ücretsiz e-kitap Birim Testi'ni kısa bir şekilde okumanızı tavsiye ederim. Ancak, satranç kodu yazma deneyimim yok (belki paradigmalarınız farklıdır) - yaşamak için yazılım yapmama rağmen.

Bir birim testi çok basit olmalı ve 1 tek şey yapan bir işlevi test etmelidir. Daha sonra işlevleri çalışacakları makul bir beklentiyle birleştirebilirsiniz. Örneğin, belirli bir hareketin yasal olup olmadığını belirlemek için her bir parça için bir birim test bekleyebilirim. Her parça için kralı kontrol altına alıp almadığını belirlemek için bir birim testi. Nereye saldırdığını vs. belirlemek için her bir parça için bir test.

Bir pozisyonu test etmek çok karmaşık bir birim testi gibi görünüyor ve iyice yapmak çok daha zor olurdu. Bunun yerine daha küçük fonksiyonlara karşı daha küçük testler yazın ve daha sonra tek tek çalışanların - bir pozisyonu değerlendirmenin sadece basit fonksiyonlar üzerinde yineleme meselesi olduğunu bilin.

İyi (zorlanmayan) bir hareket için bir pozisyonu test etmek istiyorsanız, birim testlerinin satranç motorunuzun uzun vadeli gelişimini ve gücünü yapay olarak sınırlayacağını düşünüyorum ... Bir birim testinin ikili bir sonucu, motorunuzu her seferinde aynı hareket.

Ayrıca bilinen oyunsonu olan bir montaj ilişkisine 'en doğrudan' yol için birim testleri eklemeyi de inceleyeceğim. Ben de bilinen açıklıklar arasında geçiş için birim testleri eklemek istiyorum. Orta oyun birimi testleri çok daha zor olacaktır - belki bir pozisyonu takmak ve motorun kullanılabilir bir sonuç verdiğini (ikili bir yanıttır) değerlendirmek.

Motorunuz için bir dizi konumu değerlendirme sorusu için, bu soruyu "satranç" etiketi ile https://stackoverflow.com/ adresine koyarak çok daha iyisini yapabilirsiniz .


Cevap için teşekkürler. Ancak, muhtemelen soru altındaki yorum konuşmalarından da anlayabileceğiniz gibi, motor algoritmalarını test etmek istemiyorum. Bunlara henüz ulaşmadım. Kodum tahtada bir ayakta pozisyonu şah mat ya da bir çıkmaz olup olmadığını, "sadece" yasal hareketleri sayıyor ve kral kontrol olup olmadığını anlamak için test etmek için arıyorum . Aslında bu soruyu yayınladığımdan beri, birim test senaryoları olarak kullanılacak küçük bir pozisyon koleksiyonu oluşturmaya devam ettim. Bunu cevap olarak gönderebilirim. (Birisi bunun için bir ödül teklif etti, tamamen şaşırdım, tbh.)
asibahi

Bu soruya cevap vermiyor.
SmallChess

1
Ayrıca, birim testi ile ilgili notlar da yanlıştır.
SmallChess

@asibahi Yorum bölümünde yayınlamak için yeterli temsilcim yoktu, bu yüzden bir cevap eklemek zorunda kaldım. Gerçekten bu soru ile bir programlama forumunda (stackexchange) daha iyi hizmet olacağını düşünüyorum. Ama bu yorumda ... zaten bireysel birim testleri tanımladınız -> Her parça testi için yasal bir hareket var. Bunu yinelemek her parça için yanlış döndürürse, çıkmaza girersiniz veya kontrol altındaysanız şahmatınız olur. Bunun için geniş bir pozisyon koleksiyonuna ihtiyacınız yok. Her parçayı geçerli durumu için ayrı ayrı test ederek, konumu değerlendirmek için birden fazla parça üzerinde tekrarlayabilirsiniz.
Paul

0

Bu eski bir soru olsa da, bu blogda sunulan kavramın yararlı olabileceğini düşündüm: http://scionsoftware.com/blog/write-tests-by-playing-chess

Fikir, bir GUI üzerinde bir satranç oyunu oynamak ve bir dosyaya serileştirerek satranç tahtasının durumunu yakalamak için bir mekanizmaya sahip olmanızdır.

Bu dosyaları test senaryoları başına adlandırabilir ve tanımladığınız test yöntemine aktarabilirsiniz: IsCheckmate; IsLegal; IsDraw

Oluşturma kolaylığı dışında, bu test senaryolarını oluşturmak için doğal bir kullanıcı arayüzü kullanmak istemenizin temel nedenlerinden biri, yeterli koşulların hareket sayılarına da bağlı olmasıdır: döküm, geçişli, çekme koşulları.


0

Satranç motoru için (genel olarak) herhangi bir birim test veritabanı bilmiyorum ve evet, kapsamlı birim testi yazmak neredeyse imkansız.

Belki de özellik tabanlı test (Haskell'de QuickCheck, F # ortamını bilmiyorum ama kesinlikle F # için böyle bir şey var) gibi alternatif test tekniğini keşfedebilirsiniz, bu da otomatik olarak büyük miktarda "konum" üretebilir ve bunları test edebilir sizin tanımladığınız özelliği kullanarak.

Umarım bu biraz yardımcı olur :)!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.