JavaFx-Bilgi Yarışması(Veri Tabanlı)

Başlangıç olarak böyle bir ekran bizi karşılayacak sonraki soru butonuna bastıkça ilerleyecek ve bize veri tabanından çektiği soruları yöneltecek.
En sonda ise;
2.jpg
Bu şekilde bize toplam da kazandığımız puanı gösterecek.
Kodlara başlamadan önce veri tabanı sınıfını tekrar yazmayacağım bunu daha önceki yazılarımdan bulabilirsiniz tek değişiklik yapacağımız yer ;

final private String url="jdbc:mysql://localhost:3306/sorular";

Kısmı olacak. Benim veri tabanı ismim sorular şeklinde açılmıştı siz istediğinize göre değiştirebilirsiniz tabi ki.
Veri tabanını da göstereyim ;
3.jpg
Arayüz tasarımımız scene Builder üzerinden şu şekilde olacak.
4.jpg
Bu şekilde şimdi kodlara geçersek eğer;
Dilerseniz soru sınıfını gösterelim.Soru şeklinde bir java.class açıp içine bunları yazacağız ve daha sonra getter ve setter yapacağız.
(Getter ve setter nasıl yapılır derseniz fn+alt+insert tuşlarına basarsanız açılan pencerede getter and setter yazan yere tıklayıp hepsini seçtikten sonra kendi oluşturur.)

    int s_id,puan;
    String soru,d_cevap,cevap1,cevap2,cevap3,cevap4;

Öncelikle veri tabanından soruları alacağımız kodları yazacağımız sınıftan başlıyorum.(soruController) ilk komutumuz bize soru sıramız hangisinde ise bize sırasına göre getirecek.

public soru getQuestion(int sira){//Buraya sorunun sırasını göndericez
        try {
            soru a = new soru();/soru sınıfından bir değişken aldık
            Baglanti vb = new Baglanti();
            vb.baglan("");
            PreparedStatement ps = vb.connection.prepareStatement("select * from sorular where s_id = ?");//s_id'ye göre sorularımızı getirecek
            ps.setInt(1, sira);//soru işareti yerine sorgu için gelen sırayı yerleştirdik
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {                
                 a.setCevap1(rs.getString("cevap1"));//değişkenimize atıyoruz
                 a.setCevap2(rs.getString("cevap2"));
                 a.setCevap3(rs.getString("cevap3"));
                 a.setCevap4(rs.getString("cevap4"));
                 a.setD_cevap(rs.getString("dogru_cevap"));
                 a.setPuan(rs.getInt("puan"));
                 a.setS_id(rs.getInt("s_id"));
                 a.setSoru(rs.getString("soru"));
            }
            
            return a;//soru değişkenini geri döndürüyoruz.
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }
    }

Diğer fonksiyonumuz ise doğru cevap verilip verilmediğini kontrol edecek.

public soru check(String cevap){//radyo butondan çekeceğimiz cevabı göndereceğiz
        soru a = new soru();//değişken çağırdık
        try {
            Baglanti vb = new Baglanti();
            vb.baglan("");
            PreparedStatement ps = vb.connection.prepareStatement("select puan from sorular where dogru_cevap=?");//doğru cevaba göre veri tabanından kontrol edecek
            ps.setString(1, cevap);//sorguda '?' yerine gelen cevabı yerleştirdik.
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {             
                a.setPuan(rs.getInt("puan"));//gelen puanı değişkene atadık
            }
            return a;//değişkeni sadece puanıyla beraber geri döndürdük
        } catch (Exception e) {
            System.out.println(e.getMessage());
            a.setPuan(5);
            return a;
        }
    }

Ve asıl komutları yazacağımız yere gelirsek (FXMLDocumentController) kodlarımız şöyle olacak.

//Her yerden ulaşabilmek için değişkenleri dışarıda tanımladık
    soruController src = new soruController();
    soru s = new soru();
