Melhor abordagem para escrever um mecanismo de xadrez? [fechadas]


15

Sou um entusiasta do xadrez e programador. Recentemente, decidi começar a fazer um mecanismo de xadrez usando meus conhecimentos de xadrez e programação. Então aqui está a minha pergunta:

Qual linguagem (eu estou familiarizado com Java, C ++ e Python) e metodologia devo adaptar ao escrever um mecanismo de xadrez?

Um pouco de orientação seria muito apreciado.

Editar:

Então eu decidi fazê-lo em JavaScript. Eu baixo essa interface do Xadrez do github e agora estou pronto! Meu primeiro passo seria escrever movimentos legais para isso. Então, alguém pode me apontar na direção certa? (Eu sou novo no jQuery, mas tenho muita experiência em programação).

PS: Não estou tentando criar um mecanismo muito eficiente (sei que é muito difícil), só quero me familiarizar com o processo e aprender algumas novas técnicas ao longo do caminho.


5
Qualquer linguagem e metodologia convencionais serviriam, nada de especial em um mecanismo de xadrez (nesse sentido).
yannis

3
Eu seria mais específico sobre objetivos. Se você quiser resumir tudo a uma série de regras, é uma grande tarefa, mas qualquer programador pode resolver isso da maneira da força bruta. Se você deseja abordar questões como reconhecimento de padrões ou ponderação de risco versus recompensa, é aí que as respostas podem ser satisfatórias.
precisa saber é o seguinte

Você já conferiu a seção Pedagógica no wiki do Chess Engine. Estes parecem ter como objetivo específico ensinar a programação de xadrez e são todos de código aberto. Mesmo se você não usar o código fonte real a documentação normalmente irá explicar o que está por trás do desenvolvimento: en.wikipedia.org/wiki/Chess_engine#Categorizations
user60812

1
A parte mais difícil é como avaliar uma determinada posição, porque você precisa ver se a posição A é melhor que a posição B para escolher.

1
Não está nada claro o que você quer saber. Você decidiu uma representação de uma posição? Nesse caso, o próximo passo é escrever e testar um gerador de movimentos. Não sabe o que você acha que o jQuery tem a ver com isso.
Kevin cline

Respostas:


19

Jogador de xadrez com classificação 2072 aqui. Eu criei este site em JavaScript puro durante um fim de semana. Não é um mecanismo de xadrez (eu o projetei para criar posições de abertura divertidas como uma espécie de mecanismo perverso do Chess960), mas é um ponto de partida. O código fonte está aqui .

Existem muitas complicações envolvidas na criação de uma placa funcional. Esses incluem:

  • Primeiro, descobrir como representar os movimentos legais básicos. Você tem que fazer matemática com as coordenadas de início e fim. Por exemplo, com movimentos de torre, uma das coordenadas deve ser a mesma antes e depois. Com movimentos de cavaleiro, a soma do valor absoluto das mudanças de coordenadas deve ser 3 e as duas coordenadas devem mudar. Com os movimentos do bispo, a soma das coordenadas permanece a mesma ou as duas aumentam na mesma quantidade. Os peões são mais complicados porque você não só precisa descobrir se eles podem mover dois quadrados ou um (verifique a linha e a cor em vez de armazenar quantos movimentos eles fizeram), mas também precisa lidar com toda a captura - na diagonal, mover coisa para a frente.
  • Capturar é um desafio por causa dos peões e do cheque. Você não pode simplesmente dizer que, se uma peça se move para o quadrado de outra peça, é uma captura. Afinal, os peões não podem se mover para o quadrado de outra peça para capturar - eles têm sua própria maneira especial de capturar.
  • Você precisa descobrir uma maneira eficiente de ver se as peças inimigas estão no caminho do movimento de uma peça para decidir se é legal ou não.
  • É difícil lidar com o cheque. Depois de cada jogada, você deve verificar todos os quadrados para os quais as peças inimigas podem ir e ver se uma delas envolve o seu rei e, nesse caso, é uma jogada ilegal.
  • Castling, passante, promoção, empate, empates forçados, repetição - nada disso é trivial de lidar, dada a escala do problema.

Todos os mecanismos de xadrez funcionam olhando para todos (possivelmente um subconjunto heuristicamente determinado) dos movimentos legais em uma posição e avaliando os números para representar seus valores relativos, fazendo esses movimentos e fazendo recursivamente o mesmo para as posições resultantes. Seus problemas gêmeos aqui são

  • Como armazenar esses dados com eficiência
  • Como prosseguir com essa pesquisa recursiva - afinal, você não pode deixá-la continuar para sempre, então você precisa colocar um limite e descobrir como projetar seu algoritmo para fazer a pesquisa mais otimizada e completa dentro desse limite. Por exemplo, você quer ter certeza de que ele oferece alguma avaliação para cada movimento inicial possível, mas também pode gastar mais tempo avaliando movimentos mais promissores, em vez de dedicar uma quantidade igual de tempo a cada movimento.

