Exercícios - Java

Galera, acabei de terminar minha primeira apostila Java, agora, estou precisando mesmo é praticar através de exercícios. Sei que o ideal seria montar um projeto e talz, mas queria algo Graduativo… Começando fácil e se tornando mais difícil. Alguém tem alguma sugestão??? Obrigado!

Pra começar, você podia fazer algo divertido:

  1. Jogo da velha - multiplayer (tenha certeza de detectar o fim de jogo)
  2. Jogo da velha - single player (pratique um pouco suas estruturas de dados)
  3. Jogo da velha em swing (usando botões, layouts, etc)
  4. Adicione score no jogo, ordenado do maior pro menor - tenta fazer de várias formas: com banco de dados, xml, etc.
  5. Jogo da velha com java 2D e sons (aprenda e extender componentes e como a pintura no java funciona).

Farei este programa, valeu Vini!!! Uma outra pergunta, um conhecido meu disse que para interface gráfica devemos utilizar NetBeans e não Eclipse, pois somente no NetBeans você possui IDE Gráfica… Isso é verdade?? Não tem como trabalhar com isso com Eclipse?? Somente via código??

[quote]Farei este programa, valeu Vini!!! Uma outra pergunta, um conhecido meu disse que para interface gráfica devemos utilizar NetBeans e não Eclipse, pois somente no NetBeans você possui IDE Gráfica… Isso é verdade?? Não tem como trabalhar com isso com Eclipse?? Somente via código??
[/quote]

É, ±. Hoje muita gente usa NetBeans, mas existem outras opções, como o abeille, o jgoodies form… eu particularmente não consigo instalar alguns e uso o NetBeans. Estou tentando usar o abeille agora que parece ser leve e não gera código desnecessário (como o NetBeans faz). Na verdade, acabei de baixar o abeille, mas não tenho a mínima idéia do que ele faz… eu to louco pra migrar totalmente pro Eclipse, mas com esse problema da interface gráfica é complicado…

No Eclipse, se você dar uma boa procurada existe algumas coisas que auxiliam o desenvolvimento de GUIs em Swing.

De uma lida nesse tópico: http://www.guj.com.br/posts/list/25639.java
Tem algumas coisas interessantes.

Abraço.

No Eclipse existe o Visual Editor. E deve haver outros editores. O MyEclipse tem o Matisse, que é o mesmo do Netbeans.

Mas… não dá para negar, o Netbeans tem se mostrado superior ao Eclipse nesse quesito.

Como ele disse acima… em swing o netbeans é melhor… mas ambos sao mto ruins pq geram mto codigo que n precisaria ;x

Então, por enquanto o melhor negócio é criar o Swing na mão mesmo??? Ou já partir para Ajax???

Se preferir Ajax, vá fundo. Você pode trocar o desafio do swing por um Ajax. Dá na mesma.
Ou então, tente fazer das duas formas. Pode ser que você não trabalhe com Swing, mas há muitos conceitos interessantes por lá que podem ser usados em outras aplicações. Ele demonstra, por exemplo, como usar efetivamente o padrão observer e como trabalhar com modelos de dados.

Procure não só entender como usar, mas também os conceitos por trás das tecnologias que você estiver estudando.

Creio que aqui não seja o local mais apropriado para isso, mas não achei nenhum tópico para postar isso. Eu montei o meu jogo da velha “Multiplayer” e gostaria que, se possível, alguém desse alguma sugestão quanto ao que fiz… Para efeito de aperfeiçoamento… Primeiramente fiz sem Swing, logo após farei utilizando Swing…

Valeeeu!!!

import java.io.IOException;

import javax.swing.JOptionPane;

public class JogoDaVelha {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		boolean valida;
		int array[][] = new int[3][3];
		int vezDeQuem = 0;
		int acabou;
		int marcaPonto;
		int pontuacao1 = 0;
		int pontuacao2 = 0;
		int contador;
		String campo;
		String desenho;
		String jogador1, jogador2, jogador;

		jogador1 = JOptionPane
				.showInputDialog("Digite o nome do primeiro jogador");
		jogador2 = JOptionPane
				.showInputDialog("Digite o nome do segundo jogador");
		
