Jogo da Velha!

8 respostas
volber

Pessoal o problema é o seguinte, tenho um array [3][3], onde existe o jogador e a CPU, inserindo "X" no caso eu coloquei o jogador e "O" a CPU, a CPU é inserida atraves de um Random, e o jogador atraves de Bloco de instruções pedindo a "Linha" e a "Coluna" e inserindo o "X" nessa posição.

Problema é que o random não pode sair em uma determinada posição mais de uma vez.

Lembrando que Linha 0 pode sair na coluna 0, 1, ou 2, Problema é como fazer isso.

É possivel resolver isso usando Collections.shuffle, e tbm se alguem poderia ensinar a usar esse metodo.

O codigo abaixo

import javax.swing.JOptionPane;
import java.util.Random;

public class JogoVelha {
	public static  void main (String[] args){
		JOptionPane.showMessageDialog(null, "               BEM VINDO   " + "\n" +
			                                "                      AO      " + "\n" +
			                                "          JOGO DA VELHA ", "Jogo da Velha",
			                                JOptionPane.WARNING_MESSAGE);
	    JOptionPane.showMessageDialog(null, " O 1º que completar um linha, coluna ou diagonal, é o VENCEDOR." + "\n" +
	    	                                " " + "\n" +
	    	                                " Esquema de jogo abaixo" + "\n" +
	    	                                " " + "\n" +
	    	                                " [ ] [ ] [ ]" + "\n" +
	    	                                " [ ] [ ] [ ]" + "\n" +
	    	                                " [ ] [ ] [ ]" + "\n" ,
	    	                                "Jogo da Velha",JOptionPane.WARNING_MESSAGE);
	    String velha[][] = new String[3][3];
	    Random ale = new Random();
	    int linha=0;
	    int coluna=0;
	    String linhaStr="";
	    String colunaStr="";
	    String jog="X";
	    String cpu="O";
	    String opcao="v";
	    
	    JOptionPane.showMessageDialog(null, " Voçê será (X)" + "\n" +
	    	                                " " + "\n" +
	    	                                " CPU será (O)","Jogo da velha",
	    	                                JOptionPane.WARNING_MESSAGE);
	   
	    
	    do {
	    	   		linhaStr = JOptionPane.showInputDialog(null, "Digite a linha 1, 2 ou 3",
	    	                                             "Jogo da Velha",JOptionPane.QUESTION_MESSAGE);
	    	linha = Integer.parseInt(linhaStr);
	    	linha--;
	    	
	    	colunaStr =JOptionPane.showInputDialog(null, "Qual a coluna 1, 2 ou 3",
	    	                                             "Jogo da Velha",JOptionPane.QUESTION_MESSAGE);
	    	coluna = Integer.parseInt(colunaStr);
	    	coluna--;
	    	velha[linha][coluna]=jog;
	    	
	    	JOptionPane.showMessageDialog(null, "Sua Jogada" + "\n" +
	    		                                " " + "\n" +
	    		                                "["+velha[0][0]+"] ["+velha[0][1]+"] ["+velha[0][2]+"]" +"\n" +
	    		                                "["+velha[1][0]+"] ["+velha[1][1]+"] ["+velha[1][2]+"]" +"\n" +
	    		                                "["+velha[2][0]+"] ["+velha[2][1]+"] ["+velha[2][2]+"]",
	    		                                "Jogo da Velha",JOptionPane.INFORMATION_MESSAGE);
	        linha =ale.nextInt(3);
	    	coluna=ale.nextInt(3);
	    	velha[linha][coluna]=cpu;
	    	JOptionPane.showMessageDialog(null, "Jogada da CPU" + "\n" +
	    		                                " " + "\n" +
	    		                                "["+velha[0][0]+"] ["+velha[0][1]+"] ["+velha[0][2]+"]" +"\n" +
	    		                                "["+velha[1][0]+"] ["+velha[1][1]+"] ["+velha[1][2]+"]" +"\n" +
	    		                                "["+velha[2][0]+"] ["+velha[2][1]+"] ["+velha[2][2]+"]",
	    		                                "Jogo da Velha",JOptionPane.INFORMATION_MESSAGE);
	        if ((velha[0][0]==jog) & (velha[0][1]==jog) & (velha[0][2]==jog) |
	    	    (velha[1][0]==jog) & (velha[1][1]==jog) & (velha[1][2]==jog) |
	    	    (velha[2][0]==jog) & (velha[2][1]==jog) & (velha[2][2]==jog) |
	    	    (velha[0][0]==jog) & (velha[1][1]==jog) & (velha[2][2]==jog) |
	    	    (velha[0][2]==jog) & (velha[1][1]==jog) & (velha[2][0]==jog) |
	    	    (velha[0][0]==jog) & (velha[1][0]==jog) & (velha[2][0]==jog) |
	    	    (velha[0][1]==jog) & (velha[1][1]==jog) & (velha[2][1]==jog) |
	    	    (velha[0][2]==jog) & (velha[1][2]==jog) & (velha[2][2]==jog)){
	    	            	JOptionPane.showMessageDialog(null, "Parabens, VOÇÊ FOI O VENCEDOR",
	    	            	                                    "Jogo da Velha",JOptionPane.INFORMATION_MESSAGE);
	    	     break;
	    	            } if((velha[0][0]==cpu) & (velha[0][1]==cpu) & (velha[0][2]==cpu) |
	    	                 (velha[1][0]==cpu) & (velha[1][1]==cpu) & (velha[1][2]==cpu) |
	    	                 (velha[2][0]==cpu) & (velha[2][1]==cpu) & (velha[2][2]==cpu) |
	    	                 (velha[0][0]==cpu) & (velha[1][1]==cpu) & (velha[2][2]==cpu) |
	    	                 (velha[0][2]==cpu) & (velha[1][1]==cpu) & (velha[2][0]==cpu) |
	    	                 (velha[0][0]==cpu) & (velha[1][0]==cpu) & (velha[2][0]==cpu) |
	    	                 (velha[0][1]==cpu) & (velha[1][1]==cpu) & (velha[2][1]==cpu) |
	    	                 (velha[0][2]==cpu) & (velha[1][2]==cpu) & (velha[2][2]==cpu)) {
	    	            	JOptionPane.showMessageDialog(null, "HuaHua Perdeu pra CPU, que burro !!!",
	    	            	                                    "Jogo da Velha",JOptionPane.INFORMATION_MESSAGE);
	    	                break;
	    	            }
	    	   } while ((velha[0][0]!=cpu) & (velha[0][1]!=cpu) & (velha[0][2]!=cpu) |
	    	            (velha[1][0]!=cpu) & (velha[1][1]!=cpu) & (velha[1][2]!=cpu) |
	    	            (velha[2][0]!=cpu) & (velha[2][1]!=cpu) & (velha[2][2]!=cpu) |
	    	            (velha[0][0]!=cpu) & (velha[1][1]!=cpu) & (velha[2][2]!=cpu) |
	    	            (velha[0][2]!=cpu) & (velha[1][1]!=cpu) & (velha[2][0]!=cpu) |
	    	            (velha[0][0]!=cpu) & (velha[1][0]!=cpu) & (velha[2][0]!=cpu) |
	    	            (velha[0][1]!=cpu) & (velha[1][1]!=cpu) & (velha[2][1]!=cpu) |
	    	            (velha[0][2]!=cpu) & (velha[1][2]!=cpu) & (velha[2][2]!=cpu));
	     
	}
}

