Unidade Testando uma representação do tabuleiro de xadrez

9

Portanto, essa é uma pergunta um tanto estranha.

Estou escrevendo uma biblioteca de xadrez, essencialmente do zero. Você pode encontrar grande parte do código aqui , com a intenção de usá-lo para uma GUI e / ou um mecanismo. (O jogo é Grand Chess, mas, para os fins desta pergunta, realmente não importa.)

Atualmente, estou escrevendo testes de unidade para verificar se minhas funções funcionam conforme o esperado. E eu queria saber se havia algum tipo de biblioteca ou banco de dados de posições sugeridas para testar, das quais eu posso usar e trabalhar, categorizadas por se tratarem de xeque-mate, impasse, cheque, jurídico, ilegal, etc.

tl; dr Estou procurando uma lista de posições para testar meu código de unidade.

Você pode encontrar meus testes atuais aqui, eu os adiciono a cada poucos dias. No entanto, quero garantir que os testes sejam exaustivos antes de eu depurar o código. (Metade deles falham atualmente).

Edit: para esclarecer: Eu não estou procurando por testes de mecanismo ("melhor jogada"). Estou procurando testes de representação do conselho ("esta posição é xeque-mate"). Eu já tenho alguns quebra-cabeças alinhados para testes de motores.

asibahi
fonte
Você está codificando uma variante. O conjunto de dados padrão do xadrez não funcionará para você. Então, eu tenho medo que você esteja por sua conta.
SmallChess 27/09/16
@StudentT Estou procurando algo para começar. uma base de dados regular faria muito bem, já que você sabe, eu posso editá-lo.
asibahi 27/09/16
11
Existem MUITOS jogos de teste, você está feliz por algo como exercícios táticos e perfeitos no xadrez padrão?
SmallChess 27/09/16
@StudentT Não consegui encontrar nada pelo Google, por isso estou perguntando aqui. Qualquer informação seria útil.
asibahi 27/09/16
O que você deseja testar pouco tem a ver com a representação da placa. Você desejará testar a representação do quadro depois de fazer / remover o movimento ou importar posições. A detecção de parceiro / impasse exige uma função de avaliação, e testar uma posição quanto à legalidade deve ser uma função própria que tem muito mais a fazer do que verificar a representação do conselho.
`` Queeg

Respostas:

1

Ao ler sua pergunta, minha reação é que seu escopo é muito complicado para testes de unidade. Eu recomendo uma leitura rápida através do e-book gratuito Unit Testing Succinctly. No entanto, não tenho experiência em escrever código de xadrez (talvez seus paradigmas sejam diferentes) - embora eu faça software para viver.

Um teste de unidade deve ser muito simples e testar uma função que faz uma única coisa. Então você pode combinar as funções com uma expectativa razoável de que elas funcionem. Por exemplo, eu esperaria que um teste de unidade para cada peça determinasse se uma determinada movimentação é legal. Um teste de unidade para cada peça para determinar se está colocando o rei em xeque. Um teste para cada peça para determinar onde está atacando, etc.

Testar uma posição parece um teste de unidade muito complicado e seria muito mais difícil de fazer completamente. Em vez disso, escreva testes menores contra funções menores e saiba que aqueles que trabalham individualmente - avaliar uma posição é apenas uma questão de iterar sobre as funções simples.

Se você quiser testar uma posição para uma boa jogada (não forçada), acho que os testes de unidade limitarão artificialmente o desenvolvimento e a força do seu motor de xadrez a longo prazo ... um resultado binário de um teste de unidade forçará seu motor a fazer o mesmo movimento toda vez.

Eu também gostaria de adicionar testes de unidade para o caminho 'mais direto' a um parceiro com jogos finais conhecidos. Eu gostaria de adicionar testes de unidade para atravessar aberturas conhecidas também. Os testes de unidade no meio do jogo serão muito mais difíceis - talvez conectando uma posição e avaliando que o mecanismo produz um resultado utilizável (que é uma resposta binária).

Para a questão de avaliar um conjunto de posições para o seu mecanismo, é melhor colocar essa questão em https://stackoverflow.com/ com a tag "xadrez".

Paulo
fonte
Obrigado pela resposta. No entanto, como você provavelmente pode perceber na conversa de comentários da pergunta, não pretendo testar os algoritmos do mecanismo. Ainda nem cheguei a isso. Estou procurando testar se meu código reconhece se uma posição de pé no tabuleiro é xeque-mate, ou um impasse, ou não, que está "apenas" contando movimentos legais e se o rei está em xeque. De fato, desde que publiquei essa pergunta, passei a compor uma pequena coleção de posições para usar como casos de teste de unidade. Eu posso postar isso como resposta. (Eu estou completamente surpreendido alguém ofereceu uma recompensa para isso, tbh.)
asibahi
Isso não responde à pergunta.
SmallChess 22/03
11
Além disso, as notas sobre o teste de unidade estão erradas.
SmallChess 22/03
@asibahi Eu não tinha representante suficiente para postar nessa seção de comentários, então tive que adicionar uma resposta. Eu realmente acho que você estará melhor servido em um fórum de programação (stackexchange) com esta pergunta. Mas neste comentário ... você já identificou testes de unidade individuais -> Para cada teste de peça, há uma jogada legal. Se iterar sobre isso retorna falso para cada peça, você tem impasse ou xeque-mate se estiver em xeque. Você não precisa de uma vasta coleção de posições para isso. Ao testar cada peça individualmente quanto ao seu estado atual, é possível iterar várias peças para avaliar a posição.
Paul
0

Embora essa seja uma pergunta antiga, achei que o conceito apresentado neste blog poderia ser útil: http://scionsoftware.com/blog/write-tests-by-playing-chess

A idéia é que você jogaria um jogo de xadrez em uma GUI e tivesse um mecanismo para capturar o estado do tabuleiro de xadrez serializando em um arquivo.

Você pode nomear esses arquivos de acordo com os casos de teste e alimentá-los com o método de teste que definir: IsCheckmate; IsLegal; IsDraw

Um dos principais motivos pelos quais você desejaria usar uma interface do usuário natural para criar esses casos de teste, fora da facilidade de criação, é que condições suficientes também dependem da contagem de movimentação: condições de castling, passant, draw.

SpykeBytes
fonte
0

Não conheço nenhum banco de dados de teste de unidade para o mecanismo de xadrez (em geral) e, sim, escrever testes de unidade exaustivos é quase impossível.

Talvez você possa explorar técnicas alternativas de teste, como testes baseados em propriedades (QuickCheck em Haskell, eu não conheço o ambiente F #, mas certamente existe algo parecido com o F #), que pode gerar automaticamente uma grande quantidade de "posição" e testá-los usando a propriedade definida por você.

Espero que isso ajude um pouco :)!

Sylvain Julmy
fonte