		while (true) {

			acabou = 0;
			marcaPonto = 0;
			contador = 0;
			
			for (int i = 0; i < 3; i++) {
				for (int j = 0; j < 3; j++) {
					array[i][j] = 0;
				}
			}

			while (acabou == 0) {
				if (!(vezDeQuem % 2 == 0)) {
					jogador = jogador1;
					desenho = "O";
					marcaPonto = 1;
				} else {
					jogador = jogador2;
					desenho = "X";
					marcaPonto = 2;
				}

				System.out.println("É sua vez " + jogador + "!!");

				campo = JOptionPane
						.showInputDialog("Digite o campo em que deseja jogar");

				valida = true;

				if (campo.equals("a1") && array[0][0] == 0) {
					array[0][0] = marcaPonto;
					contador++;
				}
				else if (campo.equals("a2") && array[0][1] == 0) {
					array[0][1] = marcaPonto;
					contador++;
				}
				else if (campo.equals("a3") && array[0][2] == 0) {
					array[0][2] = marcaPonto;
					contador++;
				}
				else if (campo.equals("b1") && array[1][0] == 0) {
					array[1][0] = marcaPonto;
					contador++;
				}
				else if (campo.equals("b2") && array[1][1] == 0) {
					array[1][1] = marcaPonto;
					contador++;
				}
				else if (campo.equals("b3") && array[1][2] == 0) {
					array[1][2] = marcaPonto;
					contador++;
				}
				else if (campo.equals("c1") && array[2][0] == 0) {
					array[2][0] = marcaPonto;
					contador++;
				}
				else if (campo.equals("c2") && array[2][1] == 0) {
					array[2][1] = marcaPonto;
					contador++;
				}
				else if (campo.equals("c3") && array[2][2] == 0) {
					array[2][2] = marcaPonto;
					contador++;
				}
				else {
					JOptionPane.showMessageDialog(null,
							"Digite um campo válido!!");
					valida = false;
				}
				if (valida) {
					vezDeQuem++;
				}

				for (int i = 0; i < 3; i++) {
					if (array[i][0] == marcaPonto && array[i][1] == marcaPonto
							&& array[i][2] == marcaPonto)
						acabou = marcaPonto;
				}

				for (int i = 0; i < 3; i++) {
					if (array[0][i] == marcaPonto && array[1][i] == marcaPonto
							&& array[2][i] == marcaPonto)
						acabou = marcaPonto;
				}

				if (array[0][0] == marcaPonto && array[1][1] == marcaPonto
						&& array[2][2] == marcaPonto)
					acabou = marcaPonto;
				else if (array[0][2] == marcaPonto && array[1][1] == marcaPonto
						&& array[2][0] == marcaPonto)
					acabou = marcaPonto;
				
				if(contador == 9) {
					JOptionPane.showMessageDialog(null, "Deu velha!!");
					acabou = 3;
					marcaPonto = 3;
				}
					
			}

			if (marcaPonto == 1) {
				JOptionPane.showMessageDialog(null, "O jogador " + jogador1
						+ " venceu!!");
				pontuacao1++;
			} else if (marcaPonto ==2){
				JOptionPane.showMessageDialog(null, "O jogador " + jogador2
						+ " venceu!!");
				pontuacao2++;
			}
				
			JOptionPane.showMessageDialog(null, "O placa atual eh:\n"
					+ jogador1 + ": " + pontuacao1 + "\n" + jogador2 + ": "
					+ pontuacao2, "Resultado", JOptionPane.INFORMATION_MESSAGE);
		}
	}
}

Uma sugestão: começe a pensar Orientado ao Objeto. Vc tá fazendo estruturado dentro de uma classe. Defina classes, responsabilidades e relacionamentos entre elas. Separa a lógica de negócios da interface gráfica. Estude padrões de projeto, e técnicas de modelagem OO. Isso ajuda bastante a não tornar o Java enfadonho e difícil.

Farei isso e postarei novamente… Valeu…

