Unit Testing di una rappresentazione della scacchiera


9

Quindi questa è una domanda un po 'anomala.

Sto scrivendo una biblioteca di scacchi, essenzialmente da zero. Puoi trovare gran parte del codice qui , con l'intenzione di usarlo per una GUI e / o un motore. (Il gioco è Grand Chess ma ai fini di questa domanda non ha molta importanza.)

Attualmente sto scrivendo unit test per verificare che le mie funzioni funzionino come previsto. E mi chiedevo se ci fosse una sorta di libreria o database di posizioni suggerite da provare che posso usare e lavorare, classificato in base al fatto che siano scacco matto, stallo, controllo, legale, illegale, ecc.

tl; dr Sto cercando un elenco di posizioni con cui testare il mio codice.

Puoi trovare i miei attuali test qui, li aggiungo ogni pochi giorni. Tuttavia, voglio assicurarmi che i test siano esaustivi prima di eseguire il debug del codice. (La metà di questi fallisce attualmente).

Modifica: per chiarire: non sto cercando i test del motore ("mossa migliore"). Sto cercando test di rappresentanza del consiglio ("è questo scacco matto di posizione"). Ho già alcuni puzzle in fila per le prove del motore.


Stai codificando una variante. Il set di dati di scacchi standard non funziona per te. Quindi temo che tu sia da solo.
SmallChess,

@StudentT Sto cercando qualcosa da cui iniziare. una base di dati normale farebbe bene, dato che sai, posso modificarlo.
asibahi,

1
Ci sono MOLTE serie di prove del genere, sei felice per qualcosa come la perft, esercizi tattici negli scacchi standard?
SmallChess,

@StudentT Non sono riuscito a trovare nulla tramite Google, quindi perché lo sto chiedendo qui. Qualsiasi informazione sarebbe utile.
asibahi,

Quello che vuoi testare ha poco a che fare con la rappresentazione della scheda. Ti consigliamo di testare la rappresentazione del tabellone dopo aver effettuato / annullato le mosse o importato le posizioni. Rilevare compagno / situazione di stallo richiede una funzione di valutazione e testare una posizione per legalità dovrebbe essere una funzione a sé stante che ha molto più da fare che controllare la rappresentazione del consiglio di amministrazione.
Queeg,

Risposte:


1

Quando leggo la tua domanda, la mia reazione istintiva è che il tuo campo di applicazione sia troppo complicato per i test unitari. Consiglio vivamente una rapida lettura del test unitario e-book gratuito in modo succinto. Tuttavia, non ho esperienza nella scrittura di codici a scacchi (forse i tuoi paradigmi sono diversi), anche se faccio software per vivere.

Un test unitario dovrebbe essere molto semplice e testare una funzione che fa 1 singola cosa. Quindi è possibile combinare le funzioni con una ragionevole aspettativa che funzionino. Ad esempio, mi aspetto un test unitario per ogni pezzo per determinare se una determinata mossa è legale. Un test unitario per ogni pezzo per determinare se sta mettendo sotto controllo il re. Un test per ogni pezzo per determinare dove sta attaccando, ecc.

Testare una posizione sembra un test unitario molto complicato e sarebbe molto più difficile da fare a fondo. Invece, scrivi test più piccoli rispetto a funzioni più piccole e poi sappi che quelli funzionano individualmente: valutare una posizione è solo una questione di iterare sulle semplici funzioni.

Se vuoi testare una posizione per una buona mossa (non forzata), penso che i test unitari limiteranno artificialmente lo sviluppo a lungo termine e la forza del tuo motore di scacchi ... un risultato binario di un test unitario costringerà il tuo motore a fare il stessa mossa ogni volta.

Vorrei anche esaminare l'aggiunta di unit test per il percorso "più diretto" di un compagno con endgames noti. Vorrei aggiungere test unitari per attraversare anche aperture conosciute. I test delle unità a metà partita saranno molto più difficili, forse collegando una posizione e valutando che il motore produce un risultato utilizzabile (che è una risposta binaria).

Per la domanda di valutazione di una serie di posizioni per il tuo motore, puoi fare molto meglio a porre questa domanda su https://stackoverflow.com/ con il tag "scacchi".


Grazie per la risposta. Tuttavia, come probabilmente puoi dire dalla conversazione di commento sotto la domanda, non sto cercando di testare gli algoritmi del motore. Non ci sono nemmeno arrivato. Sto cercando di verificare se il mio codice riconosce se una posizione in piedi sulla scacchiera è scacco matto, o no, che sta "solo" contando le mosse legali e se il re è sotto controllo. Infatti da quando ho pubblicato quella domanda ho continuato a comporre una piccola raccolta di posizioni da utilizzare come casi di test unitari. Potrei postarlo come risposta. (Sono completamente sorpreso che qualcuno abbia offerto una generosità per questo, grazie.)
Asibahi,

Questo non risponde alla domanda.
SmallChess

1
Inoltre, le note sul test unitario sono sbagliate.
SmallChess

@asibahi Non avevo abbastanza rappresentante per pubblicare in quella sezione commenti, quindi ho dovuto aggiungere una risposta. Penso davvero che sarai meglio servito in un forum di programmazione (stackexchange) con questa domanda. Ma su questo commento ... hai già identificato i singoli test unitari -> Per ogni test del pezzo c'è una mossa legale. Se iterando ciò restituisce false per ogni pezzo, hai una situazione di stallo o scacco matto se sei sotto controllo. Non hai bisogno di una vasta collezione di posizioni per questo. Testando ogni pezzo singolarmente per il suo stato attuale, è possibile scorrere più pezzi per valutare la posizione.
Paul,

0

Sebbene questa sia una vecchia domanda, ho pensato che il concetto presentato in questo blog potesse essere utile: http://scionsoftware.com/blog/write-tests-by-playing-chess

L'idea è che giocherai a una partita a scacchi su una GUI e avresti un meccanismo per catturare lo stato della scacchiera serializzando su un file.

È possibile assegnare un nome a questi file per i casi di test e inserirli in qualsiasi metodo di test definito: IsCheckmate; IsLegal; IsDraw

Uno dei motivi principali per cui si desidera utilizzare un'interfaccia utente naturale per creare questi casi di test, al di fuori della facilità di creazione, è che condizioni sufficienti si basano anche sul conteggio delle mosse: condizioni di castling, en passant, draw.


0

Non conosco alcun database di unit test per il motore di scacchi (in generale), e sì, scrivere test unitari esaustivi è quasi impossibile.

Puoi forse esplorare tecniche di test alternative come test basati su proprietà (QuickCheck in Haskell, non conosco l'ambiente F # ma esiste sicuramente qualcosa di simile per F #), che può generare automaticamente una grande quantità di "posizione" e testarli utilizzando la proprietà definita da te.

Spero che questo possa aiutare un po ':)!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.