프로그래밍/② JAVA(자바) 프로젝트

② JAVA(자바) 프로젝트-12 숫자야구게임 구현하기(스윙이용) == Implementing Numerical Baseball Game(using swing)

ronul 2017. 5. 5. 12:21
300x250

 NumBaseball.java

 

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class NumBaseball {
 public static int[] randomArr;
 public static int cnt = 0; // 몇번만에 맞춘지 카운트
 public static int oppor = 8; // 9회말 기회
 public static int oper;
 public static int[] userInArr;
 JFrame frame;
 JLabel label;
 JTextField userInputTxt;
 JTextArea GammingTxt;
 JButton exitBtn, inputBtn, restartBtn, startBtn;
 JPanel tpPanel, baseballPanel, underPanel,leftPanel;
 Container contentPane;
 JRadioButton[] radio = new JRadioButton[2];
 String[] text = {"3자리","4자리"};
 ButtonGroup size =new ButtonGroup();
 JSlider [] sl = new JSlider [3];
 JSlider [] sl1 = new JSlider [3];
 JSlider sl2 = new JSlider();
 // Frame
 public NumBaseball() {
  frame = new JFrame("숫자야구!!");
  frame.setPreferredSize(new Dimension(610, 550));
  frame.setLocation(350, 100);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.setVisible(true);
  
  //JTextField
  userInputTxt = new JTextField(10);
  
  TextClickListener textClickListener = new TextClickListener();
  userInputTxt.addMouseListener(textClickListener);
  // JTextArea 
  GammingTxt = new JTextArea(25, 50);
  GammingTxt.setText("안녕하세요.. 숫자야구에 오신것을 환영합니다~!");
  GammingTxt.setLineWrap(true);
  TextClickListener textClickListener1 = new TextClickListener();
  JScrollPane scroller = new JScrollPane(GammingTxt); // 스크롤바 추가
  GammingTxt.setLineWrap(true);  //자동 줄바꾸기
  GammingTxt.setEditable(false); //수정못하게함
  
  // 수직 스크롤바만 생성
  scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  
 //라디오
  for(int i = 0; i < radio.length;i++){
   radio[i] = new JRadioButton(text[i]);
   size.add(radio[i]);
   radio[i].setBorderPainted(true);
   radio[i].addItemListener(new MyItemListener());
  }
  radio[0].setSelected(true);
  
 
 
 // JLabel
  label = new JLabel();
  label.setText("숫자입력후 입력버튼을 눌러주세요 ");
     
 // JButton
  exitBtn = new JButton("게임 종료");
  ExitBtnListener exitBtnListener = new ExitBtnListener();
  exitBtn.addActionListener(exitBtnListener);
  
  inputBtn = new JButton("입력");
  inputListener inputLiseter = new inputListener();
  inputBtn.addActionListener(inputLiseter);
  inputBtn.setEnabled(false);
    
  restartBtn = new JButton("다시 시작");  
  restartListener restartListener = new restartListener();
  restartBtn.addActionListener(restartListener);
  restartBtn.setEnabled(false);
  
  startBtn = new JButton("게임 시작");
  StartBtnListener StartBtnListener = new StartBtnListener();
  startBtn.addActionListener(StartBtnListener);
  
  // Panel Create
  tpPanel = new JPanel();
  baseballPanel = new JPanel();
  underPanel = new JPanel();
  leftPanel = new JPanel();
  
  contentPane = frame.getContentPane();
  contentPane.setLayout(new BorderLayout());
  
  //topline
  tpPanel.getSize();
  tpPanel.add(label);
  tpPanel.add(userInputTxt);
  tpPanel.add(inputBtn);
  tpPanel.add(radio[0]);
  tpPanel.add(radio[1]);
  //middleline
  baseballPanel.setLayout(new GridLayout(1,1));
  baseballPanel.add(scroller);
  
  //underline
  underPanel.setLayout(new GridLayout(1,5));
  underPanel.add(startBtn);
  underPanel.add(restartBtn);
  underPanel.add(exitBtn);
 
  
  // Frame Layout
  frame.getContentPane().add(BorderLayout.NORTH, tpPanel);
  frame.getContentPane().add(BorderLayout.SOUTH, underPanel);
  frame.getContentPane().add(BorderLayout.WEST, leftPanel);
  frame.getContentPane().add(BorderLayout.CENTER, baseballPanel);

 

 

 

 

 


 // 마우스 리스너
 // -----------------------------------------------------------------------------------------------------------------------
 class TextClickListener implements MouseListener{
  public void mouseEntered(MouseEvent e){}
  public void mouseExited(MouseEvent e){}
  public void mousePressed(MouseEvent e){
   
  }
  public void mouseReleased(MouseEvent e){
   JTextField text = (JTextField) e.getSource();
   text.setText("");
  }
  public void mouseClicked(MouseEvent e){}
   
 } 
 
 
 class MyItemListener implements ItemListener{
  public void itemStateChanged(ItemEvent e){
   if(e.getStateChange() == ItemEvent.DESELECTED){
    
    return;
   }
    
   if(radio[0].isSelected()){
    userInputTxt.setDocument(new JTextFieldLimit(3));
    
    oper=1;//3자리가 체크됬는지 확인
    }
   else if(radio[1].isSelected())
   {
    
    userInputTxt.setDocument(new JTextFieldLimit(4));
    
    oper=2;//4자리가 체크됬는지 확인
   }
   
  }
 }
 //게임종료
 class ExitBtnListener implements ActionListener{
  public void actionPerformed(ActionEvent event){
  
    System.exit(0); // 시스템 종료
   
  }
 }
 //게임시작--
 class StartBtnListener implements ActionListener{
  public void actionPerformed(ActionEvent event){
   GammingTxt.append("\n게임이 시작되었습니다.!\n");
   startBtn.setEnabled(false);
   restartBtn.setEnabled(true);
   inputBtn.setEnabled(true);
   radio[0].setEnabled(false);
   radio[1].setEnabled(false);
   if(oper==1){
    randomCom(3,9);  
   }
   else{
    randomCom(4,9);  
   }
   
  }
 }
 
 
 //다시시작--
 class restartListener implements ActionListener{
  public void actionPerformed(ActionEvent event){
   cnt = 0; // 몇번만에 맞춘지 카운트
   oppor = 8; // 9회말 기회
   GammingTxt.setText("");
   GammingTxt.append("게임을 다시 시작합니다.!\n");
   GammingTxt.append("자릿수 선택 후 게임시작 버튼을 눌러주세요!\n");
   startBtn.setEnabled(true);
   restartBtn.setEnabled(false);
   
   radio[0].setEnabled(true);
   radio[1].setEnabled(true);
   if(restartBtn.isEnabled() == false){
    inputBtn.setEnabled(false);
   }
   else
   {
    inputBtn.setEnabled(true);
   }
   
  }
 }
 //입력--
 class inputListener implements ActionListener{
  public void actionPerformed(ActionEvent event){
   userInputTxt.requestFocus();
  
   try{
    GammingTxt.append("\n기회가 "+oppor+"회 남으셨습니다.\n");
    GammingTxt.append("입력하신 값은 "+userInputTxt.getText()+"입니다.\n");
    cnt++;
    userInArr = userInputNumber(); // 유저 숫자 입력
    int num = confirmArr(userInArr);// out 여부  및 strike, ball 갯수 카운트
    userInputTxt.setText("");
    if(num == 1){
     GammingTxt.append("\n스트라이크!!"+cnt+"회 만에 맞추셨습니다.\n");
     GammingTxt.append("게임이 끝났습니다 다시하려면 다시 시작버튼을 누른후 자릿수 선택과 게임시작 버튼을 눌러주세요");
   }
    else
    {
     oppor--;
    }
    if(oppor==-1){
     GammingTxt.append("\n아웃!!주어진 기회만에  맞추지 못하셨습니다.\n");
     GammingTxt.append("게임이 끝났습니다 다시하려면 다시 시작버튼을 누른후 자릿수 선택과 게임시작 버튼을 눌러주세요");
     inputBtn.setEnabled(false);
    }
   }catch(NumberFormatException e){
    JOptionPane.showMessageDialog(contentPane, "숫자가 아니거나 값을 입력하지 않았습니다","입력값 확인..", 0);
    GammingTxt.append("입력하신 값은 숫자가 아니거나 값을 입력하지 않았습니다 확인후 다시  입력버튼을 눌러주세요\n");
    cnt--;
    return;

    
   }
  }
 }
   
  //random배열 만들기
  public void randomCom(int index,int rCount) {
   
   Random r = new Random();
    
   randomArr = new int[index];
   for(int i = 0; i<randomArr.length; i++){
    int ball = r.nextInt(rCount) + 1;
    randomArr[i] = ball;
    for(int j = 0; j < i; j++){
     if(randomArr[j] != randomArr[i]){
      continue;
     }
     else{
      i--;
      break;
     }
    }
   }
  }
  
  //유저 위치값 확인
  public int[] userInputNumber() {
   String userNum = userInputTxt.getText();
   int userNum1 = Integer.parseInt(userNum);
   
   int num1, num2, num3,num4;
   if(oper==1){
    num1 = userNum1 / 100; // 100의 자리수
    num2 = (userNum1 / 10) % 10; // 10의 자리수
    num3 = userNum1 % 10; // 1의 자리수
    
    if(num1==0||num2==0||num3==0||num1==num2||num2==num3){
     cnt--;
     oppor++;
     GammingTxt.append("숫자 0이나 3자리가 아닌수 또는 같은수를 입력했습니다. 다시입력해 주세요");
     
     
    }
    int[] userNumArray = {num1, num2, num3};
    return userNumArray;
    
   }
   else{
    num1 = userNum1 / 1000; // 1000의 자리수
    num2 = (userNum1 / 100) % 10; // 100의 자리수
    num3 = (userNum1 /10)% 10; // 10의 자리수
    num4 = userNum1 % 10; // 1의 자리수   
    if(num1==0||num2==0||num3==0||num4==0||num1==num2||num2==num3||num3==num4||num2==num4){
     cnt--;
     oppor++;
     GammingTxt.append("숫자 0이나 4자리가 아닌수 또는 같은수를 입력했습니다. 다시입력해 주세요");
     
     
    }
    int[] userNumArray = {num1, num2, num3,num4 };
    return userNumArray;
    
   }
   }
  
  //스트라이크 개수와 볼개수 확인
  private int confirmArr(int[] userInArray) { // (? 스트라이크 || ? 볼) 확인
   int strike = 0;
   int ball = 0;
   for(int i = 0; i < randomArr.length; i++) {
    for(int j = 0; j < userInArray.length; j++) {
     if(randomArr[i] == userInArray[j]){
      if(i == j) strike++;
      else ball++;
     }
    }
   }
   if(oper==1){
   if(userInArray[0]==0||userInArray[1]==0||userInArray[2]==0||userInArray[0]==userInArray[1]||userInArray[1]==userInArray[2]){
    GammingTxt.append("");
   }
   else{
    GammingTxt.append(strike+"스트라이크"+ball+"볼");
   }
   }else{
    if(userInArray[0]==0||userInArray[1]==0||userInArray[2]==0||userInArray[3]==0||userInArray[0]==userInArray[1]||userInArray[1]==userInArray[2]||userInArray[2]==userInArray[3]||userInArray[1]==userInArray[3]){
     GammingTxt.append("");
    }
    else{
     GammingTxt.append(strike+"스트라이크"+ball+"볼");
    }
    
   }
   if(oper==1){
    if(strike == 3) return 1;
    else return 2;
   }
   else{
    if(strike == 4) return 1;
    else return 2;
   }
  
  }
  
  
  public class JTextFieldLimit extends PlainDocument {
  private int limit;
  private boolean toUppercase = false;
  
  JTextFieldLimit(int limit) {
  super();
  this.limit = limit;
  }
  JTextFieldLimit(int limit, boolean upper) {
  super();
  this.limit = limit;
  this.toUppercase = upper;
  }

  public void insertString(int offset, String str, AttributeSet attr)
  throws BadLocationException {
    if (str == null) {
     return;
    }
    if ((getLength() + str.length()) <= limit) {
     if (toUppercase) {
      str = str.toUpperCase();
     }
     super.insertString(offset, str, attr);
    }
  }
  }
  public static void main(String[] args){
   NumBaseball first = new NumBaseball();
  }
}
 


숫자야구 콘솔이 아닌 버젼으로 만들어봤습니다.

라디오버튼으로 3자리와 4자리 게임을 선택할수있고, 게임시작을 누르면 라디오버튼이 default 됩니다.

이후 다시시작을 누르면 gameTxt가 초기화되고 라디오 버튼이 다시 활성화가 됩니다. 이후 자리수를 선택한 후 게임시작을 누르면 새 게임을 시작할 수 있습니다.

간단하게 만드느라 게임설명같은 것은 넣지 않았지만 한번 해보시면 쉽게 사용하실거라 생각합니다.

gameTxt는 조작할수없게 막아놨고 숫자를 입력하지않으면 경고창이 뜨게 됩니다.

처음 만들었을때는 프로젝트-11에서 만들었던 txt색 변경등을 할 수 있도록 만들었지만 전시간에 했던것 이기때문에 빼놓고 했습니다. 좀더 좋은 작품이되려면 추가하시는 것도 좋을거라 생각합니다.

자세한 설명은 주석처리 위주로 해놨습니다.

300x250