Estou tentando criar um jogo de xadrez em java, alguém poderia ajudar a criar os movimentos das peças ?
public class Tabuleiro{
private int[][] tabuleiro;
private int x = 8;
private int y = 8;
public void setTabuleiro(int[][] tabuleiro){
this.tabuleiro = tabuleiro;
}
public int[][] getTabuleiro(){
return this.tabuleiro;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void criaTabuleiro(){
tabuleiro = new int[x][y];
int count = 0;
for(int i=0;i<x;i++){
for(int j=0;j<x;j++){
count = i + j;
if(!(count % 2 == 0)){
//tabuleiro[i][j] = 1;
}
}
}
}
public void mostraTabuleiro(){
System.out.print("* ");
for(int u=0 ; u<x ; u++){
System.out.print(u+" ");
}
System.out.println("");
for(int i=0 ; i<x ; i++){
System.out.print(i+" ");
for(int j=0 ; j<x ; j++){
System.out.print("[" + tabuleiro[i][j] + "]");
if(j == 7){
System.out.println("");
}
}
}
}
public static void main(String [] args){
Tabuleiro tb = new Tabuleiro();
tb.criaTabuleiro();
Peao peao = new Peao(tb.getTabuleiro());
peao.criaPeaoCasa(0, 0);
tb.mostraTabuleiro();
peao.movimentoPeao(6, 0, 5, 0);
tb.mostraTabuleiro();
}
}
public class Peao {
private int [][] tabuleiro ;
private final int PEAO = 4;
boolean primeiroMovimento;
public Peao(int [][] tabuleiro){
this.tabuleiro = tabuleiro;
this.primeiroMovimento = true;
}
public void criaPeaoCasa(int lO, int cO){
tabuleiro[lO][cO] = PEAO;
}
public void movimentoPeao(int lO, int cO ,int lD, int cD){
primeiroMovimento = false;
// Movimento sempre do branco, inicio linha 6, movimento sempre decrescendo
if(!primeiroMovimento){
// Destino igual a 0
if(tabuleiro[lD][cD] == 0 && tabuleiro[lO][cO] == 4){
if(lO - 1 == lD && cO == cD){
tabuleiro[lD][cD] = PEAO;
tabuleiro[lO][cO] = 0;
}
}
}
}
}
Olá.
Em primeiro lugar, você conhece os movimentos reais e legais do Xadrez? Outra, você pensou na notação que irá utilizar para endereçar cada casa? A mais utilizada é a algébrica.
E as inúmeras aberturas de um jogo Xadrez? Pelo que vi da sua classe Peao você diz que o primeiro movimento vai ser com o peão, é isso mesmo? Nem sempre isso é verdade…Você pode começar o jogo saindo com o cavalo, ou você vai obrigar o jogador a sempre iniciar o jogo com o peão do rei?
Implementar um jogo de xadrez, nâo deve ser muito facil, por isso as regras do jogo tem que estar fluindo para você.
Minha opinião.
As regras e movimentações conheço muito bem, o meu maior problema é ter tempo para o desenvolvimento, pois trabalho com programação e como todo mundo já sabe estudar e trabalhar e ainda namorar não se sobra muito tempo !!!
Quero mesmo alguém para ajudar a fazer os movimento, não é que não saiba …
Se alguém estiver a disposição … á ajuda será muito bem vinda !!!
Google por xadres e encontrara MUITOS projetos em C. Dai passar para Java would be a piece of cake. Só tem um PORÉM:
Fazer um jogo de xadrês é MUITO difícil. Já tentei fazer um e desisti devido ao alto grau de complexidade. Envolve várias áreas de conhecimento. Não basta saber programar bem e saber jogar bem xadrês. É preciso ser muito bom em algoritmos que normalmente não são ensinados a fundo na faculdade.
Depende. Pelo jeito, o sfing quer apenas fazer um programa para mover as peças; nesse caso, a maior complexidade será desenhar as peças na tela. Porém, se ele quiser implementar a inteligência do jogo, para jogar contra o computador… Difícil é, mas não impossível. Sugiro o sfing pesquisar sobre o algoritmo MINIMAX com Alfa-Beta Pruning, e seria bom implementá-los com um jogo de tabuleiro mais simples, como damas, trilha ou mesmo jogo-da-velha, para depois se sentir capaz de implementar a inteligência de um jogo de xadrez.
Muita atenção quando for escrever uma função de avaliação da melhor jogada. Seu algoritmo pode estar redondo, mas o computador efetuará jogadas burras caso a função de avaliação não seja bem escolhida.
Mesmo implementar só os movimentos é uma tarefa bastante árdua. Explico os motivos:
Parte dos movimentos só são possíveis dependendo das jogadas anteriores. Exemplo:
1.1. O Roque só pode ser feito se o rei o a torre nunca se movimentaram;
1.2. O peão só pode comer “en passant” se, na jogada anterior, o peão do adversário tiver movimentado duas casas;
É difícil identificar certas situações de empate forçado:
2.1. Para o empate por repetição consecutiva do tabuleiro, é necessário guardar e comparar o tabuleiro a cada jogada do jogo;
2.2. É necessário um bom algoritmo para detectar o “empate por cheque infinito”;
É trabalhoso implementar regras para garantir que um movimento que ponha o rei em risco não ocorrerá.
Não disse que nada é impossível. A maior parte das coisas aqui, nem sequer exige uma lógica complexa. Mas é um trabalho árduo, envolve muitos detalhes e demorado.
[quote]1.1. O Roque só pode ser feito se o rei o a torre nunca se movimentaram;
1.2. O peão só pode comer “en passant” se, na jogada anterior, o peão do adversário tiver movimentado duas casas;[/quote]
Um boolean para guardar se essas 3 peças já se moveram e se a jogada anterior foi um peão andando duas casas.
No servidor FICS, o servidor envia essas informações a cada jogada, para que o cliente saiba se pode fazer essa jogada.
[quote] 2.1. Para o empate por repetição consecutiva do tabuleiro, é necessário guardar e comparar o tabuleiro a cada jogada do jogo;
2.2. É necessário um bom algoritmo para detectar o “empate por cheque infinito”;[/quote]
Existe empate por xeque infinito? Acho que cai no empate por repetição (que não precisa ser consecutiva) ou empate por 50 lances.
Eu acho mais difícil o movimento das peças, detectar se existe uma peça bloqueando o caminho, se a jogada deixa o rei em xeque, etc. Já vi uma biblioteca Java pra isso; não lembro o nome, mas tenho certeza que você acha no google.
Sobre um computador jogar xadrez (que deve MUITO difícil), existe um opensource e muito forte, o Crafty. Já o vi derrotando mestre.
Há muitos anos atrás pensei em desenvolver um jogo de xadrês para treinar algumas aberturas. Procurando na Internet achei vários engines open source em C. Estudando um pouquinho deles percebi que a complexidade é bastante grande e que eu não conseguiria fazer como projetinho de fim de semana e ainda levar minha vida normal que na época incluia velejar e correr.
Se o cara quiser dedicar muitas horas por dia durante um bom tempo e se conseguir dividir as tarefas com pelo menos mais 2 desenvolvedores, acho viável usar o que já existe em C para converter para Java.
Sozinho nas horas vagas é melhor ele escolher um jogo mais fácil.
Todos nós concordamos que um jogo de xadrez não é trivial a ponto de ser feito em um fim de semana (na verdade, nem mesmo o jogo-da-velha é). Entretanto, jogos de xadrez já são construídos há muito tempo, e já existem vários algoritmos e estratégias consolidadas para implementá-lo. Ou seja, não é nada EXTREMAMENTE difícil: nada que um pouco de estudo e organização não ajudem.
Quem se interessar, leia os links que passei, e procure estudar os algoritmos e as estruturas de dados envolvidas.
Ja ouvi falar que quando o Kasparov jogou contra o Deep Blue, todas as partidas deles estavam cadastradas e o computador saberia jogar exatamente o que jogar contra cada lance ele fazia. Entao na ultima partida ele jogou de pretas uma defesa que ele nunca tinha jogado, tentando “enganar” o computador, mas ele errou um lance DUVIDOSO (que acredita-se que ele entregou mesmo).
Xadrez talvez pra implementar é melhor voce sempre jogar de preta, pq ela que defini todas as linhas de defesa que quer jogar, ai fica menos menos dificil pra implementar
Conforme eu falei ali em cima, a questão exatamente ser difícil, mas de ser trabalhoso. E o colega disse que estava sem tempo.
Veja o caso da jogada en-passant. Você não deve guardar somente “um boolean se andou duas na última jogada”. Mas também o turno em que o peão andou duas casas. Afinal, a lance en-passant só pode ocorrer na jogada seguinte ao movimento. Além disso, o peão a ser comido estará ao lado do peão que come (e não na diagonal, como seria na maior parte das jogadas). Ou seja, provavelmente haverá um if só para tratar essa situação.
Eu mesmo já desenvolvi um jogo de xadrez completinho, com o movimento de cada uma das peças, mas quase sem IA (era só com base em busca heurística mesmo). Detectava também o fim de jogo, finais possíveis, fazia contagem de lances, etc. Nenhuma das lógicas é realmente difícil, mas se você quiser caprichar é realmente trabalhoso.
[quote=Schuenemann]Isso não é lá tão difícil, Vini.
Existe empate por xeque infinito? Acho que cai no empate por repetição (que não precisa ser consecutiva) ou empate por 50 lances.[/quote]
Tem razão. Aqui eu confundi. É a mesma situação mesmo.
Na verdade, a outra situação de empate que eu não me recordava é quando em 50 movimentações não tiver acontecido nenhuma captura de peça ou movimento do peão.
Também não é possível realizar o roque se o rei se posicionar ou passar por uma linha de xeque; muitas vezes uma peça não pode ser movimentada pois o seu deslocamento colocaria o rei em xeque.
Como o pessoal falou, implementar um jogo de xadrez não é moleza não!!
[quote=Veronicaaa]
Também não é possível realizar o roque se o rei se posicionar ou passar por uma linha de xeque; muitas vezes uma peça não pode ser movimentada pois o seu deslocamento colocaria o rei em xeque.
Como o pessoal falou, implementar um jogo de xadrez não é moleza não!![/quote]
É, isso tava incluído no item 3, que eu citei ali em cima.
[quote=sfing]As regras e movimentações conheço muito bem, o meu maior problema é ter tempo para o desenvolvimento, pois trabalho com programação e como todo mundo já sabe estudar e trabalhar e ainda namorar não se sobra muito tempo !!!
Quero mesmo alguém para ajudar a fazer os movimento, não é que não saiba …
Se alguém estiver a disposição … á ajuda será muito bem vinda !!!
[/quote]
Tem que se dedicar, o que você quer em 1º plano?
Estudar, namorar, trabalhar ou o xadrez?
90% dos projetos particulares morrem antes de completar 30hs de trabalho.
Não estou botando feh no seu projeto,
se você só fez isso e jah esta reclamando de falta de tempo é complicado… rs.
[quote=sfing]O tempo não importa, quero concluir… não estou fazendo para terminar em determinado tempo.
Estou desenvolvendo para aprender o java, pois nada melhor que a pratica.
Se não vai informar algo que possa ajudar, não atrapalha.
A sua feh não vai ajudar-me a ter conhecimento, por tanto estou dispençando a sua feh !!!
Muito abrigado para aqueles que tem o interece de ajudar e enviaram, link sobre o assunto !!
:)[/quote]
Pronto, estou formatando seu post, pula linhas sem motivos…!!! Tem que aprender isso, é básico - Isso é para te ajudar!
Se vc jah trabalha com informatica e não conhece prazos, esta no lugar errado - Isso é para te ajudar!
Soh falei isso pq vc pediu ajuda, se vc quer ajuda, q nosso tempo p/ algo que não vai ter o seu comprometimento…
[quote]Comprometimento:
obrigação ou promessa, entre duas ou mais pessoas, de sujeitarem a um árbitro a decisão de um pleito existente entre elas.[/quote]