Tudo isso além de projetar o algoritmo em primeiro lugar, com informações disponíveis em abundância.

Quanto a qual idioma usar (embora eu ache que você já tenha decidido o JavaScript), acho que depende mais do seu objetivo do que qualquer outra coisa. Eu queria fazer o meu online (e melhorar o JavaScript), então o JavaScript foi a minha escolha. Qualquer linguagem de programação orientada a objetos o fará.

Depois de se sentir confortável com o que está fazendo, os seguintes recursos provavelmente serão realmente úteis:

Boa sorte!


Muito obrigado, certamente me ajudou muito a começar. Embora ainda haja muito a aprender e implementar, os mecanismos de xadrez nunca são fáceis de escrever. Mas acho bom trabalhar com algo que você ama!
Adnan Zahid

Concordo. Eu queria ter um currículo realmente diversificado de projetos, mas honestamente, eu apenas gosto de desenvolver mais as coisas do xadrez.
Andrew Latham

O domínio lathamcity.com está atualmente à venda. O código agora está disponível em outro site?
IkWeetHetOokNiet

14

O problema com o "programa de xadrez" como conceito é que existem muitas peças que podem absorver muito tempo e não necessariamente interessam a você no momento. Você pode passar anos trabalhando apenas em gráficos, ou em uma pesquisa alfa-beta ou em uma visualização para ajudar a desenvolver o mecanismo de pesquisa, ou ... bem, existem muitas peças.

Eu recomendo encontrar um programa de xadrez de código aberto (deve haver muitos) e começar a melhorar as partes que mais lhe interessam. Você pode eventualmente substituir o programa inteiro, uma função de cada vez, ou aprender o suficiente e estar motivado para jogá-lo fora e criar seu próprio programa a partir do zero. De qualquer forma, a chave é iniciar a "luz" e aprender as cordas antes de tentar arquitetar um programa inteiro.


Conformidade com um dos protocolos de interface estabelecidos, você pode usar qualquer interface existente com seu mecanismo.

Espero alfa anos beta não demorou para escrever
Kevin

1
Não anos de escrever, mas anos para Grokar :)
ddyer

9

Se você está familiarizado com as regras do xadrez, um bom ponto de partida sobre técnicas básicas é http://www.frayn.net/beowulf/theory.html Uma extensa coleção de materiais e links que você pode encontrar aqui: http: // chessprogramming .wikispaces.com / E terceiro: aprenda com o código de outras pessoas. Dê uma olhada nas fontes de Crafty . É o principal mecanismo de código aberto. Muito importante será pensar nos casos de teste, para ver se você faz melhorias: Comece por exemplo com algumas posições simples e fáceis de final de jogo com 3 ou 4 figuras.


3

Como mencionado, não há nada terrivelmente difícil em construir um mecanismo de xadrez. Talvez você deva se concentrar em como deseja usar e (potencialmente) implantar esse aplicativo, pois isso provavelmente determinará sua escolha de idioma.

Se este é apenas um exercício divertido, convém codificá-lo em Javascript e implantá-lo como uma página da web. Se você nunca quiser transformá-lo em um jogo de xadrez experiente, pelo menos outros poderão jogar com ele e seu código-fonte.

Se você deseja aprender uma tecnologia específica ao mesmo tempo, digamos WPF, essa pode ser uma boa maneira de matar dois coelhos com uma cajadada só. O MVVM pode ser um exagero para este aplicativo, mas você aprenderá pelo menos.

Se você deseja segmentar dispositivos Android, o Java seria uma boa escolha. Da mesma forma, Objective-C para dispositivos iOS.

Longo e curto, a escolha do idioma não existe no vácuo.


3

Suponho que você já conheça o conceito de Min-Max, árvores e poda, heurística e outras noções básicas e o que escrevo aqui são apenas alguns detalhes que podem ter sido subestimados.

Na companhia de um amigo, escrevi nosso próprio mecanismo de xadrez algumas vezes atrás. Compartilho algumas questões e idéias que tivemos e espero que você as ache úteis.

Como nós dois éramos programadores de Java, nossa linguagem transformou-se em Java e começamos com uma abordagem orientada a objetos. Peças eram objetos, tabuleiro era objeto, arquivos e fileiras (linhas e colunas na literatura de xadrez) eram objetos. E isso estava errado. A sobrecarga era enorme e o programa estava lutando para ir além de 2 movimentos (4 dobras) na árvore de pesquisa.

