Jogo de Xadrez

8 respostas
J

Pessoal,

Iniciei o desenvolvimento de um jogo de xadrez em 12/2010.
Eu era fanático por Xadrez até no ensino médio. para conferir podem procurar no google por “Xadrez Jean Victor Zunino”, vai aparecer alguns resultados do Clube de Xadrez de Blumenau( http://www.cxblumenau.com.br ).

A idéia inicial era primeiramente fazer um jogo de xadrez para se jogar em dupla. Não encontrei nenhum software/site que possibilitasse essa forma de jogo.
O jogo de xadrez para se jogar em dupla é conhecido por Xadrez Australiano, lá fora é chamado de BUGHOUSE.
Jogado em dois tabuleiros por duas duplas. Um conduzindo as brancas e seu parceiro as pretas.
A característica especial deste jogo é que as peças que você capturar são transferidas para o seu parceiro, que está jogando com as peças de cor opostas as suas.
Você pode soltar uma peça que você recebeu em uma casa vazia e isso conta como um lance.
A maioria jogam com relógios para ser mais rápido, cada tabuleiro tem um relógio e o primeiro que estourar seu tempo de raciocício, perde.

Parei de desenvovê-lo, pois preferir dar preferência para a universidade. Mas um dia pretendo continuá-lo.

Está OK:
As validações dos movimentos de cada peça estão ok.
A identificação do check está OK.
A identificação de quando o jogador se coloca em check está OK, quando acontece isso volto o estado anterior do tabuleiro.
Foi implementado uma tela simples que possibilita a iteração do jogador, mas sou péssimo em design.

Está Faltando:
Validar o Rock.
Identificar quando não se pode fazer o rock.
validar o el-Passant.
Identificar quando não se pode fazer o El-Passant.
Identificar o check mate.

Observei que muitos publicaram dúvidas, até questionando como implementar os movimentos, outros questionando sobre IA do jogo.
Para implementar uma IA, levaria um bom tempo, pois envolve vários fatores, até pensei nessa idéia como TCC, mas o coordenador do curso falou que eu teria que ter uma boa justificativa pois podemos encontrar algumas prontas já.

Publiquei o código em:
http://code.google.com/p/jjchessgame/

Quem quiser colaborar, posta aqui(me informa o e-mail do g-mail) ou me manda um e-mail([email removido]), que coloco permisão para commit lá.

Att,
Jean Victor Zunino

8 Respostas

V

Dê uma olhada esse site:
http://elemarjr.net/2010/12/30/escrevendo-um-engine-para-xadrez-parte-1-bitboards/

A série de posts deve ir até a parte 13, se não me engano. Mas ensina a montar um jogo de xadrez de A até Z.

J

Legal a sua iniciativa de se fazer um jogo de xadrez.

No meu TCC eu fiz uma maquina para jogar xadrez, e realmente foi mais difícil do que eu imaginava no começo.

Fazer essas validações básicas das regras do jogo de xadrez é a parte mais simples, essas são a casca básica para se começar a criar a engine, mas o que realmente dá trabalho(e muuuuito trabalho)
é tornar a função de avaliação inteligente, avaliando e dando um peso real para cada tabuleiro passado. Pois a função de avaliação, além de já ser por si só extremamente complexa, muda os pesos dos parâmetros nas aberturas, medio jogo e finais.

No meu programa eu usei o padrão, poda alpha-beta e mais um conjunto de algoritmos para eliminar ramos não promissores, mas isso não foi trabalhoso
como tinha pensado antes.

Na fase de abertura, eu criei um livro de aberturas(lista de objetos de partidas carregadas no load do programa ), onde a engine buscava a melhor escolha e depois a função de avaliação dava um peso para ver se obedecia as regras básicas de desenvolvimento(rei seguro, dominação central e desenvolvimento rápido das peças).

O meio do jogo, a parte mais complexa do jogo de xadrez, priorizei a função de avaliação maximizando a corta de ramos não promissores, mas o problema disso foi que se perde o poder de fazer a engine encontrar combinações ótimas, mas foi necessário fazer isso porque o processamento estava muito pesado.

No final do jogo eu implementei alguns algoritmos de tipos de finais simples (rei contra rei e peões, rei contra rei e torre, rei contra rei e rainha). Gostaria de ter tido mais tempo para implementar outros tipos de finais. Para sanar a falta de algoritmos de outros finais de peças, eu tentei melhorar os pesos da função de avaliação para não cometer erros básicos.

Então, no final eu notei que o processamento do meu jogo era muito alto, e que a minha modelagem e arquitetura do jogo não foi a mais profissional possível. Mas mesmo assim a engine conseguia jogar um jogo no nível de básico para intermediário, e fiquei contente porque consegui fazer isso em apenas 1 ano inteiro.

Se você pretende fazer uma engine profissional, para ganhar de qualquer um em um clube de xadrez, te diria para procurar algum projeto com um bom livro de aberturas, vários algoritmos de finais, e se concentrar apenas no meio do jogo maximizando a função de avaliação.

A dica do vinigodoy é ótima, principalmente usando bitboard, pois isso melhorou demais o processamento da engine.

V

Xadrez foi o primeiro jogo que programei.
E fiz isso usando pascal, há mais ou menos 15 anos atrás.

Também foi o primeiro algorítmo de IA que eu escrevi que me venceu.
Mas nunca fui um grande jogador.

Foi fazendo o jogo que acabei aprendendo as aberturas, vendo as estratégias do meio de jogo e conhecendo detalhes como o empate por xeque infinito.

J

ViniGodoy, você que é mestre nessa área de jogos, queria te perguntar se você conhece alguma chess engine que em vez de usar busca competitiva(poda alpha-beta e tals) utilize redes neurais, logica fuzzy ou algoritmos genéticos ?

O máximo que encontrei foi um projeto totalmente fechado, em uma faculdade americana, que me lembro, que estava usando algoritmos genéticos para encontrar as melhores soluções em alguns tipos de finais. Você que conhece bem de jogos, sabe se existe alguma engine criada usando Inteligência Computacional em vez de busca competitiva ?

V

Não conheço, mas minha linha de pesquisa é mais computação gráfica e não tanto IA para jogos.
Posso perguntar pra um pessoal que conheço que estuda essa outra linha.

J

A única referência interessante que achei de inteligência computacional usado em xadrez foi a descrição dessa pesquisa,
que dá uma idéia inicial apenas de algoritmos genéticos em um tipo de final de rei e peão. O link é esse:

http://www.cs.utah.edu/~wyman/classes/ML_proj/paper.html

Claro que fazer a parte de finais usando algoritmo genético seria por diversão, porque já existe EndGame tablebase de finais de xadrez
com 6 peças pronta, e nesse caso a máquina jogaria no nível da perfeição sem cometer deslizes.

Mas voltando ao tópico, para quem está iniciando sua própria chess engine, um link que me ajudou muito foi esse:

http://rybkaforum.net/cgi-bin/rybkaforum/topic_show.pl?tid=2432

J

Pessoal,

Obrigado pelas dicas.
Realmente reconheço que construir uma engine para o xadrez não é simples, já havia lido em vários fóruns e artigos, sobre IA para o jogo, sobre rede neural, sobre busca em biblioteca no início do jogo.

Mas a minha idéia, como eu disse, seria criar um jogo de xadrez para se jogar em rede, em dupla(xadrez australiano), portanto,à príncipio não precisaria de IA. Seria tipo o projeto josé, mas pra jogar em dupla, com as regras do xadrez australiano. Eu acredito que ficaria legal, não conheço nenhum site/programa que faça isso.

Mas já pensei sobre Engine para xadrez como TCC(não sei se seria aceita como proposta). Mas esse semestre estou vendo a matéria de IA no curso, então quem sabe fica um pouquinho mais simples caso eu resolva fazer.

Mas antes de eu fazer alguma coisa, vou melhorar o código. Não sei se vocês viram no google code, mas ta meio complicado pra entender…

J

Implementei alguma coisa baseado em Heurística.
Agora o aplicativo mostra quem possivelmente está melhor.
Ainda falta algumas validações como:
Roque e El-passant.

Segui alguns tutoriais:
http://www.conteudo.org.br/index.php/conteudo/article/view/47 - PDF em anexo

http://pt.wikibooks.org/wiki/Xadrez/Estrat%C3%A9gia

Atualizei o código no google code.

Criado 6 de agosto de 2011
Ultima resposta 2 de dez. de 2011
Respostas 8
Participantes 3