Ajuda - Exercício Jogo da Velha

9 respostas
K

Pessoal, gostaria de uma pequena ajuda para solucionar um problema que não estou conseguindo localizar o erro.

O Prof de Linguagem de Programação solicitou que fizessemos um jogo da velha, o código está todo construído e rodando legal, porém não encontro uma forma de fazer com que o jogo termine após a vitória de algum marcador.
No caso após concluir o jogo o usuário deve clicar em novo jogo para recomeçar, porém mesmo após alguém vencer o tabuleiro continua aceitando jogadas, e aí que não sei onde dar o comando de parada.

Segue o código:

GerenciaJogo
public class GerenciaJogo {
	
	char[][] tabuleiro;
	boolean fim = false;
	String mensagemDeFim;
	
	GerenciaJogo(){
		tabuleiro = new char[3][3];
	}

	String getMensagemDeFim(){
		return mensagemDeFim;
	}
	
	boolean getFimDeJogo(){
		return fim;
	}
	
	// mtodo onde deve ser realizada a implementa��o 
	//do cdigo do aluno 
	void setJogada(int j, int i, char v){
		
		tabuleiro[j][i] = v;
		fim = false;
		char vencedor = 'a';
		// Verifica��o da Linha
		for (int l = 0; l <= 2; l++)
		{
			if ((tabuleiro[l][0] == tabuleiro[l][1]) && (tabuleiro[l][1] == tabuleiro[l][2]))
			vencedor = tabuleiro[l][0];
		}
		
		for (int c = 0; c <= 2; c++)
		{
			if ((tabuleiro[0][c] == tabuleiro[1][c]) && (tabuleiro[1][c] == tabuleiro[2][c]))
			vencedor = tabuleiro[0][c];
		}
		
		// Verifica��o da Primeira Dagonal
		if ((tabuleiro[0][0] == tabuleiro[1][1]) && (tabuleiro[1][1] == tabuleiro[2][2]))
			vencedor = tabuleiro[0][0];
		// Verifica��o da Segunda Diagonal
		if ((tabuleiro[0][2] == tabuleiro[1][1]) && (tabuleiro[1][1] == tabuleiro[2][0]))
			vencedor = tabuleiro[1][1];
		
		
		if (vencedor !='a' && vencedor != '-')
		{
			fim = true;
			mensagemDeFim = ("O Vencedor foi: "+ vencedor);
		}
	}
	
	char[][] getTabuleiro(){
		return tabuleiro;
	}

}