//ilk açılışta karşımıza ilk sıradaki soruyu çekip yerleştirmesini istiyoruz    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
//toogle group yapıyoruz. Bu radyo butonlarının ikisine birden tıklamamızı engelleyecek
        rb_1.setToggleGroup(sorular);
        rb_2.setToggleGroup(sorular);
        rb_3.setToggleGroup(sorular);
        rb_4.setToggleGroup(sorular);
        lbl_kalan.setText("1");//Bu label butonun yanındaki hangi soruda isek onu gösteren labelimiz ilk soru olduğu için '1' yazdırdık
        lbl_puan.setText("0");//puan başta '0' olacağı için '0' yazdırdık
        s=src.getQuestion(1);//soruController sınıfından 1. soruyu çağırdık.
        lbl_soru.setText(s.getSoru());//teker teker label'e ve radyo butonlara ekliyoruz.
        rb_1.setText(s.getCevap1());
        rb_2.setText(s.getCevap2());
        rb_3.setText(s.getCevap3());
        rb_4.setText(s.getCevap4());
    } 

Şimdi sonraki soru butonuna bastığımızda ne yapacağını belirteceğiz. Temel mantık olarak bize ilk bastığımızda 2. soruyu getirmesi gerekli bu yüzden ilk başta 2. soruyu isteyeceğiz daha sonra değişkenleri arttırarak sonraki soruları alacağız. İncelersek;

//ilk başta 2. soruyu alacağımız için gerekli değişkenleri tanımladık
    int i=2;//sorunun sırası
    int x=2;//arayüzde labele yazdıracağımız değişken
    int puan = 0;
    
    @FXML
    private void next(ActionEvent event) {
        soru a= new soru();
        /*öncelikle veri tabanında 10 soru olduğu için 11. sıraya geldiyse programı kapatmamız gerekli ilk önce bunu kontrol etmesi gerekli olduğu için en başa yazdık*/
        if(x==11){
            lbl_puan.setText(String.valueOf(puan));//sağ üst köşede puan yerine topladığımız puanı yazdıracağız
            rb_1.setDisable(true);//radyo butonları disable yapıyoruz
            rb_2.setDisable(true);
            rb_3.setDisable(true);
            rb_4.setDisable(true);
//ayrı bir pencerede puanı gösteriyoruz
            JOptionPane.showMessageDialog(null, "Tebrikler puanınız ="+puan);
        }
//her radyo butona basıldığında yapılacaklar        
        if(rb_1.isSelected()){
            a = src.check(rb_1.getText());//radyo butonunun üzerindeki text'i alıp kontrol fonksiyonuna yolluyoruz.
            puan = puan + a.getPuan();//puanı alıp elimizde olan puana ekliyoruz
            rb_1.setSelected(false);//seçili olduğu için iptal ediyoruz ki diğer soru geldiğinde seçili gözükmesin
        }
        else if(rb_2.isSelected()){
            a = src.check(rb_2.getText());
            puan = puan + a.getPuan();
            rb_2.setSelected(false);
        }
        else if(rb_3.isSelected()){
            a = src.check(rb_3.getText());
            puan = puan + a.getPuan();
            rb_3.setSelected(false);
        }
        else if(rb_4.isSelected()){
            a = src.check(rb_4.getText());
            puan = puan + a.getPuan();
            rb_4.setSelected(false);
        }
        else{//eğer seçim yapmadan butona basılırsa uyarı verdiriyoruz.
            JOptionPane.showMessageDialog(null, "Lutfen seciminizi yapınız.");
            return;
        }
//ilk başta buraya '2' gönderip 2. sırada ki soruyu çekiyoruz
        s=src.getQuestion(i);
        lbl_soru.setText(s.getSoru());
        rb_1.setText(s.getCevap1());
        rb_2.setText(s.getCevap2());
        rb_3.setText(s.getCevap3());
        rb_4.setText(s.getCevap4());
        
//yine ilk başta 2. soruya geçeceğimiz için 2 yazıdıracağız
        lbl_kalan.setText(String.valueOf(x));
//daha sonra x ve i değerlerini arttırıyoruz ki her seferinde bir sonraki soruyu getirsin
        x++;
        i++;
        
    }

Evet arkadaşlar bu şekilde kısa bir program daha da geliştirilebilir tabi ki.
Veritabanı ve projenin aslını buradan indirebilirsiniz.

Yorum bırakın