Qual paradigma usar para escrever um mecanismo de xadrez?

9

Se você fosse escrever um mecanismo de jogo de xadrez, que paradigma de programação você usaria (OOP, procedural etc.) e por que você o escolheria? Por mecanismo de xadrez, quero dizer a parte de um programa que avalia a placa atual e decide a próxima jogada do computador.

Estou perguntando, porque achei que seria divertido escrever um mecanismo de xadrez. Ocorreu-me que eu poderia usá-lo como um projeto para aprender programação funcional. Ocorreu-me então que alguns problemas não são adequados ao paradigma funcional. Ocorreu-me então que isso poderia ser uma boa discussão.

cutucar
fonte
11
Isso é semelhante a escrever um compilador C do zero. Eu não reinventaria a roda. Eu estudaria os existentes primeiro.
Job
10
@ Job: Meu objetivo é o processo e não o resultado. Mesmo se eu acabar com um mecanismo muito ruim, acho que poderia haver valor no processo de analisar o problema e desenvolver uma maneira de atacá-lo, especialmente se eu aprendesse alguns novos métodos de programação no processo.
cutuca
11
Boa sorte. Nenhum empregador de verdade jamais pedirá para você desenvolver um a partir do zero, mas durante uma entrevista ele poderá perguntar como você atacaria o problema.
Job
6
@ O emprego de uma grande parte da adoção da vida de programação está codificando as coisas não porque há uma necessidade definida delas, mas porque você pode.
11
@ Mark, que tal abraçar a vida;) = viagens, idiomas, teatro, poesia, atividades ao ar livre, etc.? Eu gosto de programar, mas quando não estou fazendo isso por si só, tenho 1000 outras coisas para fazer.
Job

Respostas:

7

Até onde eu sei, a avaliação não é um problema paralelizável, mas avaliar diferentes cadeias é, então eu definitivamente a escreveria para fazer uso de múltiplos núcleos e multithreading.

Quer você seja funcional ou semi-funcional, é uma questão de gosto. Pessoalmente, eu faria OOP e usaria o suporte para programação funcional e paralelização que existe, por exemplo, em C #

Em uma nota de rodapé, se eu escrevesse um mecanismo de xadrez, tentaria criar um que realmente pudesse "pensar" no xadrez. Usando a avaliação do tabuleiro para a força bruta, todas as combinações possíveis foram feitas até a morte e extremamente bem, mas não houve muito progresso no desenvolvimento de um mecanismo de xadrez mais pensado / confuso. Isso seria um desafio! :)

Encontre alguns jogos com jogadas de posição realmente complicadas e movimentos fortes (marcados! Ou !!) e use-os para treinar e testar seu motor.

Homde
fonte
2

Eu acho que depende de seus objetivos, que eu tomo são estritamente didáticos. Se você estava tentando escrever um produto competitivo, desejaria eficiência máxima nos avaliadores de nível mais baixo. Muitas oportunidades para o paralelismo no nível de bits aqui. Também muitas oportunidades para tabelas de hash. Também oportunidades para explorar o paralelismo. Então, nos níveis mais altos, você provavelmente deseja um sistema bom para IA, o que provavelmente significa um idioma de programação funcional. Obviamente, você não deseja fazer todas essas coisas, escolher uma ou duas delas e se contentar com o fato de que seu projeto não será competitivo com os melhores programas.

Omega Centauri
fonte
2

Eu escolhi o paradigma OOP no meu mecanismo de xadrez chamado The Turk . A primeira versão do meu mecanismo de xadrez foi escrita mais processual do que OOP.Então, achei muito difícil melhorar meu mecanismo de xadrez por causa dos longos blocos de código e do design deficiente.

Depende do que você deseja obter ao escrever o mecanismo de xadrez. Se você deseja criar um mecanismo de xadrez muito forte, não é possível fazer isso em idiomas OOP por causa de ligações tardias lentas. Se você quer apenas aprender programação e também se divertir escrevendo motor de xadrez, então as linguagens gerenciadas e o OOP serão seus amigos. Eu posso sugerir que você escolha C # porque também é possível escrever um mecanismo de xadrez de maneira mais processual.

Sangue fresco
fonte
Como classifica o ELO? Comparado com Crafty?
@ Thorbjørn Ravn Andersen - Crafty, um dos melhores mecanismos de xadrez de código aberto, escrito em C e pelo Dr. Robert M. Hyatt, que passou a vida na programação de xadrez. Infelizmente, não testei a classificação elo porque ainda há muitas coisas a fazer antes da classificação elo. Atualmente, avaliar é apenas avaliar os valores das peças, para que tenha uma avaliação bastante fraca e ainda não implementei todos os algoritmos necessários. Infelizmente, não tenho tempo para gastar neste projeto no momento. Espero que um dia seja possível continuar.
Freshblood
ah desculpe, eu pensei que poderia realmente jogar. Foi mal.
@ Thorbjørn Ravn Andersen - Eu publiquei algumas versões e o último conjunto de alterações do repositório pronto para compilar. Eu só queria dizer que é bastante fraco no momento.
Freshblood 11/01
2

Criei um programa simples de xadrez como meio de aprender a quarta língua. Acabou sendo um ótimo ajuste para esse problema imperativo, e eu aprendi muito. A pilha aberta me permitiu implementar a pesquisa alfa-beta de uma maneira única, o que me proporcionou uma maior compreensão do algoritmo.

Alguém poderia pensar que a programação funcional seria ótima para programas de xadrez, uma vez que os algoritmos principais (pesquisa alfa-beta em profundidade, primeira avaliação, avaliação) são recursivos e funcionalmente rigorosos. No entanto, um programa de xadrez vive e morre com eficiência e nenhuma das culturas atuais de linguagens funcionais tem esse objetivo. Os cem principais mecanismos de ponta usam linguagens imperativas (principalmente C / C ++ e depois Delphi) para ter o máximo controle sobre o uso da memória, multiencadeamento, estado global e geração de código. Todas as linguagens funcionais usam alocação dinâmica de memória para estruturas de dados principais, que são a morte de um programa de xadrez.

Ainda gostaria que alguém tentasse invadir os 100 principais mecanismos de xadrez usando uma linguagem funcional.

Ian Osgood
fonte