Java

[Java] 66. Swing: 랜덤 숫자 게임 만들기

Song hyun 2024. 4. 30. 15:14
728x90
반응형

[Java] 66. Swing: 랜덤 숫자 게임 만들기

 

아래의 사진처럼, Game Start 버튼을 누르면 랜덤한 번호 6개를 만들어주는 프로그램을 작성해보자.

 

LottoFrame 클래스 살펴보기

(1) 상속 및 인터페이스
-상속: JFrame(부모 클래스)
-implements: ActionListener(인터페이스)

(2) 멤버 변수
-JButton형 변수 button
-LottoRandomNumber형 변수 lottoRandomNumber (포함 관계)
-boolean형 변수 isStart=true;
-int형 변수 NUMBER_DISTANCE=50;

(3) 사용자 정의 생성자
-setTitle: 창의 제목을 설정한다. ("Lotto Game")
-setSize: 창의 크기를 설정한다. (가로 600, 세로 400)
-setDefaultCloseOperation: 창의 x버튼을 눌렀을 시의 처리를 결정한다. (EXIT_ON_CLOSE=창 닫기)
-JButton형 변수 button 선언
-LottoRandomNumber형 변수 lottoRandomNumber 선언

(4) setInitLayout() 메서드
-add(button,BorderLayout.NORTH): 북쪽에 button 삽입
-setVisible(true): 창이 보이게끔 설정

(5) addEventListener() 메서드
-button.addActionListener(this); : button이 눌러졌을 때, 신호를 감지하는 actionListener 생성

(6) actionPerformed() 메서드 (오버라이드)
-"그림을 그려라!" 출력
-isStart=false 초기화

(7) paint() 메서드 (오버라이드)
-Font: 글씨의 글씨체, 크기, 특징(이탤릭, 볼드 등...) 설정
-if문: isStart가 true라면 글자 출력 ("로또 번호를 클릭하세요.")
-한 번 실행된 뒤로는 랜덤한 번호들을 출력하기만 한다!

 

package ch07;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class LottoFrame extends JFrame implements ActionListener{
	
	private JButton button;
	private LottoRandomNumber lottoRandomNumber;
	private boolean isStart=true;
	private int NUMBER_DISTANCE=50;
	
	 public LottoFrame() {
		initData();
		setInitLayout();
		addEventListener();
	}
	 
	 private void initData() {
		 setTitle("Lotto Game");
		 setSize(600,400);
		 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 button=new JButton("Game Start");
		 lottoRandomNumber=new LottoRandomNumber();
	 }
	 private void setInitLayout() {
		 add(button, BorderLayout.NORTH);
		 setVisible(true);
	 }
	 private void addEventListener() {
		 button.addActionListener(this);
	 }

	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("그림을 그려라!");
		isStart=false;
		// 이벤트가 일어나면 그림을 그려라
		repaint(); // 다시 그림을 그려라 = F5 
		
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		Font f = new Font("궁서체", Font.BOLD,20);
		g.setFont(f);
		if(isStart) {
			g.drawString("로또 번호를 클릭하세요", 230, 200);
		} else {
			int[] getNumbers=lottoRandomNumber.createNumber();
			for(int i=0;i<getNumbers.length; i++) {
					g.drawString(getNumbers[i]+" ",100 + i*NUMBER_DISTANCE,300);
			}
		}
		
	}
	
	 public static void main(String[] args) {
		new LottoFrame();
	} // end of main
 
} // end of class

 

package ch07;

import java.util.Arrays;
import java.util.Random;


// 클래스를 설계할 때 -> 단일 책임 원칙을 설정하는 것이 좋다.
public class LottoRandomNumber {
	private int number;
	final int LOTTO_NUMBER_COUNT = 6;
	
	// 6개의 랜덤 번호를 생성하는 메서드가 필요
	public int[] createNumber() {
		int[] lottoWinNum = new int[LOTTO_NUMBER_COUNT];
		Random random = new Random();
		
		for (int i = 0; i < lottoWinNum.length; i++) {
			lottoWinNum[i]=random.nextInt(45)+1;
			for(int j=0; j<i; j++) {
				if(lottoWinNum[j] == lottoWinNum[i]) {
					// 값이 중복된 상태이다.
					i--;
				}
			}
		}
		Arrays.sort(lottoWinNum); //오름차순 자동 정렬
		
		return lottoWinNum;
	}
	
	// 코드 테스트
	public static void main(String[] args) {
		LottoRandomNumber randomNumber = new LottoRandomNumber();
		int [] resultArray=randomNumber.createNumber();
		for(int i=0; i<resultArray.length; i++) {
			System.out.println(resultArray[i]);
		}
	}

}
728x90
반응형