JogodaVelhaGui

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class JogoDaVelhaGUI {

	private static JButton botaoNovo;	
	private static JLabel statusLabel;
	private static char jogador;
	private static DesenhoTabuleiro tabuleiro;
	private static JFrame window;
	private static GerenciaJogo gerenciaJogo;
	
    private static void createAndShowGUI() {
        //JFrame.setDefaultLookAndFeelDecorated(true);

	    window = new JFrame("Jogo da Velha!");
	    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    window.setBounds(300, 100, 310, 380);
	    Container contentPane = window.getContentPane();

        //Set up the content pane and components in GridLayout
        addComponentsToPane(contentPane);
        
        //window.pack();
        window.setVisible(true);
        window.setResizable(false);
    }
	
    private static void addComponentsToPane(Container contentPane) {

        jogador = 'o';
        tabuleiro = new DesenhoTabuleiro();        
        JPanel painelDesenho = new JPanel();
        painelDesenho.setLayout(new BoxLayout( painelDesenho, BoxLayout.Y_AXIS) );
        painelDesenho.add(tabuleiro);

        gerenciaJogo = new GerenciaJogo();
        tabuleiro.setConfiugracao(gerenciaJogo.getTabuleiro());
        tabuleiro.limpaTabuleiro();

        statusLabel = new JLabel("Jogador - "+jogador+" - inicia o jogo!");
        JPanel painelInferior = new JPanel();
        painelInferior.setLayout(new GridLayout(0,1));

        botaoNovo = new JButton("Novo Jogo");

        botaoNovo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				statusLabel.setText("Jogador - "+jogador+" - inicia o jogo!");
				tabuleiro.limpaTabuleiro();
				tabuleiro.repaint();
			}
		});          

		//Define MouseListener
		MouseListener mouseListener = new MouseAdapter() {

		   public void mouseClicked (MouseEvent e) {
			   int posI = e.getX()/DesenhoTabuleiro.casaLargura;
			   int posJ = e.getY()/DesenhoTabuleiro.casaLargura;
			   statusLabel.setText("Mouse clicked  ("+e.getX()+", "+ e.getY()+") = tabuleiro["+posI+"]["+posJ+"]");
			   gerenciaJogo.setJogada(posJ, posI, jogador);
			   tabuleiro.repaint();
			   trocaJogador();
			   statusLabel.setText("Jogador - "+jogador+" - faça sua jogada!");
			   if (gerenciaJogo.getFimDeJogo()) {
				   statusLabel.setText(gerenciaJogo.getMensagemDeFim());
			   }
			}		   
		};
        
		tabuleiro.addMouseListener(mouseListener);
        
        painelInferior.add(botaoNovo);
        painelInferior.add(statusLabel);
       
        contentPane.add(painelDesenho,BorderLayout.CENTER);
        contentPane.add(painelInferior,BorderLayout.PAGE_END);

    }
    static void trocaJogador(){
    	if (jogador == 'x')
    		jogador = 'o';
    	else
    		jogador = 'x';
    }
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	    createAndShowGUI();  
	}

};

Alguém pode me informar onde devo modificar?
obrigado.

9 Respostas

danrox.sa

Vou rodar seu código aki cara, pera ai…

danrox.sa

Acho que ta falando a classe Desenha Tabuleiro, manda ai par eu testar…

K

Vai precisar dessas classes aqui:

Edit: Postamos na mesma hora :)

DesenhoO

import java.awt.Graphics;

import javax.swing.JComponent;


public class DesenhoO extends JComponent {


	private static final long serialVersionUID = 1L;
	
	int centroX = 15;
	int centroY = 15;
	int largura = 70;
	
	DesenhoO(int x, int y){
		centroX = centroX + x;
		centroY = centroY + y;
	}
	
	public void paint(Graphics g) {
		g.drawOval(centroY, centroX, largura, largura);
	}
	
}

DesenhoTabuleiro

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;

import javax.swing.JComponent;


public class DesenhoTabuleiro extends JComponent {
	
	public final static int casaLargura = 100; 	
	private static final long serialVersionUID = 4054553569616726653L;
	
	JComponent[][] desenhosX;
	JComponent[][] desenhosO;
	char[][] configuracoes;
	
	final int espacamento = casaLargura;
	
	int xav1 = 100;
	int yav1 = 0;
	int xav2 = 100;
	int yav2 = 300;

	int xbv1 = 200;
	int ybv1 = 0;
	int xbv2 = 200;
	int ybv2 = 300;

	
	int xah1 = 0;
	int yah1 = 100;
	int xah2 = 300;
	int yah2 = 100;

	int xbh1 = 0;
	int ybh1 = 200;
	int xbh2 = 300;
	int ybh2 = 200;


	DesenhoTabuleiro(){
		
		desenhosX = new JComponent[3][3];
		desenhosO = new JComponent[3][3];
		for (int i = 0; i < 3; i++){
			for (int j = 0; j < 3; j++){
				desenhosX[i][j] = new DesenhoX(i*espacamento,j*espacamento);
			}	
		}
		for (int i = 0; i < 3; i++){
			for (int j = 0; j < 3; j++){
				desenhosO[i][j] = new DesenhoO(i*espacamento,j*espacamento);
			}	
		}		
		
	}

	
	void setConfiugracao(char[][] conf){
		configuracoes = conf;
		
	}
	