8 Respostas

ViniGodoy

Já é a terceira vez que essa mesma pergunta é feita em menos de um mês. É uma boa usar a busca do fórum de vez enquando…

O link para resposta é:
http://www.guj.com.br/posts/list/84012.java#448527

Você pode simplificar muito o seu código usando alguns fors.

Giulliano

Realmente desenvolver um jogo da velha não requer muito conhecimento de java e nem de outra linguagem qualquer. É pura lógica de programação.

Quanto a sua pergunta achei péssimo essa idéia de colocar as peças com um random. Sinceramente põe uma lógica verificando se o jogador vai marcar ponto e não deixa…e depois faz outra pra vc procurar por possíveis maneiras de vencer…random é fd…

Ironlynx

É, talvez seja hora de implementarmos uma velha idéia que tínhamos no guj, o “Banco de Códigos”.Ou um tópico só disso.

volber

Oh mano desculpa aew, eu ja li esse topico, mas é que ainda não consegui entender.

Obrigado.

ViniGodoy

Uma dica.

Você pode continuar perguntando no seu tópico original, ao invés de duplicar tópicos com a mesma dúvida.

Lá, três pessoas (inclusive eu) responderam ao que você perguntava e poderíamos ter continuado respondendo as suas dúvidas sobre o mesmo assunto, caso você mantivesse a discussão por lá. Como receberíamos a notificação de nova resposta por e-mail, provavemente responderíamos muito mais rapidamente do que ocorreu quando vc postou uma dúvida nova (e ninguém recebeu notificação alguma).

