Mecanismo de xadrez com API

11

Estou procurando um mecanismo de xadrez que forneça uma API normal que eu possa usar com alguma linguagem de programação de alto nível como C # ou python. Examinei a lista de líderes (Houdini, Komodo, Stockfish e Rybka) e não consegui encontrar nenhum sinal de que esses mecanismos forneçam API (o que me surpreendeu e sugeriu que estou perdendo alguma coisa).

Para ser menos vago, eis o que eu preciso desta API:

  • poder carregar jogo específico no mecanismo
  • ser capaz de avaliar a posição do jogo
  • ser capaz de fazer uma jogada

Então, alguém conhece um mecanismo que fornece uma API clara para suas funções?

Salvador Dalí
fonte
2
UCI é uma API que obtém comando por meio de opções de linha de comando e entrada padrão. Você pode escrever um invólucro em torno desses comandos e chamar comandos por funções.
masoud
Sim, UCI é exatamente o que você está procurando. Todos esses programas suportam UCI, que é como eles são integrados a programas como o ChessBase.
dfan

Respostas:

6

Como outros já disseram, UCI é a API que você deseja. As especificações completas do protocolo estão aqui (o arquivo zip é extraído para um arquivo de texto): http://download.shredderchess.com/div/uci.zip

Na verdade, é muito direto e simples, um mecanismo UCI deve responder e responder em texto sem formatação através de stdin, stdout e stderr. De fato, você deve poder iniciar o binário executável de qualquer mecanismo UCI em sua plataforma e emitir os comandos UCI manualmente.

A UCI facilita as instruções de uma GUI ou outro mecanismo para instruir o mecanismo específico a fazer o que você deseja, incluindo analisar um arquivo PGN específico (o carregamento é feito através da GUI ou de um front-end similar, as movimentações brutas são então alimentados ao motor em forma algébrica estendida, como e4 se tornando e2e4). O segundo e o terceiro ponto de seus requisitos são padrão com a UCI, mas cabe a cada desenvolvedor de mecanismo dar suporte a eles (dado o quão baixos esses requisitos são, essa deve ser a maioria deles).

Aqui está um exemplo de UCI em ação na linha de comando:

bash-3.2$ ./stockfish-5-64 
Stockfish 5 64 by Tord Romstad, Marco Costalba and Joona Kiiski
uci
id name Stockfish 5 64
id author Tord Romstad, Marco Costalba and Joona Kiiski

option name Write Debug Log type check default false
option name Write Search Log type check default false
option name Search Log Filename type string default SearchLog.txt
option name Book File type string default book.bin
option name Best Book Move type check default false
option name Contempt Factor type spin default 0 min -50 max 50
option name Mobility (Midgame) type spin default 100 min 0 max 200
option name Mobility (Endgame) type spin default 100 min 0 max 200
option name Pawn Structure (Midgame) type spin default 100 min 0 max 200
option name Pawn Structure (Endgame) type spin default 100 min 0 max 200
option name Passed Pawns (Midgame) type spin default 100 min 0 max 200
option name Passed Pawns (Endgame) type spin default 100 min 0 max 200
option name Space type spin default 100 min 0 max 200
option name Aggressiveness type spin default 100 min 0 max 200
option name Cowardice type spin default 100 min 0 max 200
option name Min Split Depth type spin default 0 min 0 max 12
option name Threads type spin default 1 min 1 max 128
option name Hash type spin default 32 min 1 max 16384
option name Clear Hash type button
option name Ponder type check default true
option name OwnBook type check default false
option name MultiPV type spin default 1 min 1 max 500
option name Skill Level type spin default 20 min 0 max 20
option name Emergency Move Horizon type spin default 40 min 0 max 50
option name Emergency Base Time type spin default 60 min 0 max 30000
option name Emergency Move Time type spin default 30 min 0 max 5000
option name Minimum Thinking Time type spin default 20 min 0 max 5000
option name Slow Mover type spin default 80 min 10 max 1000
option name UCI_Chess960 type check default false
uciok
isready
readyok
quit
bash-3.2$ 

Os comandos que eu emitei foram uci, isready e quit.

