[Dúvida] Sistema de movimento de peças no xadrez

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Dúvida] Sistema de movimento de peças no xadrez

Mensagem por RafaleCP em Sex 14 Jun 2013, 13:38

Olá pessoal, trago aqui uma dúvida que provavelmente poucos ou até ninguém havia peguntado aqui... Bom, já que o GameMaker 8.1 disponibiliza uma série de "sprites" para o jogador utilizar resolvi dar uma olhada. Daí, achei sprites de peças de xadrez (ou chess, como quiserem chamar). Mas minha pergunta é: Como fazer um sistema de peças de xadrez (pra damas isso também vale). Isto é, aquela questão de quando o jogador clicar em uma peça, disponibilizar "x" movimentos (analisando se não há nenhuma peça aliada bloqueando o caminho, etc)... Se vocês me conseguirem o link de algum tutorial ou fizerem um ficarei agradecido...

RafaleCP

Número de Mensagens : 42
Idade : 17
Data de inscrição : 16/02/2013
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por luiz_eldorado em Sex 14 Jun 2013, 14:39

http://gmc.yoyogames.com/index.php?showtopic=510600

Foi o que achei. Jogos de xadrez são muito complicados, na verdade, até mesmo damas já é complicado. Mas a maior parte da dificuldade é fazer a IA.

Até mais

luiz_eldorado

Ranking : Nota C
Número de Mensagens : 928
Idade : 17
Data de inscrição : 30/07/2011
Notas recebidas : C
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://luizpontes.tk/

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por fredcobain em Sex 14 Jun 2013, 15:26

Uma grupo de funções que vai te ajudar com certeza são as funções que tratam SNAP.

Ex:

Código:
with (obj_Pieces)
    {
    if !place_snapped(32, 32)
       {
       move_snap(32, 32);
       }
    }

fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por saim em Sex 14 Jun 2013, 16:53

Cada peça, um sistema diferente. Não é pros fracos. Sem chegar perto de IA (isso é outro nível) ainda não é pros fracos. Mas vamos lá, um pouco de direcionamento, eu consigo dar.

Primeira coisa: use um esquema de grids pra determinar a posição de cada peça. Não tente usar place_meeting ou speed ou coisa do tipo. Numa array 2D, cada casa tem uma peça (ou peça nenhuma). Como você vai usar índices pra indicar qual peça está em qual casa, sugiro dar o valor de "-1" pras casas vazias. Só pra garantir que estão vazias.

Aí vem as peças. Como são apenas 64 casas, um par de loops não vai consumir muita memória. Pra maioria das casas, a condição pra um movimento válido é bem simples.

Torres e bispos são os mais fáceis:
Bispo:
if (casa . coluna - bispo . coluna == casa . linha - bispo . linha){
//válido
}
Torre:
if (casa . coluna == torre . coluna or casa . linha == torre . linha){
//válido
}
(sem contar que pode ter alguma peça entre a casa e o bicho, mas isso é outra história)

Por aí vai. Daí pra frente, dá uma piorada. Estou com pressa, mas o tópico me interessa (pra fazer um jogo BASEADO no xadrez).
Se conseguir fazer as condições do cavalo, me conte como.
Sério.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por theguitarmester em Sex 14 Jun 2013, 18:13

Me interesso com esse tópico também, acho que tentei criar só uma vez um projeto de dama, e meu nível de programação era bem menor. após isso, não tentei mais, por pensar que já existem projetos exatamente como eu iria criar, uma 'simples' dama, mas agora, faz tempo que estou sem fazer nada, talvez, quem sabe, uma hora posso tentar fazer algo.


Uma dica(parte teórica da IA), é o sistema de andar, de um jeito, que d~e para fazer previsões, dentro dos ifs, isto é calcular os movimentos a frente,