Além disso, quando você posta uma dúvida nova, mesmo no seu tópico original, o tópico volta a subir para a área de “tópicos recentes”.

Via de regra, não duplique tópicos. Causa um grande inconveniente para o fórum, especialmente para quem responde (como eu), já que agora eu passo a receber notificações diferentes duas vezes, para as mesmas dúvidas.

Fica aí a dica… :wink:

ViniGodoy

volber:
Oh mano desculpa aew, eu ja li esse topico, mas é que ainda não consegui entender.

Obrigado.

E porque não perguntou por lá mesmo? Ou no seu tópico original?

F

volber:
Oh mano desculpa aew, eu ja li esse topico, mas é que ainda não consegui entender.

Obrigado.


Cara tambem to desenvolvendo o mesmo código esse problema eu resolvi com uma recursão.Recursao???Calma ai galera,vou explicar…
ou seja qd as combinacoes se repetem significa que o valores escolhidos pela funcao Random vao ser colocado em um lugar ja ocupado correto?
Logo vc chama novamente o método.Entretando no meu código eu tenho um enum para estatus do JOGO
enum ESTADOJOGO{GANHOU,PERDEU,EMPATE} atenção!qd vc chamar o mesmo metodo vc deve verificar o estado do jogo se não StackOverFlower!!!Pois pode acontecer que o tabuleiro esteja completo devido a todas as casas estarem ocupadas!!! :wink:

ViniGodoy

Outra coisa que vc pode fazer:

Crie uma lista de possibilidades de casas (no caso do jogo da velha, são 9).
Cada cada escolhida, retire da lista.

Aí vc só precisa fazer um "random" entre as casas livres.

Exemplo:

public void VelhaRandom {
   public List<Integer> casas  = new ArrayList<Integer>();
   Random random = new Random();

   public VelhaRandom() {
      clear();
   }

   public void clear() {
      casas.clear();
      for (int i = 0; i < 9; i++)
         casas.add(i);
   }

   public int sortear() {
      int casa = random.nextInt(casas.size());   
      casas.remove(casa);
      return casa;
    }

   public boolean removerCasa(Integer umaCasa) {
      return casas.remove(casa);
   }
}

O ideal mesmo é, ao invés de uma List<Integer>, você criar uma List<Casa>. E na classe Classe casa vc guarda uma possível linha/coluna.
O método removerCasa deve ser chamado quando o jogador jogar. Se ele retornar false, é pq o jogador já jogou numa casa ocupada.

Criado 7 de março de 2008
Ultima resposta 10 de mar. de 2008
Respostas 8
Participantes 5