Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
[Dúvida] Sistema de movimento de peças no xadrez
+6
Mário Valney
theguitarmester
saim
fredcobain
luiz_eldorado
RafaleCP
10 participantes
Página 1 de 1
[Dúvida] Sistema de movimento de peças no xadrez
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- Data de inscrição : 16/02/2013
Reputação : 0
Número de Mensagens : 42
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Dúvida] Sistema de movimento de peças no xadrez
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
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
Re: [Dúvida] Sistema de movimento de peças no xadrez
Uma grupo de funções que vai te ajudar com certeza são as funções que tratam SNAP.
Ex:
Ex:
- Código:
with (obj_Pieces)
{
if !place_snapped(32, 32)
{
move_snap(32, 32);
}
}
fredcobain- Games Ranking :
Data de inscrição : 14/04/2011
Reputação : 163
Número de Mensagens : 692
Prêmios :
x 0 x 3 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Dúvida] Sistema de movimento de peças no xadrez
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.
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Dúvida] Sistema de movimento de peças no xadrez
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,
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,
Não entendi.if (casa . coluna - bispo . coluna == casa . linha - bispo . linha){...
Re: [Dúvida] Sistema de movimento de peças no xadrez
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
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?).
Re: [Dúvida] Sistema de movimento de peças no xadrez
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 ) 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:
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.
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 ) 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.
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- Data de inscrição : 26/09/2008
Reputação : 11
Número de Mensagens : 890
Prêmios :
x 0 x 1 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Dúvida] Sistema de movimento de peças no xadrez
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.
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Dúvida] Sistema de movimento de peças no xadrez
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:
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
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
Re: [Dúvida] Sistema de movimento de peças no xadrez
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.
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Dúvida] Sistema de movimento de peças no xadrez
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- Data de inscrição : 16/02/2013
Reputação : 0
Número de Mensagens : 42
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Dúvida] Sistema de movimento de peças no xadrez
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
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
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
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
Re: [Dúvida] Sistema de movimento de peças no xadrez
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.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.
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.
Re: [Dúvida] Sistema de movimento de peças no xadrez
Tenho uma engine de movimento que eu fiz, veja se serve pra algo: https://dl.dropboxusercontent.com/u/78063995/Xadrez.gmk
Kapoty- Games Ranking :
Notas recebidas : E + D + C + B + D +B + A
Data de inscrição : 05/11/2011
Reputação : 22
Número de Mensagens : 635
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 1
x 0 x 0 x 0
Tópicos semelhantes
» (Dúvida) Movimentos de peças e cheque mate no rei (XADREZ)
» Peças de Dama
» [ideia]Xadrez Moderno
» como criar um jogo de xadrez?
» Boss e suas peças
» Peças de Dama
» [ideia]Xadrez Moderno
» como criar um jogo de xadrez?
» Boss e suas peças
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos