|
단어게임 소스거든요
에러없이 실행은 되는데요
실행창에서 스타트 버튼 누르면 게임이 시작되야 하거든요
게임 시작되도 스펠링 누르는게 안먹히구요
게임진행이 안되네요ㅠㅠ
도와주세요~~!!
여기에 몇날몇일을 매달려 있어도 안되요ㅠㅠ
살려주세요!!!
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import javax.swing.*;
class SW extends JFrame implements ActionListener {
String ranWord[] = { "acrimonious", "allegiance", "ameliorate",
"annihilate", "antiseptic", "articulate", "authoritative",
"benefactor", "boisterous", "breakthrough", "carcinogenic",
"censorious", "chivalrous", "collarbone", "commendable",
"compendium", "comprehensive", "conclusive", "conscientious",
"considerate", "deferential", "denouement", "determinate",
"diffidence", "disruption", "earthenware", "elliptical",
"entanglement", "escutcheon", "extinguish", "extradition",
"fastidious", "flamboyant", "forethought", "forthright",
"gregarious", "handmaiden", "honeysuckle", "hypocritical",
"illustrious", "infallible", "lumberjack", "mischievous",
"mollycoddle", "nimbleness", "nonplussed", "obliterate",
"obsequious", "obstreperous", "opalescent", "ostensible",
"pandemonium", "paraphernalia", "pawnbroker", "pedestrian",
"peremptory", "perfunctory", "pernicious", "perpetrate",
"personable", "pickpocket", "poltergeist", "precipitous",
"predicament", "preposterous", "presumptuous", "prevaricate",
"propensity", "provisional", "pugnacious", "ramshackle",
"rattlesnake", "reciprocate", "recrimination", "redoubtable",
"relinquish", "remonstrate", "repository", "reprehensible",
"resolution", "resplendent", "restitution", "retaliation",
"retribution", "saccharine", "salubrious", "skulduggery",
"skyscraper", "soothsayer", "tearjerker", "transcribe",
"turpentine", "unassuming", "underscore", "undertaker",
"underwrite", "unobtrusive", "vernacular", "waterfront",
"watertight" };
Font font;
JPanel p_word, p_alpb, p_ctrl; //위, 중간, 아래 패널
GridBagLayout gbltop, gblbottom; //위, 아래
GridBagConstraints gbctop, gbcbottom; //위, 아래
JTextField t_xcnt, t_ocnt, t_percent, t_score, t_word, t_tried, t_msg,
t_lchance; //위 Jtextfield
int i_xcnt, i_ocnt, i_score, i_lchance; //위패널에 필요한 변수
double d_percent; //백분율
String s_percent; //백분율
JButton[] b_alpb; //알파벳버튼
char[] c_alpb; //알파벳문자
JTextField t_nowlevel ; //아래패널의 Jtextfield
JTextField t_negaans; //아래패널의 Jtextfield , 정답힌트 거꾸로 보여줄 곳
JButton b_start, b_level, b_reset, b_hint; //아래패널의 버튼
String answer; //정답을 저장할 문자열
String negastr; //정답을 거꾸로 저장할 문자열
Random r1, r2;
double rannum; //ranWord 배열의 첨자중 하나
int rannumint;
boolean running, flag;
int failnum;
char[] alpha; //정답에 있는 알파벳 저장할 공간
int alpha_index;
char[] bravo; //클릭한 알파벳 저장할 공간
int bravo_index;
int l_click, level;
NumberFormat fmt;
JButton preb = new JButton();
JButton b = new JButton();
public SW() {
super("Word Game");
init();
}
public void init() {
font = new Font("Courier", Font.BOLD, 25);
p_word = new JPanel();
p_alpb = new JPanel();
p_ctrl = new JPanel();
gbltop = new GridBagLayout();
gblbottom = new GridBagLayout();
gbctop = new GridBagConstraints();
gbctop.fill = GridBagConstraints.BOTH;
gbctop.weightx = 1.0;
gbctop.weighty = 1.0;
gbcbottom = new GridBagConstraints();
gbcbottom.fill = GridBagConstraints.BOTH;
gbcbottom.weightx = 1.0;
gbcbottom.weighty = 1.0;
t_xcnt = new JTextField();
t_ocnt = new JTextField();
t_percent = new JTextField();
t_word = new JTextField("-----Word Game-----");
t_word.setEditable(false);
t_word.setFont(font);
t_tried = new JTextField();
t_tried.setEditable(false);
t_tried.setFont(font);
t_msg = new JTextField();
t_msg.setEditable(false);
t_score = new JTextField();
t_lchance = new JTextField();
t_lchance.setBackground(Color.pink);
t_xcnt.setEditable(false);
t_ocnt.setEditable(false);
t_percent.setEditable(false);
t_score.setEditable(false);
t_lchance.setEditable(false);
i_xcnt = i_ocnt = i_score = 0;
d_percent = 0.;
b_start = new JButton("-Start-");
b_start.setBackground(Color.white);
b_level = new JButton("-level-");
b_level.setBackground(Color.white);
b_reset = new JButton("-reset-");
b_reset.setBackground(Color.white);
b_hint = new JButton("-hint on-");
b_hint.setBackground(Color.white);
running = false;
flag = false;
failnum = 0;
l_click = 2;
alpha = new char[30];
bravo = new char[30];
b_alpb = new JButton[26];
c_alpb = new char[26];
for (int i = 0; i < 26; i++)
c_alpb[i] = (char) ('A' + i); //c_alpb 문자배열에 A~Z저장
for (int i = 0; i < 26; i++) { //버튼 생성
b_alpb[i] = new JButton(String.valueOf(c_alpb[i]));
b_alpb[i].setBackground(Color.white);
}
t_nowlevel = new JTextField();
t_nowlevel.setEditable(false);
t_negaans = new JTextField();
t_negaans.setEditable(false);
negastr = new String("");
r1 = new Random();
r2 = new Random();
fmt = NumberFormat.getInstance();
fmt.setMinimumFractionDigits(3);
setup();
}
public void setup() {
p_word.setLayout(gbltop); //위 패널
w_add(new JLabel("틀린개수 : ", JLabel.CENTER), 0, 0, 1, 1);
w_add(t_xcnt, 1, 0, 1, 1);
w_add(new JLabel("맞은개수 : ", JLabel.CENTER), 2, 0, 1, 1);
w_add(t_ocnt, 3, 0, 1, 1);
w_add(new JLabel("백분율 : ", JLabel.CENTER), 4, 0, 1, 1);
w_add(t_percent, 5, 0, 1, 1);
w_add(new JLabel("스코어 : ", JLabel.CENTER), 6, 0, 1, 1);
w_add(t_score, 7, 0, 1, 1);
w_add(t_word, 0, 1, 8, 1);
w_add(t_tried, 0, 2, 8, 1);
w_add(new JLabel("message : ", JLabel.CENTER), 0, 3, 1, 1);
w_add(t_msg, 1, 3, 5, 1);
w_add(new JLabel("남은기회 : ", JLabel.CENTER), 6, 3, 1, 1);
w_add(t_lchance, 7, 3, 1, 1);
p_alpb.setLayout(new GridLayout(3, 10, 5, 5)); //중간 알파벳 패널
for (int i = 0; i < 26; i++)
p_alpb.add(b_alpb[i]);
p_ctrl.setLayout(gblbottom); //아래 패널
c_add(b_start, 0, 0, 2, 1);
c_add(b_level, 2, 0, 1, 1);
c_add(b_reset, 3, 0, 1, 1);
c_add(new JLabel("현재레벨 : ", JLabel.CENTER), 0, 1, 1, 1);
c_add(t_nowlevel, 1, 1, 1, 1);
c_add(b_hint, 2, 1, 1, 1);
c_add(t_negaans, 3, 1, 1, 1);
getContentPane().setLayout(new GridLayout(3, 1)); //패널삽입
getContentPane().add(p_word);
getContentPane().add(p_alpb);
getContentPane().add(p_ctrl);
addWindowListener( //종료리스너 등록
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
for (int i = 0; i < 26; i++) { //버튼들 등록
String str = String.valueOf(c_alpb[i]);
b_alpb[i].setActionCommand(str);
b_alpb[i].addActionListener(this);
}
b_start.addActionListener(this);
b_level.addActionListener(this);
b_reset.addActionListener(this);
b_hint.addActionListener(this);
level = 10; //레벌초기화
t_nowlevel.setText("꼬봉, 10번의 기회가 있습니다.");
allInit(); //전체 텍스트필드 초기화 함수호촐
setSize(550, 370); //윈도우 사이즈 설정
setResizable(false); //사이즈변경 불가능하게 설정
setVisible(true);
p_ctrl.requestFocus();
}
private void w_add(JComponent c, int x, int y, int w, int h) { //위 패널의 등록
// 메소드
gbctop.gridx = x;
gbctop.gridy = y;
gbctop.gridwidth = w;
gbctop.gridheight = h;
gbltop.setConstraints(c, gbctop);
p_word.add(c);
}
private void c_add(JComponent c, int x, int y, int w, int h) { //아래 패널의 등록 메소드
gbcbottom.gridx = x;
gbcbottom.gridy = y;
gbcbottom.gridwidth = w;
gbcbottom.gridheight = h;
gblbottom.setConstraints(c, gbcbottom);
p_ctrl.add(c);
}
public void allInit() { // 초기화 함수
running = false;
i_xcnt = i_ocnt = i_score = failnum = 0;
resetPercent();
t_xcnt.setText(String.valueOf(i_xcnt));
t_ocnt.setText(String.valueOf(i_ocnt));
t_score.setText(String.valueOf(i_score));
t_lchance.setText("");
t_word.setText("");
t_tried.setText("");
t_negaans.setText("");
t_msg.setText("새로운 게임이 시작. 레벨을 조정하고 start를 클릭하세요.");
}
public void resetPercent() {
if (i_ocnt == 0 && i_xcnt == 0)
t_percent.setText("0.000 %");
else {
d_percent = (double) i_ocnt / ((double) i_ocnt + (double) i_xcnt)
* 100.;
s_percent = String.valueOf(fmt.format(d_percent)) + " %";
t_percent.setText(s_percent);
}
}
public void setText() {
String choice = new String(" ");
boolean blank = false;
for (int i = 0; i < answer.length(); i++) {
flag = false;
//정답문자열중 하나씩과 alpha 문자배열에 같은 것이 있나 비교 있으면 flag = true
for (int j = 0; j <= alpha_index; j++)
if (answer.charAt(i) == alpha[j])
flag = true;
if (flag) { //같은 문자가 있으면 현재문자와 공백을 choice에 추가
choice += answer.charAt(i) + " ";
} else { //없으면 _ 와 공백 추가, 끝나지 않았음을 blank에 표시(true)
choice += "_ ";
blank = true;
}
}
t_word.setText(choice); //choice를 출력
if (!blank) { //정답을 모두 맞췄을 경우, blank = false일 경우
t_tried.setText(" --- 맞췄습니다. 당신은 멋쟁이! --- ");
t_msg.setText("레벨을 조정하고 start를 클릭하세요.");
t_ocnt.setText(String.valueOf(++i_ocnt)); //맞은개수증가
t_score.setText(String.valueOf(++i_score)); //스코어증가
resetPercent(); //퍼센트표시
failnum = 0;
running = false;
}
}
public void actionPerformed(ActionEvent e) {
preb.setBackground(Color.white); //전에 클릭한 버튼 흰색으로 변경
preb = b = (JButton) e.getSource(); //현재 클릭한 버튼 b에 저장,preb에 저장
String JLabel = b.getText(); //버튼의 레이블을 label에 저장
String lowerCase = JLabel.toLowerCase(); //소문자로 변경
char ch = lowerCase.charAt(0); //첫번째 문자 ch에 저장
b.setBackground(Color.yellow); //현재 버튼 노란색으로 변경
if (ch >= 'a' && ch <= 'z') {
if (!running)
t_msg.setText("게임을 하려면 레벨을 조정하고 start를 클릭하세요.");
else { //게임중이면
flag = false;
for (int i = 0; i <= bravo_index; i++) { //전에 클릭했는지의 여부 체크
if (bravo[i] == ch) {
flag = true;
break;
}
}
if (!flag) { //전에 클릭하지 않았을 경우, flag = false
t_tried.setText(t_tried.getText() + ch + " "); //무조건 tried에 추가해서 출력
bravo[++bravo_index] = ch; //무조건 bravo에 삽입
System.err.println("failnum before ="+failnum);
for (int i = 0; i < answer.length(); i++) {
//정답에 있는 알파벳인지 체크
if (flag) //정답에 있는 알파벳일 경우 저장
alpha[++alpha_index] = ch;
else //정답에 있지 않은 알파벳일 경우
failnum++;
}
System.err.println("failnum after ="+failnum);
//남은 기회 표시
t_lchance.setText(String.valueOf(level - failnum));
t_msg.setText(" " + ch + "가(이) 선택되었습니다."); //선택된 알파벳 표시
if (failnum == level) { //기회를 다 써버린 경우
t_word.setText("정 답 : " + answer);
t_tried.setText("당신은 졌습니다. 다시하세요.");
t_msg.setText("레벨을 조정하고 start를 클릭하세요.");
t_xcnt.setText(String.valueOf(++i_xcnt)); //틀린개수 증가
t_score.setText(String.valueOf(--i_score)); //스코어 감소
resetPercent(); //백분율 표시
failnum = 0;
running = false;
} else
setText(); //맞춘경우
} else { //전에 클릭한 경우
t_msg.setText("알파벳 " + ch + "은(는) 이미 선택되었습니다.");
} //전에 클릭하지 않은경우 end..
} //running = true end..
} //a~z클릭 end..
if (JLabel == "-Start-") {
if (!running) {
running = true;
t_word.setText("");
t_tried.setText("");
rannum = r1.nextFloat() * 10000 % 100; //100은 단어의 개수
answer = ranWord[(int) rannum]; //배열안에 있는 랜덤 문자열 선택
//랜덤하게 하나 힌트주기
rannumint = Math.abs(r2.nextInt() % (answer.length() - 1)); //Math.abs(숫자)= 절대값반환
bravo[0] = alpha[0] = answer.charAt(rannumint);
bravo_index = alpha_index = 0;
/*
//앞의 하나의 문자만 힌트주기
bravo[0] = alpha[0] = answer.charAt(0);
bravo_index = alpha_index = 0;
//앞과 뒤 문자 힌트로 주기
bravo[0] = alpha[0] = answer.charAt(0);
bravo[1] = alpha[1] = answer.charAt(answer.length()-1);
bravo_index = alpha_index = 1;
*/
setText();
//힌트생성, negastr에 정답 거꾸로 저장
negastr = "";
for (int i = answer.length() - 1; i >= 0; i--)
negastr += answer.charAt(i);
t_xcnt.setText(String.valueOf(i_xcnt));
t_ocnt.setText(String.valueOf(i_ocnt));
t_score.setText(String.valueOf(i_score));
resetPercent();
//남은 기회 표시
t_lchance.setText(String.valueOf(level - failnum));
t_msg.setText("새로운 단어가 선택되었습니다.");
} else {
t_msg.setText("현재 게임중...게임을 마치고 누르세요.");
}
} else if (JLabel == "-level-") {
l_click++;
if (!running) {
if (l_click % 3 == 0) {
level = 6;
t_nowlevel.setText("대장, 6번의 기회가 있습니다.");
} else if (l_click % 3 == 1) {
level = 8;
t_nowlevel.setText("민간인, 8번의 기회가 있습니다.");
} else {
level = 10;
t_nowlevel.setText("꼬봉, 10번의 기회가 있습니다.");
}
} else {
t_msg.setText("현재 게임중...level을 바꿀 수 없습니다.");
}
if (l_click == 5) l_click = 2;
} else if ( JLabel == "-reset-") {
allInit();
} else if (JLabel == "-hint on-") {
if (!running)
t_msg.setText("게임중이 아닙니다.");
else {
t_negaans.setText(negastr);
b_hint.setText("-hint off-");
}
} else if (JLabel == "-hint off-") {
if (!running)
t_msg.setText("게임중이 아닙니다.");
else {
t_negaans.setText("");
b_hint.setText("-hint on-");
}
}
}
public static void main(String args[]) {
SW c = new SW();
}
}
첫댓글 길어서 보지는 못했어요.버튼 누르면 실행되야 하는 메소드에 System.out.println();을 추가하고 원하는 메소드가 호출 되는지 확인 하시고요, 만약 안 불린다면 public void action~~()여기서 그 메소드를 제대로 불렀는지 확인하세요.^^