자바

자바 소스코드: 369게임 혼자하기

드린 2016. 11. 23. 20:58
반응형
package javaapplication32;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class Ex7 extends JFrame{
    Ex7(){
        this.setTitle("369게임 혼자하기");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.add(new GamePanel());//객체를 생성과 동시에 프레임에 추가
        this.setLocationRelativeTo(null);
        this.setSize(310, 250);
        this.setVisible(true);
    }
}

class GamePanel extends JPanel{
    TimerThread th;//숫자 카운트를 위한 스레드 선언
    JLabel card = new JLabel();//숫자 카운트를 보여줄 레이블 생성
    JButton start = new JButton("Start");//시작 버튼 생성
    int n=1;//카운트 시작할 숫자
    boolean singleClicked=false;//클릭 유무
    boolean doubleClicked=false;//더블클릭 유무
    
    GamePanel(){
        //숫자 카운트를 보여줄 레이블을 패널에 추가
        this.setLayout(null);
        card.setOpaque(true);
        card.setBackground(Color.orange);
        card.setFont(new Font("Arial",Font.ITALIC,30));
        card.setHorizontalAlignment(JLabel.CENTER);
        card.setText(Integer.toString(n));
        card.setSize(100, 50);
        card.setLocation(100, 50);
        card.addMouseListener(new MouseListener(){
            public void mouseClicked(MouseEvent me) {
            }

            public void mousePressed(MouseEvent me) {
                if(me.getClickCount()>=2){//더블 클릭이상 하였을 때 더블클릭으로 인식
                    doubleClicked=true;
                    singleClicked=false;
                }
                else{//한번 클릭했을 때
                    singleClicked=true;
                }
                //마우스를 눌렀을 때 레이블 객체의 소스를 얻어와 배경색을 초록으로 설정
                JLabel card = (JLabel)me.getSource();
                card.setBackground(Color.green);
                }

            public void mouseReleased(MouseEvent me) {
                //마우스를 떼었을 때 레이블 객체의 소스를 얻어와 배경색을 오렌지로 설정
                JLabel card = (JLabel)me.getSource();
                card.setBackground(Color.orange);
            }

            public void mouseEntered(MouseEvent me) {}

            public void mouseExited(MouseEvent me) {}
        });
        this.add(card);
        
        //버튼을 패널에 추가
        start.setLocation(100,150);
        start.setSize(100, 30);
        start.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent ae) {
                //버튼클릭시 초기설정과 스레드 객체 생성과 실행
                n=1;
                card.setText(Integer.toString(n));
                singleClicked=false;
                doubleClicked=false;
                th = new TimerThread();
                th.start();
                
                //게임 중에는 버튼 클릭을 못하게 함
                JButton b = (JButton)ae.getSource();
                b.setEnabled(false);
            }
        });
        this.add(start);
    }
    
    synchronized void setSingleClicked(boolean b){//한번 클릭
        singleClicked = b;
    }
    
    synchronized void setDoubleClicked(boolean b){//더블 클릭
        doubleClicked = b;
    }
    
    class TimerThread extends Thread{
        public void run(){
            while(true){
                try{
                    sleep(700);//0.7초마다

                    int d1=n%10;//일의 자리
                    int d2=n/10;//십의 자리

                    if((d1==3||d1==6||d1==9)&&(d2==3||d2==6||d2==9)){//더블클릭을 해야할 상황
                        if(doubleClicked==true){//더블클릭 성공시 다시 거짓으로 바꿔줌
                            setDoubleClicked(false);
                        }
                        else{//실패시 메세지 출력
                            card.setText("FAIL...");
                            break;
                        }
                    }
                    else if(d1==3||d1==6||d1==9||d2==3||d2==6||d2==9){//한번클릭을 해야할 상황
                        if(singleClicked==true){//성공시
                            setSingleClicked(false);
                        }
                        else{//실패시
                            card.setText("FAIL...");
                        }
                    }
                    else{//아무것도 클릭하지 말아야할 상황
                        if(singleClicked==true||doubleClicked==true){//클릭시 실패
                            card.setText("FAIL...");
                            break;
                        }
                    }
                    
                    n++;//카운트 수 1씩 증가
                    if(n==100){//100까지 가면 승리
                        card.setText("WIN!!");
                        break;
                    }
                    else{//100 아래이면 계속 실행
                        card.setText(Integer.toString(n));
                    }
                }
                catch(Exception e){ return; }
            }
            start.setEnabled(true);//게임이 끝나면 버튼 활성화
        }
    }
}
public class JavaApplication32 {
    public static void main(String[] args) {
        new Ex7();
    }
}

<결과>

2016/11/23 - [자바] - 자바 소스코드: 버블 게임(비눗방울 같은)

2016/11/23 - [자바] - 자바 소스코드: 움직이는 물체를 맞추는 사격 게임

2016/11/14 - [자바] - 자바 소스코드: 아무거나 빨리 눌러 바 채우기

#자바 #자바 소스코드 #369게임 혼자하기 #명품자바 프로그래밍 13장 7번 #버튼 비활성화 #실습예제

반응형