② JAVA(자바) 프로젝트-12 숫자야구게임 구현하기(스윙이용) == Implementing Numerical Baseball Game(using swing)
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색 변경등을 할 수 있도록 만들었지만 전시간에 했던것 이기때문에 빼놓고 했습니다. 좀더 좋은 작품이되려면 추가하시는 것도 좋을거라 생각합니다.
자세한 설명은 주석처리 위주로 해놨습니다.