quarta-feira, 28 de setembro de 2011

IA de dama

Sob justificativa de 'treino', decidi fazer um jogo de damas com IA, por ser um jogo (relativamente) simples e sem muitas restrições, assim eu afio um pouco a minha programação, só que surgiu um problema, as regras 'brasileiras' dizem que se houver a possibilidade de capturar uma peça do oponente, ela deverá ser feita obrigatoriamente, até ai tudo bem, eu já fiz essa verificação, mas de 1 única peça, a regra também diz que isso deve ser feito de forma a capturar a maior quantidade de peças possíveis, foi ai que eu travei, como fazer um algoritmo que verifica todas as possibilidades de deslocamento (lembrando que na captura 'múltipla' uma peça pode andar para trás).

Wikipedia escreveu:Damas do Brasil
Dama sem captura: A dama move-se em diagonal, percorrendo as casas vagas que quiser, para diante ou para trás, não tomando no seu percurso qualquer peça de cor contrária e não podendo mudar dessa diagonal.
Dama com captura: Se em sua diagonal houver uma outra peça, sendo essa da cor adversária, a captura só pode ser efetuada se houver uma ou mais casas vazias após a peça adversária, sendo assim, a jogada é obrigatória. A dama não é obrigada a ficar uma casa após a peça capturada.

http://pt.wikipedia.org/wiki/Damas
Em outras palavras, eu procuro ajuda em um algorítimo que faça isso:


Expandir esta imagem


Eu só consegui fazer ele verificar pra cima 2 casas de movimento, sempre na diagonal (tanto faz o lado), só que é um algorítimo 'burro', nessa situação por exemplo ele captura 2 peças pretas, ignorando as outras da seqüência.

Eu pensei em fazer de modo 'manual', por exemplo, ao capturar uma peça, a jogada não é passada ao oponente, ela continua sendo a do jogador desde que ainda exista uma possibilidade de captura (em qualquer direção que seja, só 4 na realidade), com isso a programação fica mais 'light', só que novamente volta ao algorítimo 'burro', pois a jogada com a maior quantidade de capturas DEVE ser obrigatória, ou seja, estou procurando por um algorítimo que seja capaz de pular as casas 'procurando' as possibilidades, se não der certo serei obrigado a fazer de modo manual.

Estou usando verificação de 'locais vazios' para a programação, as peças são objetos dinâmicos, ou seja, são os mesmos, mas 'funcionam' de forma diferente. Ao clicar na peça, uma variável ganha o ID dela e pela função with eu consigo capturar e mover peças. Achei relativamente fácil até agora, fiz boa parte das regras do jogo, falta somente essa de capturar 'múltiplas' peças do oponente e a movimentação da 'dama' (que pode se movimentar por mais de 1 casa na mesma diagonal) que creio não será nada complicado.

O código até agora está assim:

CÓDIGO:
if place_free(x+48,y-48) or place_free(x-48,y-48)
pos_ok=1
else
pos_ok=0

if (pos_ok and aperta) {

if place_free(x+48,y-48) {
op_disp_1=1

if (mouse_x>x+24 and mouse_xy-72)
opcao_1=1 else opcao_1=0

} else { op_disp_1=0; opcao_1=0 }



if place_free(x-48,y-48) {
op_disp_2=1

if (mouse_xx-72) and (mouse_yy-72)
opcao_2=1 else opcao_2=0

} else { op_disp_2=0; opcao_2=0 }

} else {
op_disp_1=0;
opcao_1=0;

op_disp_2=0;
opcao_2=0;
}

if place_meeting(x-48,y-48,obj_pretas) and place_free(x-96,y-96)
captura_1=1 else captura_1=0

if place_meeting(x+48,y-48,obj_pretas) and place_free(x+96,y-96)
captura_2=1 else captura_2=0

if (mouse_x>x+72 and mouse_xy-120) and captura_2
sel_captura_1=1 else sel_captura_1=0

if (mouse_xx-120) and (mouse_yy-120) and captura_1
sel_captura_2=1 else sel_captura_2=0

if (mouse_x>x-24 and mouse_xy-24 and mouse_ymouse=1
else
mouse=0

Nenhum comentário:

Postar um comentário