반응형
package javaapplication34; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; class Ex8 extends JFrame{ Ex8(){ this.setTitle("369게임 둘이하기"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(new GamePanel()); this.setLocationRelativeTo(null); this.setSize(320, 300); this.setVisible(true); } class GamePanel extends JPanel{ TimerThread th;//카운트 스레드 선언 JLabel[] card = new JLabel[2];//보여줄 화면 2개 JButton start = new JButton("Start");//시작 버튼 User[] user = new User[2];//2명의 플레이어 int n=1;//카운트 변수 char key;//입력받는 키 boolean isKeyPressed = false;//키를 눌렀는지 체크 GamePanel(){ user[0]=new User("박지성, 키:AS",'a','s'); user[1]=new User("이청룡, 키:KL",'k','l'); this.setLayout(null); this.addKeyListener(new KeyHandler()); //유저이름을 보여줄 레이블 생성과 패널에 추가 for(int i=0; i<card.length; i++){ JLabel name = new JLabel(user[i].getName()); name.setFont(new Font("고딕",Font.ITALIC,15)); name.setHorizontalAlignment(JLabel.CENTER); name.setSize(100, 50); name.setLocation(50+110*i, 50); this.add(name); } //보여줄 화면 레이블을 패널에 추가 for(int i=0; i<card.length; i++){ card[i]= new JLabel(); card[i].setOpaque(true); card[i].setBackground(Color.orange); card[i].setFont(new Font("고딕",Font.ITALIC,30)); card[i].setHorizontalAlignment(JLabel.CENTER); card[i].setSize(100,50); card[i].setLocation(50+110*i, 100); this.add(card[i]); } //시작 버튼 start.setLocation(100,200); start.setSize(100, 30); start.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae) {//시작버튼이 눌렸을 때 //초기설정들 n=1; card[0].setText(""); card[1].setText(""); isKeyPressed=false; card[(n+1)%2].setText(Integer.toString(n)); card[(n+1)%2].requestFocus();//차례차례돌아가며 입력하기위해 포커스 th = new TimerThread(); th.start();//스레드 시작 JButton b = (JButton)ae.getSource(); b.setEnabled(false);//버튼 비활성화 b.getParent().requestFocus();//컨텐트팬이 입력을 받을수있도록 포커스 전환 } }); this.add(start); } class TimerThread extends Thread{ public void run(){ while(true){ try{ sleep(700);//0.7초마다 숫자 카운트 int d1=n%10;//일의 자리 int d2=n/10;//십의 자리 int turn=(n+1)%2;//차례 int next=(turn+1)%2;//다음차례 if((d1==3||d1==6||d1==9)&&(d2==3||d2==6||d2==9)){//더블클릭 할 상황 if(isKeyPressed==true&&user[turn].isDoubleKey(key)){//성공시 isKeyPressed=false; } else if(isKeyPressed==true&&user[(turn+1)%2].isKey(key)){//다음차례 플레이어가 키를 눌렀을때 msg(next, "Fail"); break; } else{//못 눌렀을 때 msg(turn, "Fail"); break; } } else if(d1==3||d1==6||d1==9||d2==3||d2==6||d2==9){//한번 클릭해야하는 상황 if(isKeyPressed==true&&user[turn].isSingleKey(key)){//성공시 isKeyPressed=false; } else if(isKeyPressed==true&&user[next].isKey(key)){//다음차례 플레이어가 키를 눌렀을 시 msg(next, "Fail"); break; } else{//못 눌렀을 때 msg(turn, "Fail"); break; } } else{//누르지 말아야 할상황 if(isKeyPressed==true&&user[turn].isKey(key)){//해당 플레이어가 눌렀을 때 msg(turn, "Fail"); break; } else if(isKeyPressed==true&&user[next].isKey(key)){//다음 차례 플레이어 눌렀을 때 msg(next, "Fail"); break; } isKeyPressed=false;//초기설정으로 되돌림 } n++; if(n==100){//100까지 갔을 때 msg(0, "WIN!!"); msg(1, "WIN!!"); break; } else{//계속 게임 실행 card[next].setText(Integer.toString(n)); } } catch(Exception e){ return; } } start.setEnabled(true);//게임이 끝났을 때 시작버튼 활성화 } //누가 졌는지 혹은 누가 이겼는지 출력해주기 위한 메서드 void msg(int id, String s){ card[id].setText(s); } } class KeyHandler implements KeyListener{ @Override public void keyTyped(KeyEvent ke) { } @Override public void keyPressed(KeyEvent ke) { key=ke.getKeyChar();//입력된 키 isKeyPressed =true;//눌림상태로 전환 int turn=(n+1)%2; card[turn].setBackground(Color.green);//해당 턴에 누를시 초록색 배경 } @Override public void keyReleased(KeyEvent ke) { int turn = (n+1)%2; card[turn].setBackground(Color.orange);//다시 오렌지색 배경으로 전환 } } class User{ String name; char singleKey;//한번 누름 char doubleKey;//두번 누름 User(String name, char singleKey, char doubleKey){ this.name=name; this.singleKey=singleKey; this.doubleKey=doubleKey; } String getName(){ return name; } boolean isKey(char key){ return singleKey==key||doubleKey==key; } boolean isSingleKey(char key){ return singleKey==key; } boolean isDoubleKey(char key){ return doubleKey==key; } } } } public class JavaApplication34 { public static void main(String[] args) { new Ex8(); } }
<결과>
2016/11/23 - [자바] - 자바 소스코드: 369게임 혼자하기
2016/11/23 - [자바] - 자바 소스코드: 버블 게임(비눗방울 같은)
2016/11/23 - [자바] - 자바 소스코드: 움직이는 물체를 맞추는 사격 게임
#자바 #자바 소스코드 #명품자바 프로그래밍 13장 8번 #박지성 #이청룡 #369게임 둘이서 하기 #키 리스너 #실습 예제
반응형
'자바' 카테고리의 다른 글
자바 소스코드: 눈 내리는 풍경 (0) | 2016.11.23 |
---|---|
자바 소스코드: 스네이크 움직이기 (3) | 2016.11.23 |
자바 소스코드: 369게임 혼자하기 (0) | 2016.11.23 |
자바 소스코드: 버블 게임(비눗방울 같은) (0) | 2016.11.23 |
자바 소스코드: 움직이는 물체를 맞추는 사격 게임 (3) | 2016.11.23 |