728x90
반응형
지난 시간
지난번엔 간단한 코딩으로 숫자 야구 게임을 만들었다.
이번엔 지난번 코드를 더 발전 시켜서 GUI를 적용시키고 프로그램으로 만든다.
숫자 야구 게임 만들기
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
먼저 자바 GUI를 사용하기 위한 라이브러리들을 임포트해준다.
public class NumberBallGame extends JPanel implements ActionListener, ChangeListener
클래스를 만들고 JPanel을 상속해준다.
JTabbedPane pane; // JTabbedPane 초기화
Button button1 = new Button("입력");
TextField keyb = new TextField(10);
TextArea txtStatus = new TextArea(15,55); // 게임 진행 및 결과를 표시할 TextArea 생성
int[] CN = new int[4];
int[] PN = new int[4];
int num = 35, count = 0, mynum = 0, gamecount = 1; // 입력받을 숫자 및 인덱스 변수 생성
String PNum;
boolean flag = false;
나중에 필요한 변수들을 선언해준다.
입력 버튼, 입력 받을 텍스트 필드, 등 객체도 만들어준다.
public NumberBallGame(){
// NumberBallGame 생성자
JPanel panel;
pane = new JTabbedPane(); // 탭 생성
setLayout(new BorderLayout());
String helpMessage ="\n\t랜덤으로 0~9까지의 숫자 중 중복되지 않는 4자리 숫자를 정하고
\n\t그 숫자가 무엇인지 찾는 게임이다.
\n\n\t플레이어가 임의의 4자리 숫자를 선택하면 랜덤숫자와 비교하여
\n\t숫자와 자리가 같다면 strike 숫자면 같다면 ball
\n\t둘다 같지 않다면 out이 나온다. ";
computer(); // 게임 시작시 임의의 수 생성
//게임 플레이 공간
panel = new JPanel();
panel.add(new Label("숫자 입력 :"));
panel.add(keyb);
keyb.addActionListener(this);
panel.add(button1);
button1.addActionListener(this); // 버튼을 눌렀을 때 실행할 ActionListner 연결
panel.add(txtStatus);
pane.addTab("게임",panel);
//도움말 공간
panel = new JPanel();
TextArea help= new TextArea(helpMessage,15,55); // 도움말 TextArea 출력
panel.add(new Label("도움말:"));
panel.add(help);
pane.addTab("도움말",panel);
pane.setSelectedIndex(0);
pane.addChangeListener(this);
add(pane,"Center");
}
숫자 야구 게임의 기본 게임 GUI틀을 만들어주는 생성자 함수이다.
탭을 나누고 도움말 창과 게임 플레이 창을 분리했다.
// 윈도우 사이즈
public Dimension getPreferredSize(){
return new Dimension(500, 350);
}
// 탭이 전환될 때 효과
public void stateChanged(ChangeEvent e){
int curSelIndex = pane.getSelectedIndex();
String curPaneTitle = pane.getTitleAt(curSelIndex);
System.out.println("["+curPaneTitle + "]탭이 선택되었습니다");
}
//액션 추가
public void actionPerformed(ActionEvent e) {
player();
if(!flag) compare();
}
// 프래임 보여주기
private static void extracted(JFrame frame) {
frame.show();
//frame.show();
}
기타 효과들을 적용해준다.
static boolean isNumber(String str) {
boolean result = true;
for (int i = 0; i < str.length(); i++) {
int c = str.charAt(i);
// 숫자가 아니라면
if (c < 48 || c > 57) {
result = false;
break;
}
}
return result;
}
입력된 것이 숫자인지 아닌지 구분해야 하기에 숫자를 판별하는 함수도 넣어준다.
public void computer(){
Random r = new Random();
do {
for (int i = 0; i < 4; i++) {
CN[i] = r.nextInt(10);
for (int j = 0; j < i; j++) {
if (CN[i] == CN[j]) {
i--;
}
}
}
}while (CN[0] == 0);
num = 1000 * CN[0] + 100 * CN[1] + 10 * CN[2] + CN[3];
System.out.println("생성된 임의의 수:"+num);
gamecount = 1; // 게임 카운터 초기화
txtStatus.setText("임의의 4자리 숫자가 생성되었습니다.\n중복되지 않는 4자리 숫자를 입력해주세요.\n");
}
public void player() {
PNum = keyb.getText();
if(PNum == null || PNum.isEmpty()) {
flag = true;
} else {
if (!isNumber(PNum)) {
txtStatus.setText(txtStatus.getText() + "<입력하신 " + PNum + "은(는) 옳바른 입력 값이 아닙니다.>\n");
flag = true;
} else {
if (PNum.length() == 4) {
mynum = Integer.parseInt(PNum);
flag = false;
} else {
txtStatus.setText(txtStatus.getText() + "<입력하신 " + PNum + "은(는) 옳바른 입력 값이 아닙니다.>\n");
flag = true;
}
}
keyb.setText(""); // 숫자 입력 후 입력 필드를 초기화 합니다.
}
}
public void compare(){
PN[0] = mynum / 1000;
PN[1] = (mynum % 1000) / 100;
PN[2] = (mynum % 1000 % 100) / 10;
PN[3] = mynum % 1000 % 100 % 10;
int[] c = new int[2];
int correctN = 0;
int result = 0;
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 3; j++) {
if (CN[i] == PN[j]) {
correctN++;
}
}
}
System.out.println("맞는 숫자 개수" + correctN);
c[0] = correctN;
for (int i = 0; i <= 3; i++) {
if (CN[i] == PN[i]) {
result++;
}
}
System.out.println("스트라이크 개수" + result);
c[1] = result;
int strike = c[1];
int ball = c[0] - c[1];
int out = 4 - ball - strike;
int sum = strike + ball + out;
System.out.println("strike " + strike + ", ball " + ball + ", out" + out);
if(sum == 4) {
if (strike == 4) {
txtStatus.setText(txtStatus.getText() + "\n★★★★★정답★★★★★\n");
txtStatus.setText(txtStatus.getText() + "게임이 끝났습니다\n"+ "[ " + gamecount + " 번] 만에 정답을 맟추셨습니다!\n");
txtStatus.setText(txtStatus.getText() + "정답은 " + num + " 입니다.<정답을 다시 입력하면 게임을 다시 시작합니다>\n");
count++;
} else {
txtStatus.setText(txtStatus.getText() + "\n입력하신 " + mynum + " 은\n");
txtStatus.setText(txtStatus.getText() + "Strike " + strike + "개 " + "Ball " + ball + "개 " + "Out " + out + "개 \n");
gamecount++;
}
}
if(count == 2){
computer();//다시 새로운 숫자 생성
count = 0;
}
}
마지막으로 지난 시간에 만들었던 코드들을 GUI에 맞게 변형한다.
public static void main(String[] s){
JFrame frame = new JFrame("숫자 야구 게임");
NumberBallGame panel = new NumberBallGame();
frame.setForeground(Color.black);
frame.setBackground(Color.lightGray);
frame.getContentPane().add(panel,"Center");
frame.setSize(panel.getPreferredSize());
extracted(frame);
frame.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
}
마지막으로 메인 함수를 구현해준다.
숫자 야구 게임 플레이
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class NumberBallGame extends JPanel implements ActionListener, ChangeListener {
JTabbedPane pane; // JTabbedPane 초기화
Button button1 = new Button("입력");
TextField keyb = new TextField(10);
TextArea txtStatus = new TextArea(15,30); // 게임 진행 및 결과를 표시할 TextArea 생성
int[] CN = new int[4];
int[] PN = new int[4];
int num = 35, count = 0, mynum = 0, gamecount = 1; // 입력받을 숫자 및 인덱스 변수 생성
String PNum;
boolean flag = false;
public NumberBallGame(){
// NumberBallGame 생성자
JPanel panel;
pane = new JTabbedPane(); // 탭 생성
setLayout(new BorderLayout());
String helpMessage ="\n\t랜덤으로 0~9까지의 숫자 중 중복되지 않는 4자리 숫자를 정하고\n\t그 숫자가 무엇인지 찾는 게임이다.\n\n\t플레이어가 임의의 4자리 숫자를 선택하면 랜덤숫자와 비교하여\n\t숫자와 자리가 같다면 strike 숫자면 같다면 ball \n\t둘다 같지 않다면 out이 나온다. ";
computer(); // 게임 시작시 임의의 수 생성
//게임 플레이 공간
panel = new JPanel();
panel.add(new Label("숫자 입력 :"));
panel.add(keyb);
keyb.addActionListener(this);
panel.add(button1);
button1.addActionListener(this); // 버튼을 눌렀을 때 실행할 ActionListner 연결
panel.add(txtStatus);
pane.addTab("게임",panel);
//도움말 공간
panel = new JPanel();
TextArea help= new TextArea(helpMessage,15,55); // 도움말 TextArea 출력
panel.add(new Label("도움말:"));
panel.add(help);
pane.addTab("도움말",panel);
pane.setSelectedIndex(0);
pane.addChangeListener(this);
add(pane,"Center");
}
static boolean isNumber(String str) {
boolean result = true;
for (int i = 0; i < str.length(); i++) {
int c = str.charAt(i);
// 숫자가 아니라면
if (c < 48 || c > 57) {
result = false;
break;
}
}
return result;
}
// 임의의 수 생성
public void computer(){
Random r = new Random();
do {
for (int i = 0; i < 4; i++) {
CN[i] = r.nextInt(10);
for (int j = 0; j < i; j++) {
if (CN[i] == CN[j]) {
i--;
}
}
}
}while (CN[0] == 0);
num = 1000 * CN[0] + 100 * CN[1] + 10 * CN[2] + CN[3];
System.out.println("생성된 임의의 수:"+num);
gamecount = 1; // 게임 카운터 초기화
txtStatus.setText("임의의 4자리 숫자가 생성되었습니다.\n중복되지 않는 4자리 숫자를 입력해주세요.\n");
}
// 숫자 입력받기
public void player() {
PNum = keyb.getText();
if(PNum == null || PNum.isEmpty()) {
flag = true;
} else {
if (!isNumber(PNum)) {
txtStatus.setText(txtStatus.getText() + "<입력하신 " + PNum + "은(는) 옳바른 입력 값이 아닙니다.>\n");
flag = true;
} else {
if (PNum.length() == 4) {
mynum = Integer.parseInt(PNum);
flag = false;
} else {
txtStatus.setText(txtStatus.getText() + "<입력하신 " + PNum + "은(는) 옳바른 입력 값이 아닙니다.>\n");
flag = true;
}
}
keyb.setText(""); // 숫자 입력 후 입력 필드를 초기화 합니다.
}
}
//게임 시작
public void compare(){
PN[0] = mynum / 1000;
PN[1] = (mynum % 1000) / 100;
PN[2] = (mynum % 1000 % 100) / 10;
PN[3] = mynum % 1000 % 100 % 10;
int[] c = new int[2];
int correctN = 0;
int result = 0;
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 3; j++) {
if (CN[i] == PN[j]) {
correctN++;
}
}
}
System.out.println("맞는 숫자 개수" + correctN);
c[0] = correctN;
for (int i = 0; i <= 3; i++) {
if (CN[i] == PN[i]) {
result++;
}
}
System.out.println("스트라이크 개수" + result);
c[1] = result;
int strike = c[1];
int ball = c[0] - c[1];
int out = 4 - ball - strike;
int sum = strike + ball + out;
System.out.println("strike " + strike + ", ball " + ball + ", out" + out);
if(sum == 4) {
if (strike == 4) {
txtStatus.setText(txtStatus.getText() + "\n★★★★★정답★★★★★\n");
txtStatus.setText(txtStatus.getText() + "게임이 끝났습니다\n"+ "[ " + gamecount + " 번] 만에 정답을 맟추셨습니다!\n");
txtStatus.setText(txtStatus.getText() + "정답은 " + num + " 입니다.<정답을 다시 입력하면 게임을 다시 시작합니다>\n");
count++;
} else {
txtStatus.setText(txtStatus.getText() + "\n입력하신 " + mynum + " 은\n");
txtStatus.setText(txtStatus.getText() + "Strike " + strike + "개 " + "Ball " + ball + "개 " + "Out " + out + "개 \n");
gamecount++;
}
}
if(count == 2){
computer();//다시 새로운 숫자 생성
count = 0;
}
}
// 윈도우 사이즈
public Dimension getPreferredSize(){
return new Dimension(500, 350);
}
// 탭이 전환될 때 효과
public void stateChanged(ChangeEvent e){
int curSelIndex = pane.getSelectedIndex();
String curPaneTitle = pane.getTitleAt(curSelIndex);
System.out.println("["+curPaneTitle + "]탭이 선택되었습니다");
}
//액션 추가
public void actionPerformed(ActionEvent e) {
player();
if(!flag) compare();
}
// 메인 함수
public static void main(String[] s){
JFrame frame = new JFrame("숫자 야구 게임");
NumberBallGame panel = new NumberBallGame();
frame.setForeground(Color.black);
frame.setBackground(Color.lightGray);
frame.getContentPane().add(panel,"Center");
frame.setSize(panel.getPreferredSize());
extracted(frame);
//원래 위의 문장은 frame.show(); 였음.
frame.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
}
private static void extracted(JFrame frame) {
frame.show();
//frame.show();
}
}
최종 코드이다.
잘 작동하는 것을 확인 할 수 있었다.
728x90
반응형
'숫자 야구 게임' 카테고리의 다른 글
숫자 야구 게임 제작기 1 (0) | 2024.03.07 |
---|