Java Xadrez - jogo

22 respostas
sfing

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;  
				}
			}
		}
	}
}

22 Respostas

Veronicaaa

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. :slight_smile:

rafaelglauber

dê uma olhada no projeto jose veja se tem algo que te ajude: http://jose-chess.sourceforge.net/

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 !!!

Luca

Olá

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.

[]s
Luca

tnaires

Olá

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.

Abraços

Proteu_Alcebidiano

Nesse artigo um algoritmo para xadrez é mencionado:

T+

tnaires

Vejam esses links interessantíssimos do site GameDev:

Chess Programming Part I: Getting Started
Chess Programming Part II: Data Structures
Chess Programming Part III: Move Generation
Chess Programming Part IV: Basic Search
Chess Programming Part V: Advanced Search
Chess Programming Part VI: Evaluation Functions

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.

Abraços

ViniGodoy

Eu concordo com o Luca.

Mesmo implementar só os movimentos é uma tarefa bastante árdua. Explico os motivos:

  1. Parte dos movimentos  são possíveis dependendo das jogadas anteriores. Exemplo:
    
    1.1. O Roque  pode ser feito se o rei o a torre nunca se movimentaram;
    
    1.2. O peão  pode comer en passant se, na jogada anterior, o peão do adversário tiver movimentado duas casas;
    
  2. É 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;
    
  3. É 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.

É obrigatório implementar um jogo de xadrez?

S

Isso não é lá tão difícil, Vini.

<blockquote>1.1. O Roque  pode ser feito se o rei o a torre nunca se movimentaram;

1.2. O peão  pode comer “en passant” se, na jogada anterior, o peão do adversário tiver movimentado duas casas;</blockquote>

Um boolean para guardar se essas 3 peças  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.
<blockquote> 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”;</blockquote>

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.

Luca

Olá

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.

[]s
Luca

tnaires

Pessoal

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.

Abraços

ffranceschi

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

ViniGodoy

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.

ViniGodoy

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.

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.

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!!

ViniGodoy

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!!

É, isso tava incluído no item 3, que eu citei ali em cima. :slight_smile:

jjose

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 !!!

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.

Em seu cronograma, quando vc quer concluir?

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 !!!

:slight_smile:

jjose

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 !!
:)

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…

Comprometimento:
obrigação ou promessa, entre duas ou mais pessoas, de sujeitarem a um árbitro a decisão de um pleito existente entre elas.

Quando chegar na sua epoca de TCC vc vai aprender

glaucioguerra

Realmente, desenvolver jogos em Java é muito difícil. Mas existem linguagens mais apropriadas para isso. Estude prolog e com uns 100k de código o seu jogo está completo. Implemente um algoritmo de MinMax para jogar Humano x CPU e fica tudo lindo :slight_smile:

Um exemplo de um quicksort em pl:

split(H, [A|X], [A|Y], Z) :-
  order(A, H), split(H, X, Y, Z).
split(H, [A|X], Y, [A|Z]) :-
  not(order(A, H)), split(H, X, Y, Z).
split(_, [], [], []).
quicksort([], X, X).
quicksort([H|T], S, X) :-
  split(H, T, A, B),
  quicksort(A, S, [H|Y]),
  quicksort(B, Y, X).

Em Java:

import java.util.Comparator;
import java.util.Random;

public class Quicksort {
    public static final Random RND = new Random();      
    private static void swap(Object[] array, int i, int j) {
        Object tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
    private int partition(Object[] array, int begin, int end, Comparator cmp) {
        int index = begin + RND.nextInt(end - begin + 1);
        Object pivot = array[index];
        swap(array, index, end);                
        for (int i = index = begin; i < end; ++ i) {
            if (cmp.compare(array[i], pivot) <= 0) {
                swap(array, index++, i);
        }   }
        swap(array, index, end);        
        return (index);
    }
    private void qsort(Object[] array, int begin, int end, Comparator cmp) {
        if (end > begin) {
            int index = partition(array, begin, end, cmp);
            qsort(array, begin, index - 1, cmp);
            qsort(array, index + 1,  end,  cmp);
    }   }
    public void sort(Object[] array, Comparator cmp) {
        qsort(array, 0, array.length - 1, cmp);
    }
}

Tirei esses exemplos da wikipedia ok?

Esses jogos de tabuleiro que envolvem recursividade são “facilmente” implementados em prolog. Derrepente é melhor criar o back-end em pl e o front-end em Open-GL com Java ou C.

Um abraço!

Gambit84

Alguem tem alguma dica, tutorial, site, alguma luz no fim do túnel para xadrez via bluetooth??

Obs: sem IA, apenas um contra o outro???

Gambit84

Para JAVA ME

Criado 16 de novembro de 2007
Ultima resposta 8 de mai. de 2008
Respostas 22
Participantes 12