Eh isso aih, terminei o programa… Agora sim, para mim, é a parte mais importante… Tentei deixar da maneira mais orientada a objetos possível. Caso eu tenha errado em algo, peço que por favor critiquem!! Obrigado desde já!!!

CLASSE MAIN

import java.io.IOException;

import javax.swing.JOptionPane;

public class JogoDaVelha {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		boolean valida;
		int array[][] = new int[3][3];
		int vezDeQuem = 0;
		int acabou;
		int marcaPonto;
		int pontuacao1 = 0;
		int pontuacao2 = 0;
		int contador;
		String campo;
		String desenho;
		String jogador1, jogador2, jogador;

		somaPonto sp = new somaPonto();
		FimDeJogo fdj = new FimDeJogo();

		jogador1 = JOptionPane
				.showInputDialog("Digite o nome do primeiro jogador");
		jogador2 = JOptionPane
				.showInputDialog("Digite o nome do segundo jogador");

		while (true) {
			acabou = 0;
			marcaPonto = 0;
			contador = 0;
			valida = true;

			for (int i = 0; i < 3; i++) {		//Inicializa os campos do jogo
				for (int j = 0; j < 3; j++) {	
					array[i][j] = 0;			
				}
			}

			while (valida) { // Enquanto não der velha ou alguém ganhar
				if (!(vezDeQuem % 2 == 0)) { // Verifica quem vai jogar
					jogador = jogador1;
					desenho = "O";
					marcaPonto = 1;
				} else {
					jogador = jogador2;
					desenho = "X";
					marcaPonto = 2;
				}

				System.out.println("É sua vez " + jogador + "!!");

				campo = JOptionPane
						.showInputDialog("Digite o campo em que deseja jogar");

				if (sp.pontuar(array, campo, marcaPonto)) { // Se digitou um campo válido
					vezDeQuem++;
					contador++;
				}

				if (contador == 9) { //Se deu velha
					JOptionPane.showMessageDialog(null, "Deu velha!!");
					fdj.exibePlacar(jogador1, jogador2);	// Exibe o placar sem alteração
					valida = false;
				} else if (fdj.campoValido(array, marcaPonto) != 0) { // Se alguém ganhou
					fdj.alteraPlacar(marcaPonto, jogador1, jogador2); // Altera o placar e o exibe
					valida = false;
				}

			}
		}
	}
}

CLASSE FimDeJogo

import javax.swing.JOptionPane;

public class FimDeJogo {
	int pontuacao1 = 0;

	int pontuacao2 = 0;

	public int campoValido(int array[][], int marcaPonto) {
		for (int i = 0; i < 3; i++) {
			if (array[i][0] == marcaPonto && array[i][1] == marcaPonto
					&& array[i][2] == marcaPonto)
				return marcaPonto;
		}

		for (int i = 0; i < 3; i++) {
			if (array[0][i] == marcaPonto && array[1][i] == marcaPonto
					&& array[2][i] == marcaPonto)
				return marcaPonto;
		}

		if (array[0][0] == marcaPonto && array[1][1] == marcaPonto
				&& array[2][2] == marcaPonto)
			return marcaPonto;
		else if (array[0][2] == marcaPonto && array[1][1] == marcaPonto
				&& array[2][0] == marcaPonto)
			return marcaPonto;
		return 0;
	}

	public void alteraPlacar(int marcaPonto, String jogador1, String jogador2) {
		if (marcaPonto == 1) {
			JOptionPane.showMessageDialog(null, "O jogador " + jogador1
					+ " venceu!!");
			pontuacao1++;
		} else if (marcaPonto == 2) {
			JOptionPane.showMessageDialog(null, "O jogador " + jogador2
					+ " venceu!!");
			pontuacao2++;
		}
		exibePlacar(jogador1, jogador2);
	}

	public void exibePlacar(String jogador1, String jogador2) {
		JOptionPane.showMessageDialog(null, "O placa atual eh:\n" + jogador1
				+ ": " + pontuacao1 + "\n" + jogador2 + ": " + pontuacao2,
				"Resultado", JOptionPane.INFORMATION_MESSAGE);
	}
}

CLASSE somaPonto

