Erro em jogo de sorteio

6 respostas
Suellen_Susu

Bom dia pessoal!

Primeiro vou apresentar o que estou desenvolvendo, e depois o erro:

Estou fazendo tipo um jogo de bingos, só q com palavras, onde o usuário as cadastra, e o jogo sorteia uma, através da ação d um botão. Todo esse código de sorteio e exibição das palavras sorteadas ja esta feito. Porém, ele esta feito d forma diferente: ao invés de ser utilizado um array e o math.random para realizar o sorteio e a exibição das palavras, criei uma coluna no meu banco chamada “marca”, do tipo int, em que ela só possui em seu campo, ou 0 ou 1, sendo através dessa coluna q eu faço o sorteio e a exibição das palavras no jogo.

Porém o erro é o seguinte: qndo o programa roda pela primeira vez, ele sorteia todas as palavras, certinho, adicionando-as a um jList. Mas, se eu clico num botão de “zera td” e q funciona como função de “novo jogo”, ele deixa de sortear e mostra a ultima palavra do banco.

Ex: tenho 6 palavras, 6 registros no meu BD. Qndo abro a tela do jogo, ele sorteia todos, cada vez q clico no botão “Sorteio”, mostrando ao final, a mensagem de q deve-se iniciar d novo o jogo. Só q depois q clico em “novo jogo” e clico em “sorteio” novamente, ele sorteia até a 5ª palavra, e qndo clico pela 6ª vez, ñ ocorre nada, ele só altera no banco o campo marca dakeel registro, mas no modo visual do jogo, ñ muda nada. ai, qndo clico pela 7ª vez nesse botão, ele apenas mostra novamente a mensagem de q o jogo acabou. Ou seja, qndo o jogo é recomessado, ele deixa de exibir a ultima palavra sorteada.

Sendo assim, segue abaixo toda a codificação desta tela, q tem relação com este problema:

Obs: está abaixo apenas os códigos principais…

package bingoteacher2ªversao;

import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;
import java.sql.SQLException;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;

public class Sorteio extends javax.swing.JFrame {
    
    public static String teste="", palavraBanco="";
    public static int cont=0, marca=0, c=0, id=0, testeInt=0;
 DefaultListModel modelo = new DefaultListModel();  
    JList listPalavras = new JList(modelo);

/* metodo usado em janelas e no botão Novo Jogo*/
    
    public void atualizaBD()
    {
        if(BD.getConnection())
        {
            try
            {
                 id=0;
                 modelo.clear();
                 if(BD.getConnection())
                 { 
                  String query = "SELECT * from palavra";
                  BD.setResultSet(query);
                  String sql = "UPDATE palavra SET marca = 0 where marca =1";  
                  BD.runSQL(sql);
                 } 
            }
            catch(java.lang.Exception ex)
            {
                ex.printStackTrace();
            }        
        }    
    }
    
    /* O método abaixo atualiza os componentes que recebem dados do banco, 
     * sendo eles os campos de palavra e id.
     * 
     */
    
    public void atualizaCampo()
    {
        if(BD.getConnection())
        {
            try
            {
                String query = "SELECT * FROM  palavra ORDER BY RAND()";
                BD.setResultSet(query);
                while(BD.resultSet.next())
                {
                    marca = (BD.resultSet.getInt("marca"));
                    if(marca<1)
                    {
                        palavraBanco = (BD.resultSet.getString("pal"));
                        cont = (BD.resultSet.getInt("id"));
                    }    
                }    
            }
            catch(java.lang.Exception ex)
            {
                ex.printStackTrace();
            }        
        }    
    }
    

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
        // TODO add your handling code here:
        listPalavras.setVisibleRowCount(100); 
        if(BD.getConnection())
        {
            try
            {
                teste = "SELECT COUNT(id) AS C from palavra";
                BD.setResultSet(teste);
                BD.resultSet.next();
                c = BD.resultSet.getInt("C");
            } 
            catch(java.lang.Exception ex)
            {
                ex.printStackTrace();
            }        
        }   
        
    }                                 

    private void SortearActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
   if(BD.getConnection())
   {
      try
      {
         String sql = "UPDATE palavra SET " +  //coloca 1 na coluna marca, onde 
                "marca = '"+ 1 +"'" +          //o id for igual a variavel cont
                "WHERE id = '"+ cont +"'";
        int r = BD.runSQL(sql);
        
        id++;
        atualizaCampo();   
        MostraSorteada.setText(palavraBanco); 
        
        if(!modelo.contains(palavraBanco))// Testa se o item existe na lista 
        {  
              modelo.addElement(palavraBanco);  
        } 
              
        if (id>c) //variavel c representa o tamanho do banco de dados
        {
          JOptionPane.showMessageDialog(null, "Todas as palavras ja foram sorteadas! Clique em 'Novo Jogo' para iniciar uma nova partida.", "Sorteio das palavras:", JOptionPane.ERROR_MESSAGE);
          MostraSorteada.setText("");
        }     
    } 
    catch(java.lang.Exception ex)
    {
        ex.printStackTrace();
    }        
 }   
    
    }     