Assim, com algumas pesquisas, acabamos com uma idéia brilhante (embora não a nossa!): Representar peças e tabuleiro como números inteiros longos (64 bits). Isso faz sentido porque um tabuleiro de xadrez tem 64 quadrados. O resto foram operações um pouco sábias (rodando muito perto da CPU = extremamente rápido). Por exemplo, considere um número inteiro binário de 64 bits no qual os que estão apresentando os quadrados no quadro que sua peça pode atacar. Agora, se você executar um "AND" lógico entre dois números como esse, um resultado diferente de zero indicará que você tem um quadrado com atacantes. Existem várias maneiras de apresentar o tabuleiro e as peças de xadrez:

1 - Decida sobre a sua apresentação no quadro

Então você precisa e abrir o banco de dados. A abertura do xadrez é de alguma forma resolvida e é altamente recomendável ter um livro de abertura. Nesse caso, você tem muito tempo extra em jogos de blitz.

2 - Encontre um livro de abertura.

Fizemos isso, mas ainda estávamos longe de ser bons:

3 - Um bom motor de xadrez deve ser capaz de ver 6 movimentos (12 dobras) à frente.

Então o que fizemos então foi usar o tempo morto (se é um mecanismo humano versus computador).

4 - Use o tempo em que o oponente está pensando em criar alguns níveis da sua árvore.

E ainda estávamos longe de 12 dobras. Com mais estudos, descobrimos alguns truques! Por exemplo, foi sugerido pular uma dobra da árvore e começar da seguinte (como se não houvesse oponente). A idéia é que, se um movimento é extremamente idiota, por que perder tempo e ver quais são as respostas dos oponentes a esse movimento? No entanto, um bom mecanismo deve ser capaz de distinguir entre movimento idiota e sacrifício da rainha genial.

5 - Aprenda os truques de programação para este problema específico (xadrez).

Eu e meu amigo, nesse estado, ainda éramos ruins: / O que poderíamos fazer - e parcialmente fizemos - foi salvar as posições calculadas. Se você calcular uma posição, salve-a para o futuro! O mesmo vale para loops na árvore de pesquisa. O objetivo era salvar / recuperar de forma eficiente:

6 - Salve os dados que você gerar ... Eficientemente!

e finalmente:

7 - Código com otimização máxima.

Esse problema é extremamente caro, tanto no tempo como na memória da CPU. É muito importante escrever seu código com muita eficiência. Lembre-se de que estamos falando do fator de ramificação 35. Isso significa que um "se" inútil em algum lugar da sua heurística pode se transformar em um 3.3792205e+18"se" inútil em algum lugar profundo da sua árvore de pesquisa.

A programação de xadrez é um desafio muito muito interessante e é o momento de colocar seus recursos de programação em um teste sério. Há mais alguns pontos que posso sugerir, mas tenho certeza que você os descobrirá por si mesmo. Há muitos outros pontos que eu não sei, mas você pode encontrá-los na internet!

Boa sorte e divirta-se!

ps Eu não conheço javascript muito bem, mas algo está me dizendo a base da dificuldade do problema, talvez, considerando tudo o que o C ++ possa oferecer, seria melhor descartar o javascript e fazê-lo em C ++.


2

De acordo com sua edição, você está pronto para definir movimentos "legais".

Existem duas maneiras de descrever jogadas no xadrez. Notação descritiva e notação algébrica . O que você provavelmente quer é uma função que tome a peça, a posição inicial e a posição final como parâmetros. por exemplo. O Knight de QN1 a QB2 é inválido, mas o Knight de QN1 a Q2 é válido. Pensando nisso, a notação algébrica pode ser mais simples devido à capacidade de calcular facilmente o posicionamento 'relativo'.

Para garantir que você esteja escrevendo a quantidade mínima de código necessária, eu começaria escrevendo testes para essa função primeiro . Se você estiver usando notação algébrica, provavelmente não precisará de um teste por peça / início / fim. Faça com que cada teste funcione e refatore a duplicação antes de passar para o próximo 'movimento'. Seu código terminará mais limpo.

Depois de cobrir suficientemente os movimentos legais e ilegais de cada peça, eu começaria a adicionar testes para outras variáveis ​​(como mover um rei para as condições de 'check' e 'mate').

Eu recomendo o qunit para testes de unidade e o jasmim para testes comportamentais em JavaScript.


1

Na verdade, eu escrevi um mecanismo de xadrez. Prepare-se para um deleite e um pesadelo. Quando meus amigos e eu fizemos isso, foi em um concurso de programação cronometrada e a linguagem que decidimos seguir era o Java. Eu sinto que Java ou C é sua melhor escolha, mas vejo que você decidiu usar o Javascript. Eu realmente não posso bater porque não estou familiarizado com isso.

O principal problema aqui será que existem tantos cenários de movimento / vitória em cada peça que você precisa levar em consideração, por isso recomendo que você escreva todas essas situações possíveis para cada peça antes de começar a codificar. Se pular sem planejar, esse projeto divertido será uma tarefa repetitiva. Mas essa é realmente a principal coisa. Apenas planeje fora do código primeiro e verifique se você obtém todos os cenários de uma peça de cada vez.