	void limpaTabuleiro(){
		for (int i = 0; i < 3; i++){
			for (int j = 0; j < 3; j++){
				configuracoes[i][j]='-';
			}
		}
	}
	
	public void paint(Graphics g) {
		// estilo da linha 
		Stroke linhaFina = new BasicStroke(5.0f, // largura da linha
				/* estilo das pontas */BasicStroke.CAP_ROUND,
				/* estilo das dobras */BasicStroke.JOIN_ROUND);		
  		Graphics2D g1 = (Graphics2D) g;
  		// suavização 
		g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
			        RenderingHints.VALUE_ANTIALIAS_ON);
		g1.setStroke(linhaFina);
		for (int i = 0; i < 3; i++){
			for (int j = 0; j < 3; j++){
				if (configuracoes[i][j] == 'o')
					desenhosO[i][j].print(g);
				if (configuracoes[i][j] == 'x')
					desenhosX[i][j].print(g);				
			}
		}			
		g.drawLine(xah1, yah1, xah2, yah2);
		g.drawLine(xbh1, ybh1, xbh2, ybh2);
		g.drawLine(xav1, yav1, xav2, yav2);
		g.drawLine(xbv1, ybv1, xbv2, ybv2);		
	}
}

DesenhoX

import java.awt.Graphics;

import javax.swing.JComponent;


public class DesenhoX extends JComponent  {

	private static final long serialVersionUID = 1L;
	
	int xa1 = 15;
	int ya1 = 15;
	int xa2 = 85;
	int ya2 = 85;
	
	int xb1 = 15;
	int yb1 = 85;
	int xb2 = 85;
	int yb2 = 15;
	
	DesenhoX(){
	}
	
	DesenhoX(int y, int x){
		setPosicao(y, x);
	}
	void setPosicao(int y,int x){
		xa1 = xa1 + x;
		xa2 = xa2 + x;
		xb1 = xb1 + x;
		xb2 = xb2 + x;
		ya1 = ya1 + y;
		ya2 = ya2 + y;
		yb1 = yb1 + y;
		yb2 = yb2 + y;
	}
	
	public void paint(Graphics g) {
		g.drawLine(xa1, ya1, xa2, ya2);
		g.drawLine(xb1, yb1, xb2, yb2);
	}

}

Obrigado.

danrox.sa

Sou sincero cara, não analisei teu codigo direito, mais uma maneira simples na minha opnião seria a seguinte…

Ao inves de system.out.print na tela dizendo “Vencedor X Ganhou”, você manda em forma de JOptionPane.showMessage, em seguinte da mensagem você executa os metodos:

tabuleiro.limpaTabuleiro();
tabuleiro.repaint();

Ou poderia ser tambem um JOptionPane.showConfirmDialog “Vencedor X Ganhou!!! Começar outro Jogo??”

Se sim: limpa tabuleiro
Se não: System.exit(0)

Espero ter ajudado…

K

Opá, só voltei agora.
Não havia pensado dessa forma, vou tentar aqui e volto para avisar se funcionar.
obrigado pela ajuda.

danrox.sa

Blz

K

No caso do ShowConfirmDialog, onde coloco para chamar o método começa ou sair?

danrox.sa

Poderia ser assim:

Mensagem informando quem ganhou:

JOptionPane.showMessageDialog(null, "FIM DE JOGO !! JOGADOR " + ganhador + " VENCEU!!");

Confirmação de Novo jogo ou não:

private void verificaResposta (){
        
        int resposta = JOptionPane.showConfirmDialog(this, "FIM DE JOGO!!  Deseja Continuar??");
            if (resposta == JOptionPane.YES_OPTION){
                 tabuleiro.limpaTabuleiro();  
                 tabuleiro.repaint();  
            }
            else {
                System.exit(0);
            }
    }
K

Consegui implementar aqui
wlw

Criado 2 de novembro de 2010
Ultima resposta 5 de nov. de 2010
Respostas 9
Participantes 2