private void SairActionPerformed(java.awt.event.ActionEvent evt) {                                     

     atualizaBD();
    this.dispose();
              
}

private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
        // TODO add your handling code here:
        atualizaBD();
        
    } 

private void NJActionPerformed(java.awt.event.ActionEvent evt) {                                   
        // TODO add your handling code here:
        atualizaBD();
    }                                  
    

  public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Sorteio().setVisible(true);
            }
        });
    }

Desde já, obrigada pela ajuda!!! ;D

6 Respostas

J

Pode estar errado, mas seu código parece normal pra mim…
O problema deve estar em outro lugar…
Coloque mais do seu código ai.

Suellen_Susu

Javax2011:
Pode estar errado, mas seu código parece normal pra mim…
O problema deve estar em outro lugar…
Coloque mais do seu código ai.

A único código a mais q poderia colocar seria a classe BD, pois o resto, acredito eu, q ñ tem relação com o problema… :roll:

Segue abaixo a classe BD:

package bingoteacher2ªversao;

import java.sql.*;

/**
 *
 * @author Suellen
 */
public class BD {
    
    public static Connection connection = null;
    public static Statement statement = null;
    public static ResultSet resultSet = null;
    public static final String DRIVER = "org.gjt.mm.mysql.Driver";
    public static final String URL = "jdbc:mysql://localhost/bdmarisa";
    
    /*O método faz a conexão com o banco de dados MySQL,
     * e retorna true se houver conectado, ou false em caso negativo.
     */

    public static boolean getConnection()
    {
        try
        {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, "root", "123");
            statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            return true;
        }
        catch(ClassNotFoundException erro)
        {
            erro.printStackTrace();
            return false;
        }
        catch(SQLException erro)
        {
            erro.printStackTrace();
            return false;
        }
    }
    
    public static void close()//método que fecha os demais métodos.
    {
        closeResultSet();
        closeStatement();
        closeConnection();
    }
    
    private static void closeConnection()
    {
        try
        {
            connection.close();
            System.out.println("Desconectou");
        }
        catch(SQLException erro)
        {
            erro.printStackTrace();
        }        
    }
    
    private static void closeStatement()
    {
        try
        {
            statement.close();
        }  
        catch(Exception e)
        {
            e.printStackTrace();
        }        
    }
    
    private static void closeResultSet()
    {
        try
        {
            resultSet.close();
        }   
        catch(Exception e)
        {
            e.printStackTrace();
        }
    } 
    
    /*
     * Carrega o resultSet com o resultado do script SQL.
     */
    
    public static void setResultSet(String sql)
    {
        try
        {
            resultSet = statement.executeQuery(sql);
        } 
        catch(SQLException erro)
        {
            erro.printStackTrace();
        }        
    }
    
    /* Executa um script SQL de atualização
     * e retorna um valor inteiro, 
     * contendo a quantidade de linhas afetadas.
     */
    
    public static int runSQL(String sql)
    {
        int quant = 0;
        try
        {
            quant = statement.executeUpdate(sql);
        } 
        catch(SQLException erro)
        {
            erro.printStackTrace();
        }  
        return quant;
    }    

}
H

Seu cont recebe o id que vem do banco.
As palavras estão com os id’s sequenciais?

Suellen_Susu

helynne:
Seu cont recebe o id que vem do banco.
As palavras estão com os id’s sequenciais?

ñ entendi claramente o q vc quis dizer nessas frases helynne, poderia ser mais específico?

Obrigada! ;]

H

Só quis perguntar se no seu banco as palavras estão com os id’s em sequencia
Se nenhum numero foi pulado, talvez por causa de alguma exclusao
Ja que voce usa isso como cont, se entendi bem :?

Suellen_Susu

helynne:
Só quis perguntar se no seu banco as palavras estão com os id’s em sequencia
Se nenhum numero foi pulado, talvez por causa de alguma exclusao
Ja que voce usa isso como cont, se entendi bem :?

Ahh sim, desculpe…

Assim, os registros no banco estão todos em sequência… apenas o método “atualizaCampo();” é que q pega uma determinada sequencia desses registros (ex: 5, 1, 3, 2, 6, 4) através do “ORDER BY RAND()” …

ou seja, a principal parte do sorteio das palavras é realizado ai…

e com relação ao cont, ele é usado pra fazer a comparação com a coluna “marca”…

Criado 25 de outubro de 2011
Ultima resposta 25 de out. de 2011
Respostas 6
Participantes 3