Hôm nay mình sẽ hương dẫn các bạn làm một app nhỏ hi vọng có thể giúp các bạn trong việc học lập trình java

Chương trình của chúng ta cũng khá đơn giản . Như các bạn có thể thấy ở dưới đây

Screenshot (91)

Thôi không dài dòng mình sẽ đi thẳng vào vấn đề luôn =))))

Đây là phần giao diện chương trình chúng ta:

[code language=”java”]

private JButton btnPlay,btnRight,btnWrong;
private JLabel title,question,lbscore;

private JProgressBar progress;

private void Gui(){
     title = new JLabel("Learning Math");
     title.setBounds(150, 10, 100, 100);

     question = new JLabel("QUESTION");
     question.setBounds(160, 160, 200, 200);
     lbscore = new JLabel("Score: ");

     lbscore.setBounds(160, 100, 100, 100);
     btnPlay = new JButton("Play");

     btnPlay.setBounds(0,510,385,50);
     btnRight = new JButton("Right");
     btnRight.setBounds(20, 400, 100, 40);

     btnWrong = new JButton("Wrong");
     btnWrong.setBounds(260, 400, 100, 40);

     progress = new JProgressBar();
     progress.setBounds(2, 100, 380, 20);

     btnPlay.addActionListener(this);
     btnRight.addActionListener(this);
     btnWrong.addActionListener(this);

     add(title);
     add(lbscore);
     add(question);
     add(btnPlay);
     add(btnRight);
     add(btnWrong);
     add(progress);

}

[/code]

Nếu bạn nào chưa biết hàm setBounds thì mình sẽ giải thích luôn.

Hàm setBounds dùng để đặt vị trí của các Component trên Jframe để thực hiện hàm này ta phải setLayout cho Jframe là null

ta có 4 tham số là x,y,width,height. x,y ở đây các bạn tưởng tượng 1 trục tọa độ ở trong JFrame của chúng ta x là trục tung , y là  trục hoành . x bắt đầu từ  0  và tăng dần từ  trái sang phải , y bắt đầu từ 0 và tăng dần từ trên xuống dưới . Còn width, height là chiều rộng và chiều cao của component.

Tiếp theo chúng ta sẽ đi tới phần xử lý

[code language=”java”] private int a;
private int b;
private int c;
private int score;
private int check;
private Timer timer;
private int time;
private boolean gameover;
//Hàm xử lý sinh ra các con số ngẫu nhiên cho chúng ta
public void process(){
     //Điểm số tăng lên 1 sau mỗi
     score++;
     lbscore.setText("Score: "+score+"");

     //Ta có biểu thức a + b = c
     Random rd = new Random();
     a = rd.nextInt(10);
     b = rd.nextInt(10);

/*Nếu chúng ta làm như thế này sẽ cho ra sai rất nhiều và hầu như ko có câu nào đúng
     c = rd.nextInt(20);
     question.setText(a+"+"+b+"="+c);
*/

/*Thay vì vậy ta có biến check từ 0-5 nếu ngẩu nhiên ra số 0,2,4 thì thực hiện kết quả đúng
* ngược lại thực hiện kết quả ngẩu nhiên và hầu như là sai =)) */
     check = rd.nextInt(5);
     System.out.println(check);
     if(check % 2 ==0){
          c = a + b;
     }else{
          c = rd.nextInt(20);
     }
     question.setText(a+"+"+b+"="+c);
}
public static void main(String[] args) {
     new mainFrame().setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//các bạn xem cách load time của thanh processbar của chúng ta ở class loadtime phía dưới
     timer = new Timer(50, new loadtime());
     if(e.getSource().equals(btnPlay)){
     process();
     time = 130;
     timer.start();
     }
/*ta có biên boolean gameover mặc đinh là false
*Nếu a + b != c kết quả sai có nghĩa đúng với nút wrong của chúng ta
*timer sẽ bắt đầu load lại từ đầu
*ngược lại gán time = 0 và kết thúc
**/
     if(e.getSource().equals(btnWrong)){
          if(!gameover){
               if(a+b != c){
                    process();
                    time = 130;
                    timer.start();
               }
               else{
                    process();
                    time = 0;
                    question.setText("Fail");
                    gameover = true;
               }
          }
     }
//Phần nãy cũng giống với nút Wrong ở trên nên mình sẽ không giải thích
     if(e.getSource().equals(btnRight)){
          if(!gameover){
               if(a+b == c){
                    process();
                    time = 130;
                    timer.start();
               }else{
                    time = 0;
                    question.setText("Fail");
                    gameover =true;
               }
          }
     }
}
private class loadtime implements ActionListener{
/*Hàm này mô tả chúng ta sẽ set giá trị cho processbar là time = 130
nếu biến time ta khai báo ở phía trên > 0 thì time sẽ giảm đi ngược lại khi time < 0 set Fail */ @Override public void actionPerformed(ActionEvent e) { if(time>0){
          time–;
          progress.setValue(time);
     }
     else{
          question.setText("Fail");
     }

     }

}

[/code]

Phần code ở trên mình comment cũng khá kỷ các bạn tham khảo nếu có bất kỳ thắc mắc nào hãy để lại comment phía bên dưới

Link download source code chương trình tại đây

-N-13