Boa sorte


1

Para a parte de decisões do jogador do computador, não posso recomendar o suficiente o livro "Inteligência Artificial: Uma Abordagem Moderna" (site do livro http://aima.cs.berkeley.edu/ ). Dependendo do seu conhecimento em matemática (a teoria dos grafos ajuda), pode ser um pouco alto, mas é escrito da maneira mais simples possível, e contém uma visão geral (e alguma profundidade) das técnicas para faça programas decidirem coisas.

Ele indicará coisas para você, como declarar uma meta (por exemplo, xeque-mate ou nulo), avaliar a proximidade de um determinado estado (layout da placa) com essa meta, como gerar os diferentes estados possíveis a partir do atual e como atravessar o que é um imenso espaço problemático.

Uma coisa que pode ajudar na criação de um algoritmo de IA é descobrir como decidir qual jogada jogar a seguir, como se você tivesse todo o tempo do mundo, começando em uma situação muito próxima a um jogo ganho. Você o otimiza para encontrar uma solução em um período de tempo razoável (horas) e, em seguida, encontra maneiras de escolher um caminho vencedor, mesmo que ainda não tenha explorado todos os resultados, para poder realmente interromper o "pensamento" para um turno vale a pena.

Somente então eu procuraria otimizar a representação para acelerar os cálculos individuais, como o uso de números inteiros longos, conforme sugerido. Não importa a rapidez com que você possa fazer uma comparação única, se a maneira como percorrer o espaço do problema não tiver uma boa heurística, levará anos para isso.


0

Você pode realmente ir da maneira que quiser, mas estes são meus pensamentos sobre o assunto:

Eu usaria Java, pois isso permite que você seja de alto nível e tenha bibliotecas de interface do usuário (AWT, Swing) à sua disposição direta. Você pode usar uma abordagem orientada a objetos para modelar o tabuleiro e as peças de xadrez. Outros objetos podem substituir o histórico e a pontuação dos movimentos. Até os jogadores podem ser objetos e, no futuro, você poderá estender sua Playerclasse para fornecer um reprodutor de computador inteligente e artificial.

Você pode dar uma olhada no MVC (Model-View-Controller) pois é uma abordagem muito boa nesse caso para vincular seus objetos de modelo (modelo de domínio) à interface do usuário (visualização) e permitir que o usuário manipule o modelo (através do controlador).

Você também pode aplicar o desenvolvimento orientado a teste , que não apenas garante que todos os métodos se comportem da maneira que você espera, mas também obriga a escrever um código modular testável.


4
Um mecanismo de xadrez não tem nada a ver com a interface do usuário, apenas a "mente", que calcula a melhor jogada.
CSE

@ CSE - Depende da sua definição de mecanismo .
Daniel AA Pelsmaeker

@CSE - Como mostra a edição de Adnan, ele também estava procurando uma interface do usuário. Então, minha resposta é relevante.
Daniel Daniel Pelsmaeker

-8

As próprias regras do xadrez são bastante simples. Você só precisa criar uma matriz (matriz bidimensional) para o quadro e encontrar uma maneira de codificar os conceitos das peças, as regras de movimento de cada peça, a validação de que um movimento é legal e as condições que sinalizam o fim do jogo. Nada de particularmente difícil nisso. Você deve usar qualquer idioma com o qual esteja mais familiarizado.

Agora, se você quiser criar uma IA de xadrez que assuma o papel de um dos jogadores, é aí que as coisas ficam complicadas. Mas, novamente, a escolha do idioma não é o maior problema aqui; é entender os princípios de IA envolvidos. Esse será um fator muito mais importante.

(Dito isso, esse tipo de tomada de decisão pode ser extremamente intensivo em termos de computação, e você provavelmente desejará usar algo que compila o código nativo em vez de uma linguagem de script. E o C ++ é uma escolha muito ruim, não porque não esteja bem. - adequado a esse problema, mas simplesmente porque é uma linguagem muito ruim em geral, e tentar implementar coisas complexas é uma boa maneira de codificar todos os tipos de dores de cabeça para você.)


15
Eu acho que você teria que ser um pouco mais específico sobre por que o C ++ é inadequado para essa tarefa em particular, a fim de evitar conflitos sagrados.
precisa saber é o seguinte

9
-1 pela tentativa de iniciar uma guerra santa.
Doc Brown

1
Por que você acha que o C ++ é uma linguagem muito ruim em geral?
Anthony

Eu acho que você certamente o entendeu errado. Eu, pelo menos, compartilhe sua opinião, C ++ é uma boa linguagem para começar, mas torna-se uma dor quando você está lidando com coisas complexas!
Adnan Zahid
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.