Para utilizar os comandos UCI, você basicamente tem duas opções principais; você pode usar uma interface existente (por exemplo, ChessX, Arena e vários outros) ou pode escrever seu próprio código para emitir instruções para um mecanismo ou grupo de mecanismos. Acredito que já pode haver wrappers Python para acessar os mecanismos UCI, mas eu precisaria verificar novamente. Definitivamente, há python-xadrez (import chess) e pychess (import pychess), simplesmente não consigo me lembrar da extensão de suas funções. Não me lembro onde o pychess está escondido (provavelmente no github ou no google code), mas o python-chess pode ser instalado com o pip.

Ben
fonte
O UCI não parece fornecer uma API para definir o valor das peças.
Snowcrash
Esse tipo de coisa deve ser programado no próprio motor e os motores de xadrez usarão valores padrão. Você só precisa alterá-lo para outro jogo (por exemplo, xadrez das fadas) e é provável que precise fazer muito mais alterações do que apenas os valores das peças.
23916 Ben Ben
Discordo. Não há standardvalores.
Snowcrash
Então você provavelmente precisará bifurcar uma base de código do mecanismo para reprojetá-la com valores variáveis. Em seguida, defina uma configuração separada para o mecanismo bifurcado e recompilado para usar os novos valores. Em seguida, continue a interagir via UCI normalmente. Como alternativa, observe o outro formato de linguagem de mecanismo que o GNU Chess usa, mas esqueço os detalhes dele.
Ben
3

Eu pesquisei no "API do mecanismo de xadrez", mas não vi nenhuma API real. Conforme sugerido nos comentários de sua pergunta, eu iria com a UCI. É também assim que as GUI se comunicam com os mecanismos de xadrez.

Se você é realmente um programador hardcore, sempre pode conferir o mecanismo de código aberto Stockfish. É bem possível que exista algum tipo de API nele, ou você pode criar um clone e criar sua própria API para ele.

http://stockfishchess.org/

Rafiek
fonte
1
A API para conversar com o Stockfish também é UCI.
dfan
1
De fato é. Mas usar UCI ou mergulhar no código dependerá de como o mecanismo será usado e não para quê. A questão não estava clara sobre isso.
Rafiek
Acho que mencionei o que exatamente preciso fazer com o motor. Carregue um PNG específico e avalie após cada movimento.
Salvador Dali
Está perfeitamente claro o que você quer fazer com o motor. Como você o usará é deixado em aberto. Em que configuração você estará usando o mecanismo? Pode ser que o UCI não seja a maneira ideal de se comunicar com o mecanismo. Sugeri outra opção se a UCI não for suficiente para você.
Rafiek
Desculpe, mas não consigo entender o que você quer dizer com como vou usar o mecanismo. Você pode esclarecer isso?
Salvador Dali
1

O Batch First é um mecanismo de xadrez compilado pelo JIT, escrito em Python, compilado usando o Numba, que permitiria fácil interface C ++ e ainda mais fácil interface Python.

Embora o próprio Batch First seja um mecanismo e não uma API, ele usa e depende muito do pacote Python-Chess , que é uma API incrível.

A compilação JIT do Batch First e o uso de matrizes NumPy para representar placas, permite uma interface Python mais prática (pelo menos uma ordem de magnitude mais rápida) para uso real em um mecanismo de xadrez.

O núcleo do mecanismo é um algoritmo de busca k-best-first-zero-window usado para avaliar RNAs em lotes.

Divulgação completa, sou o autor do mecanismo Batch First.

Sam Ragusa
fonte
-1

Aqui há uma versão portuária do Stockfish em .Net: https://github.com/bpfliegel/Portfish

Para usar esse mecanismo (uma vez compilado), você precisará de uma GUI como Arena http://wwww.playwitharena.com ou ScidVSPC http://scidvspc.sourceforge.net . Esses aplicativos são usados ​​para fornecer uma interface agradável e permitir que você carregue jogos / posições, analise-os (tenho certeza de que você pode carregar um jogo no pgn e analisá-lo por um mecanismo com critérios como "n segundos por movimento" ou " n dobras por jogada "), executar correspondências entre os motores, etc.

Em (quase) todo mecanismo de xadrez, você deve encontrar algo como um arquivo uci.cs ou xboard.cs comprometido com esta tarefa de comunicação.

(Um "mecanismo de xadrez" é um programa capaz de jogar xadrez, mas sem interface gráfica. A maneira como se comunica com aplicativos como Arena ou ScidVSPC é pelos protocolos UCI ou xboard. A maioria dos programas de xadrez é escrita dessa maneira, portanto o desenvolvedor pode esquecer as coisas da GUI e se concentrar no "cérebro").

Emilio Díaz
fonte