JAVA 프로그래밍

문제

열쇠를 어디에 두었는지 찾는 게임입니다 이를 해결하는 다음 프로그램을 해석하세요 
 

알고리즘

 프로그램 시작 
   질문 구성 : 질문번호, 질문, 선택항목1, 선택항목2, 선택항목2 클릭시 다음 질문번호
   프레임에 여러 개의 질문 패널을 카드처럼 쌓아서 배치하고 실행 준비 완료
프레임의 X 버튼 누르면 프로그램 종료

질문 패널 클래스
   질문 패널 초기화
      질문 및 선택항목 제시 / 선택시 반응할 리스너 등록
      다음 질문으로 이동할 수 있도록 준비
   항목 선택시 다음 질문으로 이동

  카드 레이아웃

 

  클래스 다이어그램
 
  시퀀스 다이어그램

 
 

프로그램 코드

E001	// 이벤트 대기중
E002	// '시작' 선택
E003	// '문밖으로 나간다' 선택
E004	// '이전으로' 선택
E005	// '여기에서 찾아본다' 선택
E006	// '책상 위' 선택
E007	// '처음으로' 선택
 
	// 파일명 : ./Chapter13/FindKeyGameMain.java
	import java.awt.*;
	import javax.swing.*;
		 
	public class FindKeyGameMain
	{
		// 프로그램 시작  
1		public static void main(String args[]) {
			// 질문 구성 : 질문번호, 질문, 선택항목1, 선택항목2, 선택항목2 클릭시 다음 질문번호  
			String[][] questions = {
					{ "1", "열쇠를 찾아라!", "시작" },
					{ "2", "<html>약속이 있어서 나가야 하는데 차 키가 없다<br>열쇠는 어디에 있을까?<br> </html>", "문 밖으로 나간다", "여기서 찾아본다", "4" },
					{ "3", "<html>거실에 TV와 화분이 보인다<br>열쇠는 어디에 있을까?<br> </html>", "이전으로", "화분 주변", "6" },
					{ "4", "<html>서재에 책장과 책상이 보인다<br>열쇠는 어디에 있을까?<br> </html>", "책상 위", "책장 선반", "6" },
					{ "5", "열쇠 찾기 성공!", "처음으로" },
					{ "6", "열쇠 찾기 실패!", "처음으로" },
			};
			 
			// 프레임에 여러 개의 질문 패널을 카드처럼 쌓아서 배치하고 실행 준비 완료 
			final JFrame frame = new JFrame( "열쇠찾기" );
			final CardLayout cards = new CardLayout( 20, 20 );
			frame.setLayout( cards );
2			for( String[] question : questions )
3				frame.add( new QuestionPanel( frame.getContentPane(), cards, question ), question[0] );
			frame.setPreferredSize( new Dimension( 400,250 ) );
			frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
			frame.pack();
			frame.setVisible(true);
4		}
		// 프레임의 X 버튼 누르면 프로그램 종료 
	}
 
	// 파일명 : ./Chapter13/QuestionPanel.java
	import java.awt.*;
	import java.awt.event.*;
	import javax.swing.*;
	 
	// 질문 패널 클래스 
	public class QuestionPanel extends JPanel
	{
		private JRadioButton option1, option2;
		private String nextOption2;
		private Container frame;
		private CardLayout cards;
		 
		// 질문 패널 초기화 
Pb		public QuestionPanel( Container frame, CardLayout cards, String[] question ) {
			// 질문 및 선택항목 제시 / 선택시 반응할 리스너 등록 
			setLayout( new GridLayout( 3, 1 ) );
			JLabel label = new JLabel( question[1] );
			label.setFont( new Font( "굴림", Font.BOLD, 17 ) );
			add( label );
			 
			// 선택항목1 제시
			ClickListener click = new ClickListener();
			if( ( question.length > 2 ) && ( question[2] != null ) && !question[2].equals("") ) {
				option1 = new JRadioButton( question[2] );
				option1.setFont( new Font( "굴림", Font.BOLD, 17 ) );
				option1.addActionListener( click );
				add( option1 );
			}
			 
			// 선택항목2 제시
			if( ( question.length > 4 ) && ( question[3] != null ) && !question[3].equals("") ) {
				option2 = new JRadioButton( question[3] );
				option2.setFont( new Font( "굴림", Font.BOLD, 17 ) );
				option2.addActionListener( click );
				add( option2 );
				nextOption2 = question[4];
			}
			 
			// 다음 질문으로 이동할 수 있도록 준비 
			this.frame = frame;
			this.cards= cards;
Pe		}
		 
		// 항목 선택시 다음 질문으로 이동  
		private class ClickListener implements ActionListener {
Lb			public void actionPerformed( ActionEvent event ) {
				if ( ( event.getSource() == option1 ) && ( option1.getText().equals( "처음으로" ) ) ) {
					option1.setSelected( false );
L1					cards.first( frame );
				}
				else if ( ( event.getSource() == option1 ) && ( option1.getText().equals( "이전으로" ) ) ) {
					option1.setSelected( false );
L2					cards.previous( frame );
				}
				else if ( event.getSource() == option1 ) {
					option1.setSelected( false );
L3					cards.next( frame );
				}
				else if ( event.getSource() == option2 ) {
					option2.setSelected( false );
L4					cards.show( frame, nextOption2 );
				}
			}
Le		}
	}

실행 순서

 
 					※ 실행순서 및 메모리상태는 A키(이전) 및 D키(다음)를 눌러도 확인할 수 있습니다