if (casa . coluna - bispo . coluna == casa . linha - bispo . linha){...
Não entendi.

theguitarmester

Ranking : Sem avaliações
Número de Mensagens : 1908
Idade : 21
Data de inscrição : 28/02/2012
Notas recebidas : B
Reputação : 80
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1
Prêmios
   : 2
   : 2
   : 1

http://guitarmester.no.comunidades.net/index.php?pagina=19362978

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por Mário Valney em Sex 14 Jun 2013, 18:25

saim escreveu:
Se conseguir fazer as condições do cavalo, me conte como.
Sério.

Uma coisa legal do cavalo: se ele está numa casa preta, obrigatoriamente, no próximo movimento ele irá para uma casa branca e vice-versa.
E o movimento se dá assim, basicamente:

• (x,y) = posição atual
• (u,v) = nova posição
ƒ 1: (x+2,y+1)
ƒ 2: (x+1,y+2)
ƒ 3: (x-1,y+2)
ƒ 4: (x-2,y+1)
ƒ 5: (x-2,y-1)
ƒ 6: (x-1,y-2)
ƒ 7: (x+1,y-2)
ƒ 8: (x+2,y-1)

Seria um loop de 8 testes só... não mata Very Happy
Ai dependendo do seu sistema, atribui uma variável que indica se a casa é "aceitável" ou então troca o sprite (tipo quando você clica na peça e brilha as casas nas quais pode jogar, entende?).

Mário Valney

Ranking : Nota A
Número de Mensagens : 203
Idade : 24
Data de inscrição : 16/11/2009
Notas recebidas : A
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://www.areaonze.com

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por Igor KinGamer em Sab 15 Jun 2013, 09:32

O que o saim colocou, "if (casa . coluna - bispo . coluna == casa . linha - bispo . linha)", é um teste para saber, digamos, se a distância horizontal do bispo até a casa é igual à distância vertical, já que ele só anda nas diagonais. O correto, na verdade, seria "if (abs(casa.coluna - bispo.coluna) == abs(casa.linha - bispo.linha))", isto é, pegar a diferença em módulo, pois ela pode ser, por exemplo, negativa horizontalmente e positiva verticalmente, e ainda assim é válido. Ele escreveu como se "casa" fosse um objeto. Na verdade, no lugar "casa.coluna", iria a variável usada no for que varreria todas as colunas.

Entretanto, me veio agora uma ideia de como fazer isso, que é como eu faria.

Do jeito que o saim falou, você precisaria de dois loops for para varrer o campo todo (ou um só, ajustando os índices com div e mod, mas isso não vem ao caso) e testar casa por casa se ela é válida para a peça. Mas aí tem a dificuldade de que, se houver alguma peça no meio do caminho, a casa já não é válida. Então, seria necessária alguma outra série de testes para descobrir isso, para cada casa supostamente válida... Haja testes.

Eu faria assim: No bispo, por exemplo, eu "caminharia" nas quatro diagonais (uma de cada vez) (ou melhor, nas duas diagonais, nos quatro sentidos, pra nenhum matemático ou físico que esteja por perto me condenar Laughing) validando cada casa, até sair do campo ou chegar numa peça (uma dessas duas condições vai ter que acontecer alguma hora).
Por exemplo, começaria indo para cima e para a esquerda, para isso, repetindo num loop os passos:
  • Diminui em um o índice horizontal;
  • Diminui em um o índice vertical;
  • Verifica se um dos dois ficou menor que zero (está fora do campo):
  • - Se sim, termina o loop;
  • Verifica se há alguma peça na casa representada pelos novos índices (isto obrigatoriamente após verificar se não está fora do campo; caso contrário, você tentaria acessar a array com índices fora dos limites);
  • - Se sim, verifica que peça é, faz o que for devido e termina o loop;
  • Fim da iteração, isto é, se chegar aqui, valida a casa e vai para a próxima iteração.
Depois, semelhantemente, um loop para cima e para a direita, um para baixo e para a esquerda e, por fim, um para baixo e para a direita.

A mesma coisa para a torre e a rainha (únicas outras peças que se movem livremente), só que, obviamente, ajustando os loops de acordo com a peça.


Eu comecei a ter uma ideia de um jogo baseado no xadrez, mas depois pareceu que não daria muito certo... Com o incentivo deste tópico, vou voltar a pensar naquela ideia, hehe.

Igor KinGamer

Número de Mensagens : 890
Idade : 21
Data de inscrição : 26/09/2008
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por saim em Seg 17 Jun 2013, 00:27

Mário Valney e Igor KinGamer, vocês estão corretos. É mais prático fazer as verificações casa-a-casa, principalmente por causa das casas ocupadas na linha de ação (que não é o caso do cavalo, porque ele pode pular essas peças, mas vocês me entenderam).
Aquela metodologia que eu estava usando me deu dor-de-cabeça com outra peça que, teoricamente, é simples: o rei! A condição que eu estava tentando usar pra validar o movimento era que a soma das distâncias entre a casa verificada e a casa do rei fosse 1. Mas, epa, usando linhas e colunas isso exclui as diagonais. Então 2! Não, peraí... Sacou, né? Caso-a-caso, isso fica resolvido.


Meu problema com o cavalo é que é realmente caso.a.caso. Não tem loop, não tem lógica, não tem regra. Tem 8 movimentos, tem que checar um a um. Sorte que são só 8.
Como o rei. Mas o rei, dá pra jogar num loop.


Desafio pras horas de ócio: escrever os scripts (um pra cada peça) que definam os valores da array 2D 8x8 (que representa o tabuleiro de xadrez) como "válido" ou "inválido", considerando que casas com peças inimigas podem ser consideradas válidas. A situação de cada casa é global (você define como isso vai aparecer no seu script). Eu vou dar um valor pra cada casa com peça (casas com peões valem "1", com torres, "2" e vazias, "0"), mas você faz como quiser - lembrando que scripts só podem aceitar 16 argumentos.


Bônus se o tabuleiro puder ter dimensões customizadas. Como no jogo que eu estou pensando.
Se um dia o meu jogo chegar a sair do papel, tem boas chances do seu script estar nele. Mas não se apresse, o jogo nem entrou no papel ainda.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por Kabeção em Seg 17 Jun 2013, 13:58

Não acho que a base seja algo difícil de se fazer.
Eu esqueceria objetos separados e usaria uma ds_grid e nas células -1 se não tiver peças ou uma id se houver.

Usando constantes próprias.
-1 = vazio
p_rei = 0;
p_rainha = 1;
p_bispo = 2;
p_torre = 3;
...

Para saber a cor da peça da pra criar outra grid com:
-1 = vazio
t_branco = 0;
t_preto = 1;

Depois disso com um switch você processa as regras quando o jogador arrastar e soltar a peça:
Código:
mx = ...; // posição atual da peça
my = ...; // posição atual da peça

mx2 = ...; // nova posição da peça
my2 = ...; // nova posição da peça

ps = ...; // tipo da peça
cs = ...; // cor da peça

if ps != -1 {
    if mouse_check_button_released(mb_left) {

        mx2 = floor(mouse_x/t_w);
        my2 = floor(mouse_y/t_w);
       
        // Processar regras de movimento
        switch (ps) {
            case p_peao:
                if cs = t_preto {
                    if mx2 = mx && my2 = my+1 && ds_grid_get(tab,mx,my+1) = -1 {
                        ds_grid_set(tab,mx,my,-1);
                        ds_grid_set(cor,mx,my,-1);
                       
                        ds_grid_set(tab,mx2,my2,ps);
                        ds_grid_set(cor,mx2,my2,cs);
                    }
                } else {
                    if mx2 = mx && my2 = my-1 && ds_grid_get(tab,mx,my-1) = -1 {
                        ds_grid_set(tab,mx,my,-1);
                        ds_grid_set(cor,mx,my,-1);
                       
                        ds_grid_set(tab,mx2,my2,ps);
                        ds_grid_set(cor,mx2,my2,cs);
                    }
                }
            break;
            
            case p_torre:
                if mx = mx2 || my = my2 {
                    // Como cada peça tem uma id a partir de 0,
                    // se retornar -1, não há outras peças no caminho.
                    // Aqui eu uso sign(m2-m) para a própria peça não ser considerada

                    var v;
                    v = (ds_grid_get_max(tab,mx+sign(mx2-mx),my+sign(my2-my),mx2,my2));
                    
                    if v = -1 {
                        ds_grid_set(tab,mx,my,-1);
                        ds_grid_set(cor,mx,my,-1);
                        
                        ds_grid_set(tab,mx2,my2,ps);
                        ds_grid_set(cor,mx2,my2,cs);
                    }
                }
            break;

            case p_bispo:
                // Um movimento na diagonal é um quadrado, ou seja,
                // altura e largura são iguais entre x1,y1 x2,y2.
                // Por isso se mx2-mx e my2-my são iguais, eu tenho um movimento
                // perfeito na diagonal.

                var w,h;
                w = mx2-mx;
                h = my2-my;
                
                // Usando abs e sign na fórmula eu deixo a checagem dinâmica
                // e funcionará não importando a direção da diagonal
                if (abs(w) = abs(h)) {
                    var n,v;
                    v = -1;
                    
                    // Imitar efeito de ds_grid_get_max na diagonal
                    for (n = 1; n < abs(w)+1; n += 1) {
                        v = max(v,ds_grid_get(tab,mx+n*sign(w),my+n*sign(h)));
                    }
                    
                    if v = -1 {
                        ds_grid_set(tab,mx,my,-1);
                        ds_grid_set(cor,mx,my,-1);
                        
                        ds_grid_set(tab,mx2,my2,ps);
                        ds_grid_set(cor,mx2,my2,cs);
                    }
                }
            break;

            // ...

        }
   
    }
}

Como da pra ver no exemplo, usando uma estrutura sólida de grids e ids é fácil processar esse tipo de jogo ficando atento a lógica e flexibilidade da matemática.

Aqui um editável com o movimento do peão, torre e bispo:
https://dl.dropboxusercontent.com/u/60691076/exemplos/xadrez.gmk

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por saim em Seg 17 Jun 2013, 15:29

Exatamente, kabeção! Fiz uns exemplos aqui, que vou postar pra não jogar fora - ficaram prontos antes de eu ver seu exemplo.
 
Eu usei mais ou menos a mesma lógica, mas usei uma array 2D ao invés de uma ds_grid. Pra validar o movimento, eu marco cada casa como "válida" ou "inválida" - o que, no resto da programação, seria usado pra permitir ou negar o movimento.
Ainda não testei, porque não tenho o jogo de xadrez pra testar. Pra poder moldar o tabuleiro, simplesmente coloquei o número de linhas e colunas como argumentos.
Cada peça tem um valor (ainda não definido), mas começando a partir de 1. Casas com valor "0" são consideradas vazias.
A cor da peça em cada casa também é uma variável que vale 1 ou 2, pras casas com peças, e 0 pras vazias. Poderia ser 0 e 1, porque não vou usar essa variável em casas vazias, mas eu fico desconfortável em dar valores válidos pra casas sem peças.
 
A idéia do funcionamento do jogo seria: o jogador clica na tela e o jogo entende qual linha/coluna ele clicou. Se tem uma peça dele na casa clicada, ele roda um dos scripts. A escolha do script é em função do valor (peça) da casa clicada. Ao rodar o script, as casas válidas ficam marcadas, possibilitando um efeito visual. Ao clicar numa casa marcada como "válida", a peça se move.
Não fiz nada disso, só escrevi os scripts pensando nessa lógica. A lógica ainda está só na cabeça (e, agora, aqui no fórum).
 
Não previ a possibilidade de "Roque"
Os peões são considerados apenas peças brancas; atacam só pra cima. Fácil de adaptar em função da cor da peça, mas pro jogo que eu tenho em mente, é desnecessário. Se alguém gostar do script e quiser usar, basta definir o sinal da linha (linha +- 1) em função da cor da peça ou do jogador atualmente jogando.
 
invalida_tudo:

Código:
// marca todas as casas como inválidas
var nLins, nCols;
nLins := argument0; // número de linhas no tabuleiro
nCols := argument1; // número de colunas no tabuleiro

var i, j;
for (i := 0; i < nCols; i += 1){
for (j := 0; j < nLins; j += 1){
valido[i, j] := false;
}
}
valida_peao:

Código:
// chamar "invalida_tudo(nCols, nLins)" antes de rodar o script

var posiX, posiY, nLins, nCols, minhaCor;
posiX := argument0; // poição da peça, em x
posiY := argument1; // poição da peça, em y
nLins := argument2; // número de linhas no tabuleiro
nCols := argument3; // número de colunas no tabuleiro
minhaCor := argument4; //a cor da peça que chama o script

var col, lin;
lin := posiY - 1; // só ataca pra frente (se for fazer das outras peças, editar o "-1")
if (lin != median(0, lin, nLins - 1)){ // se o peão está no limite
exit;
}
// à frente
col := posiX;
if (piece[col, lin] == 0){
valido[col, lin] := true;
}
// ataque 1
col := posiX + 1;
if (col == median(0, col, nCols - 1){ // se mantém no tabuleiro
if (piece[col, lin] != 0){ // se tem peça
if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
}
// ataque 2
col := posiX - 1;
if (col == median(0, col, nCols - 1){ // se mantém no tabuleiro
if (piece[col, lin] != 0){ // se tem peça
if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
}
valida_torre:
// chamar "invalida_tudo(nCols, nLins)" antes de rodar o script
var posiX, posiY, nLins, nCols, minhaCor;
posiX := argument0; // poição da peça, em x
posiY := argument1; // poição da peça, em y
nLins := argument2; // número de linhas no tabuleiro
nCols := argument3; // número de colunas no tabuleiro
minhaCor := argument4; //a cor da peça que chama o script
 
var col, lin;
 
// linha +
lin := posiY, col := posiX;
for(col := posiX; col < nCols; col += 1){
if (col := posiX){ // se é a casa inicial
continue; // faz nada, mas segue no loop
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else { // se tem peça
if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
break; // para de andar, sendo amiga ou inimiga
}
}
}
 
// linha -
lin := posiY, col := posiX;
for(col := posiX; col >= 0; col -= 1){
if (col := posiX){ // se é a casa inicial
continue; // faz nada, mas segue no loop
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else { // se tem peça
if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
break; // para de andar, sendo amiga ou inimiga
}
}
}
 
// coluna +
lin := posiY, col := posiX;
for(lin := posiY; lin < nLins; lin += 1){
if (lin := posiY){ // se é a casa inicial
continue; // faz nada, mas segue no loop
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else { // se tem peça
if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
break; // para de andar, sendo amiga ou inimiga
}
}
}
 
// coluna -
lin := posiY, col := posiX;
for(lin := posiY; lin >= 0; lin -= 1){
if (lin := posiY){ // se é a casa inicial
continue; // faz nada, mas segue no loop
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else { // se tem peça
if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
break; // para de andar, sendo amiga ou inimiga
}
}
}
valida_cavalo:

Código:
// chamar "invalida_tudo(nCols, nLins)" antes de rodar o script

var posiX, posiY, nLins, nCols, minhaCor;
posiX := argument0; // poição da peça, em x
posiY := argument1; // poição da peça, em y
nLins := argument2; // número de linhas no tabuleiro
nCols := argument3; // número de colunas no tabuleiro
minhaCor := argument4; //a cor da peça que chama o script

var col, lin;

// ataque 1 "¬"
lin := posiY + 1; col := posiX + 2;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
// ataque 2 ""
lin := posiY - 1; col := posiX + 2;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
// ataque 3 ""
lin := posiY - 2; col := posiX + 1;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
// ataque 4 "7"
lin := posiY - 2; col := posiX - 1;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
// ataque 5 ""
lin := posiY - 1; col := posiX - 2;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
// ataque 6 ""
lin := posiY + 1; col := posiX - 2;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
// ataque 7 "J"
lin := posiY + 2; col := posiX - 1;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
// ataque 8 "L"
lin := posiY + 2; col := posiX + 1;
if (lin == median (0, lin, nLins - 1) && col == median (0, col, nCols - 1){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se a peça é inimiga
valido[col, lin] := true;
}
}
valida_bispo:

Código:
// chamar "invalida_tudo(nCols, nLins)" antes de rodar o script

var posiX, posiY, nLins, nCols, minhaCor;
posiX := argument0; // poição da peça, em x
posiY := argument1; // poição da peça, em y
nLins := argument2; // número de linhas no tabuleiro
nCols := argument3; // número de colunas no tabuleiro
minhaCor := argument4; //a cor da peça que chama o script

var col, lin;
// diagonal ++
lin := posiY, col := posiX;
while (lin < nLins && col < nCols){ // enquanto não chega no fim do tabuleiro
if (lin == posiY && col == posiX) { // se é a casa inicial
lin += 1; col += 1; // simplesmente segue adiante
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se está vazio
valido[col, lin] := true; // valido
col += 1; lin += 1; // anda pra próxima
}
else { // se tem peça
if (cor[col, lin] != minhaCor) { // se a peça é inimiga
valido[col, lin] := true; // valida
}
break; // para de andar, sendo amiga ou inimiga
}
}
}

// diagonal -+
lin := posiY, col := posiX;
while (lin < nLins && col >= 0){ // enquanto não chega no fim do tabuleiro
if (lin == posiY && col == posiX) { // se é a casa inicial
lin += 1; col -= 1; // simplesmente segue adiante
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se está vazio
valido[col, lin] := true; // valido
col -= 1; lin += 1; // anda pra próxima
}
else { // se tem peça
if (cor[col, lin] != minhaCor) { // se a peça é inimiga
valido[col, lin] := true; // valida
}
break; // para de andar, sendo amiga ou inimiga
}
}
}

// diagonal +-
lin := posiY, col := posiX;
while (lin >= 0 && col < nCols){ // enquanto não chega no fim do tabuleiro
if (lin == posiY && col == posiX) { // se é a casa inicial
lin -= 1; col += 1; // simplesmente segue adiante
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se está vazio
valido[col, lin] := true; // valido
col += 1; lin -= 1; // anda pra próxima
}
else { // se tem peça
if (cor[col, lin] != minhaCor) { // se a peça é inimiga
valido[col, lin] := true; // valida
}
break; // para de andar, sendo amiga ou inimiga
}
}
}

// diagonal --
lin := posiY, col := posiX;
while (lin >= 0 && col >= 0){ // enquanto não chega no fim do tabuleiro
if (lin == posiY && col == posiX) { // se é a casa inicial
lin -= 1; col -= 1; // simplesmente segue adiante
}
else { // se não é a casa inicial
if (piece[col, lin] == 0){ // se está vazio
valido[col, lin] := true; // valido
col -= 1; lin -= 1; // anda pra próxima
}
else { // se tem peça
if (cor[col, lin] != minhaCor) { // se a peça é inimiga
valido[col, lin] := true; // valida
}
break; // para de andar, sendo amiga ou inimiga
}
}
}
valida_rainha:

Código:
// chamar "invalida_tudo(nCols, nLins)" antes de rodar o script

valida_bispo(argument0, argument1, argument2, argument3, argument4);
valida_torre(argument0, argument1, argument2, argument3, argument4);
valida_rei:

Código:
// chamar "invalida_tudo(nCols, nLins)" antes de rodar o script
// não verifica a possibilidade de "roque"

var posiX, posiY, nLins, nCols, minhaCor;
posiX := argument0; // poição da peça, em x
posiY := argument1; // poição da peça, em y
nLins := argument2; // número de linhas no tabuleiro
nCols := argument3; // número de colunas no tabuleiro
minhaCor := argument4; //a cor da peça que chama o script

var i, col, lin;
for (i := 0; i < 8; i += 1){ // pra cada direção
// define valor de linha e coluna
col := posiX + sign(lengthdir_x(1, 45 * i));
lin := posiY - sign(lengthdir_y(1, 45 * i));
if (col == median(0, col, nCols - 1) && lin == median(0, lin, nLins - 1)){ // se está no tabuleiro
if (piece[col, lin] == 0){ // se a casa está vazia
valido[col, lin] := true;
}
else if (cor[col, lin] != minhaCor){ // se tem peça de outra cor
valido[col, lin] := true;
}
}
}

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por RafaleCP em Sab 29 Jun 2013, 17:53

Muito obrigado pessoal! Verei alguns tutoriais também, e então tentarei começar com um jogo de damas e posteriormente vou tentar um de xadrez. Agradeço muito pela atenção de vocês!!!

RafaleCP

Número de Mensagens : 42
Idade : 17
Data de inscrição : 16/02/2013
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por shatterhand2 em Ter 02 Jul 2013, 15:36

Eu não tenho certeza de como o GM trata cada um, mas tenho a impressão que criar um array com 2 dimensões é mais rápido que criar um grid ,não?

Ou talvez seja a mesma coisa.

É legal de vez em quando ver uns tópicos discutindo programação de uma forma um pouco mais "aprofundada" as vezes Smile

você pode ter um array pra verificar as jogadas válidas, e outro que mantém as posições atuais do tabuleiro (Não sei se alguém já falou isso, eu li o tópico meio em leitura dinâmica, talvez tenha pulado alguma coisa)

Fazer uma AI pra damas até rola, agora pra fazer pra xadrez.... primeiro tem que entender bastante do jogo, conhecer bem as aberturas de xadrez, etc, depois tem que avaliar quantas jogadas A FRENTE sua AI vai pensar (Não poder jogar pensando apenas no status atual do tabuleiro), depois você tem que analisar se a jogada desejada é mais vantajosa pro adversário do que pra você (Truque de jogador de xadrez, ofereça uma peça fraca em "sacrifício" para capturar uma mais forte do adversário.. uma boa AI não pode cair nisso). Eu não tenho nem ideia de como começar um trabalho desses.

Eu tenho quase certeza que devem ter alguns algoritmos de AI de Xadrez disponíveis, o que pode ajudar.

Essa leitura aqui pd ser interessante tambem:

http://www.uio.no/studier/emner/matnat/ifi/INF4130/h12/undervisningsmateriale/chess-algorithms-theory-and-practice-ver2012.pdf


shatterhand2

Número de Mensagens : 645
Idade : 33
Data de inscrição : 21/10/2009
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://shatterhand.beatthegame.net

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por Kabeção em Ter 02 Jul 2013, 18:27

shatterhand2 escreveu:Eu não tenho certeza de como o GM trata cada um, mas tenho a impressão que criar um array com 2 dimensões é mais rápido que criar um grid ,não?

Ou talvez seja a mesma coisa.
Isso varia muito de versão para versão, ainda mais agora que existem vários módulos e as adaptações variam bastante de plataforma para plataforma.
Eu prefiro as grids nesse caso porque o GM já tem várias funções úteis para manipular matrizes e construir a base do jogo assim como mostrei no meu exemplo.
Com arrays eu teria que refazer todas aquelas funções já disponíveis.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por Kapoty em Ter 02 Jul 2013, 18:45

Tenho uma engine de movimento que eu fiz, veja se serve pra algo: https://dl.dropboxusercontent.com/u/78063995/Xadrez.gmk

Kapoty

Ranking : Nota B
Número de Mensagens : 635
Data de inscrição : 05/11/2011
Notas recebidas : E + D + C + B + D +B + A
Reputação : 22
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

Voltar ao Topo Ir em baixo

Re: [Dúvida] Sistema de movimento de peças no xadrez

Mensagem por Conteúdo patrocinado Hoje à(s) 12:23


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum