
I love JAVA! ♡
by element
|
|
import java.awt.*; import java.awt.event.*; import java.util.*; import java.text.*; import java.io.*; import javax.swing.*; import java.util.Random; class SW extends JFrame implements ActionListener { String ranWord[] = {"acrimonious",...,"watertight"}; //100개의 단어 Font font; JPanel Pword, Palpb, Pctrl; //위, 중간, 아래 패널 GridBagLayout gbltop,gblbottom; //위, 아래 GridBagConstraints gbctop,gbcbottom; //위, 아래 JTextField Txcnt, Tocnt, Tpercent, Tscore, Tword, Ttried, Tmsg, Tlchance; //위 textfield int Ixcnt, Iocnt, Iscore, Ilchance; //위패널에 필요한 변수 double Dpercent; //백분율 String Spercent; //백분율 JButton [] Balpb; //알파벳버튼 char [] Calpb; //알파벳문자 JTextField Tnowlevel; //아래패널의 textfield JTextField Tnegaans; //아래패널의 textfield , 정답힌트 거꾸로 보여줄 곳 JButton Bstart, Blevel, Breset, Bhint; //아래패널의 버튼 String answer; //정답을 저장할 문자열 String negastr; //정답을 거꾸로 저장할 문자열 Random r1,r2; double rannum; //ranWord 배열의 첨자중 하나 int rannumint; boolean running, flag; int failnum; char[] alpha; //정답에 있는 알파벳 저장할 공간 int alphaIndex; char[] bravo; //클릭한 알파벳 저장할 공간 int bravoIndex; int Lclick, level; NumberFormat fmt; JButton preb = new JButton(); JButton b = new JButton();
public SW(){ super("English & Game"); init(); } public void init(){ font = new Font("Courier", Font.BOLD, 25); Pword = new JPanel(); Palpb = new JPanel(); Pctrl = 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; Txcnt = new JTextField(); Tocnt = new JTextField(); Tpercent = new JTextField(); Tword = new JTextField("====English & Game===="); Tword.setEditable(false); Tword.setFont(font); Ttried = new JTextField(); Ttried.setEditable(false); Ttried.setFont(font); Tmsg = new JTextField(); Tmsg.setEditable(false); Tscore = new JTextField(); Tlchance = new JTextField(); Tlchance.setBackground(Color.yellow); Txcnt.setEditable(false); Tocnt.setEditable(false); Tpercent.setEditable(false); Tscore.setEditable(false); Tlchance.setEditable(false); Ixcnt = Iocnt = Iscore =0; Dpercent = 0.; Bstart = new JButton("| Start |"); Bstart.setBackground(Color.white); Blevel = new JButton("| level |"); Blevel.setBackground(Color.white); Breset = new JButton("| reset |"); Breset.setBackground(Color.white); Bhint = new JButton("| hint on |"); Bhint.setBackground(Color.white); running = false; flag = false; failnum = 0; Lclick = 2; alpha = new char[30]; bravo = new char[30]; Balpb = new JButton[26]; Calpb = new char[26]; for(int i=0;i<26;i++) Calpb[i] = (char)('A'+i); //Calpb 문자배열에 A~Z저장 for ( int i=0 ; i<26 ; i++){ //버튼 생성 Balpb[i] = new JButton(String.valueOf(Calpb[i])); Balpb[i].setBackground(Color.white); } Tnowlevel = new JTextField(); Tnowlevel.setEditable(false); Tnegaans = new JTextField(); Tnegaans.setEditable(false); negastr = new String(""); r1 = new Random(); r2 = new Random(); fmt = NumberFormat.getInstance(); fmt.setMinimumFractionDigits(3); setup(); } public void setup(){ Pword.setLayout(gbltop); //위 패널 Wadd(new Label("틀린개수 : ",Label.CENTER),0,3,1,1); Wadd(Txcnt,1,3,1,1); Wadd(new Label("맞은개수 : ",Label.CENTER),2,3,1,1); Wadd(Tocnt,3,3,1,1); Wadd(new Label("백분율 : ",Label.CENTER),4,3,1,1); Wadd(Tpercent,5,3,1,1); Wadd(new Label("스코어 : ",Label.CENTER),6,3,1,1); Wadd(Tscore,7,3,1,1); Wadd(Tword,0,1,8,1); Wadd(Ttried,0,2,8,1); Wadd(new Label("message : ",Label.CENTER),0,0,1,1); Wadd(Tmsg,1,0,5,1); Wadd(new Label("남은기회 : ",Label.CENTER),6,0,1,1); Wadd(Tlchance,7,0,1,1); Palpb.setLayout( new GridLayout(3,10,5,5)); //중간 알파벳 패널 for (int i=0; i<26 ; i++ ) Palpb.add(Balpb[i]); Pctrl.setLayout(gblbottom); //아래 패널 Cadd(Bstart,0,0,2,1); Cadd(Blevel,2,0,1,1); Cadd(Breset,3,0,1,1); Cadd(new Label("현재레벨 : ",Label.CENTER),0,1,1,1); Cadd(Tnowlevel,1,1,1,1); Cadd(Bhint,2,1,1,1); Cadd(Tnegaans,3,1,1,1); setLayout( new GridLayout(3,1)); //패널삽입 add(Pword); add(Palpb); add(Pctrl); addWindowListener( //종료리스너 등록 new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); for (int i=0 ; i<26 ; i++){ //버튼들 등록 String str = String.valueOf(Calpb[i]); Balpb[i].setActionCommand(str); Balpb[i].addActionListener(this); } Bstart.addActionListener(this); Blevel.addActionListener(this); Breset.addActionListener(this); Bhint.addActionListener(this); level = 10; //레벌초기화 Tnowlevel.setText("하수, 10번의 기회 제공."); allInit(); //전체 텍스트필드 초기화 함수호출 setSize(550,370); //윈도우 사이즈 설정 setResizable(false); //사이즈변경 불가능하게 설정 setVisible(true); Pctrl.requestFocus(); } private void Wadd(Component 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); Pword.add(c); } private void Cadd(Component 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); Pctrl.add(c); } public void allInit(){ // 초기화 함수 running = false; Ixcnt = Iocnt = Iscore = failnum = 0; resetPercent(); Txcnt.setText(String.valueOf(Ixcnt)); Tocnt.setText(String.valueOf(Iocnt)); Tscore.setText(String.valueOf(Iscore)); Tlchance.setText(""); Tword.setText(""); Ttried.setText(""); Tnegaans.setText(""); Tmsg.setText("New Game! 레벨을 조정하고 start를 클릭!"); } public void resetPercent(){ if(Iocnt == 0 && Ixcnt == 0) Tpercent.setText("0.000 %"); else{ Dpercent = (double)Iocnt / ((double)Iocnt + (double)Ixcnt) * 100.; Spercent = String.valueOf(fmt.format(Dpercent)) + " %"; Tpercent.setText(Spercent); } } 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<=alphaIndex; j++) if(answer.charAt(i) == alpha[j]) flag = true; if(flag){ //같은 문자가 있으면 현재문자와 공백을 choice에 추가 choice += answer.charAt(i) + " "; }else{ //없으면 _ 와 공백 추가, 끝나지 않았음을 blank에 표시(true) choice += "_ "; blank = true; } } Tword.setText(choice); //choice를 출력 if(!blank){ //정답을 모두 맞췄을 경우, blank = false일 경우 Ttried.setText(" +++ 축하합니다. 이겼습니다 ! +++ "); Tmsg.setText("레벨을 조정하고 start를 클릭하세요."); Tocnt.setText(String.valueOf(++Iocnt)); //맞은개수증가 Tscore.setText(String.valueOf(++Iscore)); //스코어증가 resetPercent(); //퍼센트표시 failnum = 0; running = false; } } public void actionPerformed(ActionEvent e){ preb.setBackground(Color.white); //전에 클릭한 버튼 흰색으로 변경 preb = b = (JButton)e.getSource(); //현재 클릭한 버튼 b에 저장,preb에 저장 String label = b.getText(); //버튼의 레이블을 label에 저장 String lowerCase = label.toLowerCase(); //소문자로 변경 char ch = lowerCase.charAt(0); //첫번째 문자 ch에 저장 b.setBackground(Color.green); //현재 버튼 녹색으로 변경 if(ch>='a' && ch<='z'){ if(!running) Tmsg.setText("게임을 하려면 레벨 조정 한 후 start를 클릭!"); else{ //게임중이면 flag = false; for(int i = 0; i<=bravoIndex; i++){ //전에 클릭했는지의 여부 체크 if(bravo[i] == ch){ flag = true; break; } } if(!flag){ //전에 클릭하지 않았을 경우, flag = false Ttried.setText(Ttried.getText() + ch + " "); //무조건 tried에 추가해서 출력 bravo[++bravoIndex] = ch; //무조건 bravo에 삽입 for(int i = 0; i<answer.length(); i++) //정답에 있는 알파벳인지 체크 if(answer.charAt(i) == ch) flag = true; if(flag) //정답에 있는 알파벳일 경우 저장 alpha[++alphaIndex] = ch; else //정답에 있지 않은 알파벳일 경우 failnum++; //남은 기회 표시 Tlchance.setText(String.valueOf(level - failnum)); Tmsg.setText(" " + ch + "가(이) 선택되었습니다."); //선택된 알파벳 표시 if(failnum == level){ //기회를 다 써버린 경우 Tword.setText("정 답 : " + answer); Ttried.setText("당신은 졌어요. 공부 좀 하세요."); Tmsg.setText("레벨을 조정하고 start를 클릭!"); Txcnt.setText(String.valueOf(++Ixcnt)); //틀린개수 증가 Tscore.setText(String.valueOf(--Iscore)); //스코어 감소 resetPercent(); //백분율 표시 failnum = 0; running = false; }else setText(); //맞춘경우 }else{ //전에 클릭한 경우 Tmsg.setText("알파벳 "+ch+"은(는) 이미 선택되었습니다."); } //전에 클릭하지 않은경우 end.. } //running = true end.. } //a~z클릭 end.. if ( label=="| Start |" ){ if(!running){ running = true; Tword.setText(""); Ttried.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); bravoIndex = alphaIndex = 0; setText(); //힌트생성, negastr에 정답 거꾸로 저장 negastr = ""; for(int i=answer.length()-1;i>=0;i--) negastr += answer.charAt(i); Txcnt.setText(String.valueOf(Ixcnt)); Tocnt.setText(String.valueOf(Iocnt)); Tscore.setText(String.valueOf(Iscore)); resetPercent(); //남은 기회 표시 Tlchance.setText(String.valueOf(level - failnum)); Tmsg.setText("새로운 단어가 선택되었네요^^"); }else{ Tmsg.setText("현재 게임중~~ 게임을 마무리하고 눌러요!^^;"); } }else if( label == "| level |" ){ Lclick++; if(!running){ if(Lclick%3 == 0){ level = 6; Tnowlevel.setText("고수, 6번의 기회 제공."); }else if(Lclick%3 == 1){ level = 8; Tnowlevel.setText("중수, 8번의 기회 제공."); }else{ level = 10; Tnowlevel.setText("하수, 10번의 기회 제공."); } }else{ Tmsg.setText("현재 게임중~~ level을 바꿀 수 없어요 ^^;"); } if(Lclick == 5) Lclick = 2; }else if ( label == "| reset |" ){ allInit(); }else if ( label == "| hint on |"){ if(!running) Tmsg.setText("게임중이 아니 올시다."); else{ Tnegaans.setText(negastr); Bhint.setText("| hint off |"); } }else if ( label == "| hint off |"){ if(!running) Tmsg.setText("게임중이 아니 올시다."); else{ Tnegaans.setText(""); Bhint.setText("| hint on |"); } } } public static void main(String args[]){ SW c = new SW(); } }
▪ 프로젝트 명 자바를 이용한 English & Game ▪ 구성 및 기능 * public void init() - 폰트 설정 - 각각의 Panel 생성 - 버튼 생성 * public void setup() - Pword.setLayout => 상단 패널 - Palpb.setLayout => 중간 알파벳 패널 - Pctrl.setLayout => 아래 패널 * public void allInit() - 초기화 함수 설정 * public void actionPerformed(ActionEvent e) - 랜덤 문자열 선택 게임 시작 - 힌트 생성 - 남은 기회 표시
완성된 인터페이스 ! 위 패널의 순서를 조금 변화를 줬어요.
Pword.setLayout(gbltop); //위 패널 Wadd(new Label("틀린개수 : ",Label.CENTER),0,3,1,1); Wadd(Txcnt,1,3,1,1); Wadd(new Label("맞은개수 : ",Label.CENTER),2,3,1,1); Wadd(Tocnt,3,3,1,1); Wadd(new Label("백분율 : ",Label.CENTER),4,3,1,1); Wadd(Tpercent,5,3,1,1); Wadd(new Label("스코어 : ",Label.CENTER),6,3,1,1); Wadd(Tscore,7,3,1,1); Wadd(Tword,0,1,8,1); Wadd(Ttried,0,2,8,1); Wadd(new Label("message : ",Label.CENTER),0,0,1,1); Wadd(Tmsg,1,0,5,1); Wadd(new Label("남은기회 : ",Label.CENTER),6,0,1,1); Wadd(Tlchance,7,0,1,1);
palpb.setLayout( new GridLayout(30,100,50,50)); //중간 알파벳 패널
for (int i=0; i<26 ; i++ ) palpb.add(balpb[i]); pctrl.setLayout(gblbottom); //아래 패널 cadd(bstart,0,0,2,1); cadd(blevel,2,0,1,1); cadd(breset,3,0,1,1); cadd(new Label("현재레벨 : ",Label.CENTER),0,1,1,1); cadd(tnowlevel,1,1,1,1); cadd(bhint,2,1,1,1); cadd(tnegaans,3,1,1,1); pword.setLayout(gbltop); //위 패널 wadd(new Label("틀린개수 : ",Label.CENTER),0,0,1,1); wadd(txcnt,1,0,1,1); wadd(new Label("맞은개수 : ",Label.CENTER),2,0,1,1); wadd(tocnt,3,0,1,1); wadd(new Label("백분율 : ",Label.CENTER),4,0,1,1); wadd(tpercent,5,0,1,1); wadd(new Label("스코어 : ",Label.CENTER),6,0,1,1); wadd(tscore,7,0,1,1); wadd(tword,0,1,8,1); wadd(ttried,0,2,8,1); wadd(new Label("message : ",Label.CENTER),0,3,1,1); wadd(tmsg,1,3,5,1); wadd(new Label("남은기회 : ",Label.CENTER),6,3,1,1); wadd(tlchance,7,3,1,1); setLayout( new GridLayout(3,1)); //패널삽입 add(pword);
|