Ajuda - Exercício Jogo da Velha

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;
	}
	
	// m�todo onde deve ser realizada a implementa��o 
	//do c�digo 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;
	}

}[/code]


[b]JogodaVelhaGui[/b]

[code]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.

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

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

Vai precisar dessas classes aqui:

Edit: Postamos na mesma hora :slight_smile:

DesenhoO

[code]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);
}

}
[/code]

DesenhoTabuleiro

[code]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);		
}

}[/code]

DesenhoX

[code]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);
}

}
[/code]

Obrigado.

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…

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

Blz

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

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

Consegui implementar aqui
wlw