import javax.swing.JOptionPane;


public class somaPonto {
	public boolean pontuar (int array[][], String campo, int marcaPonto) {
		if (campo.equals("a1") && array[0][0] == 0) {
			array[0][0] = marcaPonto;
			return true;
		}
		else if (campo.equals("a2") && array[0][1] == 0) {
			array[0][1] = marcaPonto;
			return true;
		}
		else if (campo.equals("a3") && array[0][2] == 0) {
			array[0][2] = marcaPonto;
			return true;
		}
		else if (campo.equals("b1") && array[1][0] == 0) {
			array[1][0] = marcaPonto;
			return true;
		}
		else if (campo.equals("b2") && array[1][1] == 0) {
			array[1][1] = marcaPonto;
			return true;
		}
		else if (campo.equals("b3") && array[1][2] == 0) {
			array[1][2] = marcaPonto;
			return true;
		}
		else if (campo.equals("c1") && array[2][0] == 0) {
			array[2][0] = marcaPonto;
			return true;
		}
		else if (campo.equals("c2") && array[2][1] == 0) {
			array[2][1] = marcaPonto;
			return true;
		}
		else if (campo.equals("c3") && array[2][2] == 0) {
			array[2][2] = marcaPonto;
			return true;
		}
		else {
			JOptionPane.showMessageDialog(null,
					"Digite um campo válido!!");
			return false;
		}
	}
}

Bom, prosseguindo com meu jogo, estou agora tentando implementar o modo Single Player, mas não estou conseguido… Já tentei olhar códigos na internet mas a maioria está sem documentação, daí fica difícil… Preciso apenas do “passo inicial” pois não sei como identificar qual a melhor jogada a ser realizada pelo computador.

Valeu…

Faça o computador sempre se defender (assim como nós)

primeiro faça um método que verifique, se em algum lugar do array, se ele jogar, ela possa vencer. caso não haja…

Um método que varra o array e verifique onde se o adversário jogar, ele pode vencer, marcando lá.

caso contrário, jogue em qualquer lugar livre!

:slight_smile:

Legal, já consegui formar um raciocínio, vou tentar… Valeu!!

Olá thundercas
Legal ver você se dedicando! :smiley:

Além das dicas que os colegas forneceram, aproveite que você reformulou o programa aplicando orientação a objetos e estude um pouco de modelagem. Uma ótima referência é o livro da série Head First (não sei se tem tradução).

Por que falei isso? Porque acho que você poderia refatorar seu jogo da velha para dividir mais as responsabilidades. Por exemplo, você poderia ter uma classe Tabuleiro, e uma outra classe Peca (esta pode ser X ou O).

[MODO VIAGEM ON]
Poderia também haver uma interface que representasse a lógica do jogo, uma vez que existem várias maneiras de implementar o raciocínio do computador em um jogo da velha (umas mais burras, outras mais inteligentes). Cada estratégia poderia ficar implementada em uma classe diferente, e você poderia mudar a forma como o computador joga em tempo de execução.
[MODO VIAGEM OFF]

Enfim, as possibilidades são inúmeras. Boa sorte nos seus estudos.

Tem um jeito do computador só ganhar ou empatar no jogo da velha. Estude sobre a lógica do jogo e verá :slight_smile:

Se você quiser fazer a IA de um jeito mais punk, você pode pesquisar sobre árvores de decisão.
Com essa técnica, o computador também pode extrapolar qual é a melhor estratégia em 2 ou 3 jogadas.

E já, de quebra, acaba vendo estruturas de dados, árvores, e um pouco de IA.

No caso do jogo da velha, é possível chegar num algoritmo ideal só com ifs, mas a idéia seria aprender a técnica em si. Enfim, como disse o colega ali em cima, há inúmeras possibilidades. Você pode retrabalhar o projeto e estudar OO, você pode estudar IA, ou mesmo tentar passar isso para a interface gráfica com Java 2D.

A escolha é sua.

Pow, valeu mesmo pelas dicas!!! Tentarei melhorar o programa hoje utilizando as dicas passadas… Obrigado mesmo!!!

Muito massa!