프로그래밍 TIP/JAVA [Java] 게임 - Up/Down 게임 여름나라겨울이야기 2008. 12. 21. 17:42 728x90 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import java.util.*; public class UpDown extends Frame implements ActionListener, WindowListener { private static final long serialVersionUID = 5449683821098884271L; private final int MAX_NUM = 5; // 최대 참가 가능 인원 private final int MIN_RANDOM = 1; // 예측 최저치 private final int MAX_RANDOM = 100; // 예측 최상치 private final int intCount[] = new int[MAX_NUM]; private JPanel panWest; private JPanel panCenter; private JButton btnStart; private JButton btnHelp; private JButton btnSetPlayer; private JButton btnSetMoney; private JButton btnStartGame; private JButton btnAnswer; private JButton btnNextPlayer; private JLabel lblNotice; private JLabel lblPlayerTurn; private final JTextField txtNames[] = new JTextField[MAX_NUM]; private final JTextField txtMoneys[] = new JTextField[MAX_NUM]; private JTextField txtNumber; private JTextField txtAnswer; private int intNumber; // 참여 인원수 최대 5명 private int intCurrent; // 현재 게임에 참가한 선수 private int intRandom; // 사용자가 맞추어야 할 답 public UpDown() { initialize(); } // 화면 초기 설정 private void initialize() { removeAll(); repaint(); setLayout(new BorderLayout()); setFont(new Font("Helvetica", Font.PLAIN, 14)); panWest = new JPanel(); panWest.setLayout(new GridLayout(2,1)); panCenter = new JPanel(); //panCenter.setBorder(new SoftBevelBorder(3)); panCenter.setBorder(new MatteBorder(10, 10, 10, 10, Color.ORANGE)); panWest.setBackground(Color.cyan); panCenter.setBackground(Color.white); add(panWest, "West"); add(panCenter, "Center"); btnStart = new JButton("게임시작"); btnHelp = new JButton("게임설명"); btnStart.addActionListener(this); btnHelp.addActionListener(this); panWest.add(btnStart); panWest.add(btnHelp); panCenter.add(new JLabel("좌측 메뉴를 선택하세요.")); addWindowListener(this); validate(); } // 도움말 보기 public void showHelp() { panCenter.removeAll(); panCenter.repaint(); panCenter.setLayout(new GridLayout(2,1)); final JTextArea tAreaHelp = new JTextArea(); tAreaHelp.setText("1.인원수를 입력하세요.\n\n"); tAreaHelp.setText(tAreaHelp.getText() + "2. 이름을 입력하세요.\n\n"); tAreaHelp.setText(tAreaHelp.getText() + "3. 금액을 입력하세요.\n\n"); tAreaHelp.setText(tAreaHelp.getText() + "4. 게임시작"); panCenter.add(tAreaHelp); panCenter.validate(); } // 새로운 게임의 시작 public void newGame() { intCurrent = 0; for(int i = 0; i < MAX_NUM; i++) { intCount[i] = 0; } setNumber(); } // 참가 인원수를 가져오기 위한 셋팅 public void setNumber(){ panCenter.removeAll(); panCenter.repaint(); panCenter.setLayout(new GridLayout(9,0)); final JLabel lblNumber = new JLabel("인원수를 입력하세요."); panCenter.add(lblNumber); txtNumber = new JTextField("", 25); panCenter.add(txtNumber); btnSetPlayer = new JButton("OK"); panCenter.add(btnSetPlayer); btnSetPlayer.addActionListener(this); panCenter.validate(); } // 참가인원만큼의 이름 가져오기 public void setPlayer(){ panCenter.removeAll(); panCenter.repaint(); try { intNumber = Integer.parseInt(txtNumber.getText()); if(intNumber > MAX_NUM) intNumber = MAX_NUM; } catch (final Exception ex) { intNumber = MAX_NUM; } panCenter.setLayout(new GridLayout(7, 0)); final JLabel lblHelp = new JLabel("참가인원 " + intNumber + "명의 이름을 입력하세요"); panCenter.add(lblHelp); for(int i = 0; i < intNumber; i++) { txtNames[i] = new JTextField(25); panCenter.add(txtNames[i]); } btnSetMoney = new JButton("OK"); panCenter.add(btnSetMoney); btnSetMoney.addActionListener(this); panCenter.validate(); } // 순위별 금액 정하기 public void setMoneys(){ panCenter.removeAll(); panCenter.repaint(); panCenter.setLayout(new GridLayout(7, 0)); final JLabel lblHelp = new JLabel("순위별 금액을 입력하세요"); panCenter.add(lblHelp); for(int i = 0; i < intNumber; i++) { txtMoneys[i] = new JTextField(25); panCenter.add(txtMoneys[i]); } btnStartGame = new JButton("OK"); panCenter.add(btnStartGame); btnStartGame.addActionListener(this); panCenter.validate(); } // 게임판 디자인 public void setPlayerBoard() { panCenter.removeAll(); panCenter.repaint(); panCenter.setLayout(new GridLayout(7, 0)); lblPlayerTurn = new JLabel(""); panCenter.add(lblPlayerTurn); JLabel lblHelp = new JLabel(MIN_RANDOM + " ~ " + MAX_RANDOM + " 사이의 예상 정수를 입력하세요"); panCenter.add(lblHelp); txtAnswer = new JTextField(25); panCenter.add(txtAnswer); btnAnswer = new JButton("OK"); panCenter.add(btnAnswer); lblNotice = new JLabel(""); panCenter.add(lblNotice); btnNextPlayer = new JButton("다음"); panCenter.add(btnNextPlayer); btnNextPlayer.setVisible(false); btnAnswer.addActionListener(this); btnNextPlayer.addActionListener(this); panCenter.validate(); } public void startPlayer(){ final Random r= new Random(); intRandom= r.nextInt(MAX_RANDOM) + MIN_RANDOM; // MIN_RANDOM ~ MAX_RANDOM 사이의 난수발생 lblPlayerTurn.setText("[" + txtNames[intCurrent].getText() + "] 님의 차례입니다."); txtAnswer.setText(""); btnAnswer.setVisible(true); lblNotice.setText(""); btnNextPlayer.setVisible(false); } // 사용자 입력 확인하기 private void checkAnswer() { try { intCount[intCurrent]++; final int intAnswer = Integer.parseInt(txtAnswer.getText()); // 사용자가 추측한 답 intRandom 과 비교 if (intRandom==intAnswer){ lblNotice.setText("축하! 축하!: " + intCount[intCurrent] + " 회만에 정답입니다!"); intCurrent++; if(intCurrent == intNumber) btnNextPlayer.setText("결과보기"); btnNextPlayer.setVisible(true); btnAnswer.setVisible(false); } else if (intRandom < intAnswer){ lblNotice.setText("회수: " + intCount[intCurrent] + " / 입력수: " + intAnswer + " 에서 DOWN"); } else if(intRandom > intAnswer){ lblNotice.setText("회수: " + intCount[intCurrent] + " / 입력수: "+ intAnswer + " 에서 UP"); } } catch (final Exception e) { lblNotice.setText("숫자만 입력하세요"); } } public void reportGame(){ panCenter.removeAll(); repaint(); int intTemp = 0; String strTemp = ""; for(int i = 0; i < intNumber - 1; i++) { for(int j = i; j < intNumber; j++){ if(intCount[i] > intCount[j]) { intTemp = intCount[i]; intCount[i] = intCount[j]; intCount[j] = intTemp; strTemp = txtNames[i].getText(); txtNames[i].setText(txtNames[j].getText()); txtNames[j].setText(strTemp); } } } JLabel lblHelp = new JLabel("*** 순위 보기 ***"); panCenter.add(lblHelp); for(int i = 0; i < intNumber; i++) { strTemp = ""; strTemp += (i + 1) + "등 "; strTemp += "성명: [" + txtNames[i].getText() + "] 님 / "; strTemp += "금액: " + txtMoneys[i].getText() + "원 / "; strTemp += "횟수: " + intCount[i]; lblHelp = new JLabel(strTemp); panCenter.add(lblHelp); } panCenter.validate(); } public void actionPerformed(final ActionEvent event){ final Object source = event.getSource(); if(source == btnHelp){ showHelp(); } else if(source == btnStart){ newGame(); } else if(source == btnSetPlayer){ setPlayer(); } else if(source == btnSetMoney){ setMoneys(); } else if(source == btnStartGame || source == btnNextPlayer){ if(intCurrent == 0) { setPlayerBoard(); startPlayer(); } if(intCurrent < intNumber) { startPlayer(); } else { reportGame(); } } else if (source == btnAnswer){ checkAnswer(); } } public static void main(final String args[]) { final UpDown frmUpDown = new UpDown(); frmUpDown.setTitle("UpDown"); frmUpDown.setSize(700, 300); //frmUpDown.pack(); frmUpDown.setVisible(true); } public void windowActivated(final WindowEvent e) { } public void windowClosed(final WindowEvent e) { } public void windowClosing(final WindowEvent e) { System.exit(0); } public void windowDeactivated(final WindowEvent e) { } public void windowDeiconified(final WindowEvent e) { } public void windowIconified(final WindowEvent e) { } public void windowOpened(final WindowEvent e) { } } 반응형