상세 컨텐츠

본문 제목

숫자 야구 게임

프로그래밍 언어/Java(자바)

by kky2 2023. 6. 29. 14:41

본문

*  자바를 활용하여 다음과 같은 프로그램을 만들어 봅시다.

실행 환경: Eclipse

* 숫자 야구 게임?

  -  중복되지 않는 4자리 숫자를 맞추는 게임으로 숫자와 자리가 일치하면 Strike, 숫자는 일치하지만 자리가 다르면 Ball 의 결과를 받아 4자리 숫자와 자리를 모두 일치시키는 게임입니다.

 

 

코드를 작성하기 앞서 어떤 순서로 진행될지 논리적 흐름을 정해봅시다.

* 흐름

  1. 코드의 실행 순서에 맞게 출력문을 출력한다.
  2. 중복되지 않는 4자리 숫자를 무작위 생성하여 배열에 저장한다. (중복 제거를 위해 2중 for문)
  3. 정답을 맞힐 때까지 반복하도록 반복문을 시작한다.
  4. 사용자로부터 정답을 입력받고 또 다른 배열에 저장한다.
  5. 입력받은 숫자 4자리에 중복된 숫자가 있으면 반복문의 처음으로 돌아간다.
  6. 중복되지 않는 숫자를 입력했다면 정답 숫자와 입력 숫자를 비교한다.
  7. 자리와 숫자가 일치하는지에 따라 ArrayList에 문자열을 저장한다. ( S or B )
  8. ArrayList에 저장된 S 혹은 B의 개수를 카운트하여 출력한다.
  9. 정답을 맞힐 때까지 4 ~ 8번을 반복하고, 정답을 맞히는 순간 반복에 대한 카운트와 정답 숫자를 공개하고 게임을 종료한다.

 

* 자, 순서가 정해졌으니 코드로 옮겨볼까요?

 

A. import 하기

  •     입력을 받기 위한 객체를 생성하기 위해 Scanner클래스를 import 합니다.

 

B. 변수 정하기

  •     int [ ]  comNum                                    →    정답 숫자를 담을 배열
  •     int  cnt                                                    →    사용자가 정답을 입력한 횟수
  •     String  result                                         →    비교 결과를 출력할 문자열
  •     int [ ]  userNum                                    →    입력 숫자를 담을 배열
  •     ArrayList<String>  comparison        →    비교 결과를 담을 문자열 컬렉션
  •     int  cntS                                                 →    "S" 가 나온 횟수
  •     int  cntB                                                 →    "B" 가 나온 횟수

 

C. 사용한 것들

  •     배열, 2중 for문, while문(Labeled-Loop), ArrayList, Stream ...
  •     Labeled-Loop는 반복문이 여러개 이상일 경우에 이름을 붙여 continue, break 와 같은 기능을 원하는 곳에서 실행될 수 있도록 해줍니다. (본문에서는 loop 라는 이름으로 사용되어, 배열끼리 비교 후 중복된 숫자일 때 가장 바깥 쪽의 while문으로 되돌아 가도록 코딩했네요.)
  •     Stream은 JAVA 8 에서 추가된 기능으로 컬렉션(Collection) 데이터를 처리할 때 별도의 멀티스레드(Multi thread)의 구현없이도 병렬처리를 통해 쉽게 구현할 수 있습니다. (본문에서는 S, B 문자열을 담은 ArrayList 에서 각각 S와 B의 개수를 구하기 위해서 사용되었네요. 스트림을 이용하면 반복문을 복잡하게 이용하지 않아도 컬렉션을 쉽게 사용할 수 있어요!)

 

D. 소스코드 작성

import java.util.ArrayList;
import java.util.Scanner;
import java.util.stream.Stream;

public class BaseballGame {

	public static void main(String[] args) {
		// 숫자야구 게임
		Scanner scan = new Scanner(System.in);
		
		System.out.println("========================");
		System.out.println("     ※ 숫자 야구 게임※");
		System.out.println("========================");
		
		//랜덤 네자리 숫자 생성(정답)
		int[] comNum = new int[4];
		for (int i = 0; i < comNum.length; i++) {
			comNum[i] = (int) (Math.random()*9 + 1);
			//중복제거
			for (int j = 0; j < i; j++) {
				if (comNum[i] == comNum[j]) {
					i--;
				}
			}
		}
		System.out.println("* 4자리 숫자가 생성되었습니다.");
		
		int cnt = 0;
		String result = "";
		loop:
		while(!result.equals("4S0B")) {	//4S로 일치시까지 반복
			System.out.print("* 숫자 입력(4자리): ");
			int num = scan.nextInt();
			int[] userNum = Stream.of(String.valueOf(num).split("")).mapToInt(Integer::parseInt).toArray();
			
			//중복 숫자를 입력한 경우 재입력
			for (int i = 0; i < userNum.length; i++) {
				for (int j = 0; j < i; j++) {
					if(userNum[i] == userNum[j]) {
						System.out.println("* 중복된 숫자는 입력할 수 없습니다.");
						continue loop;
					}
				}
			}
	        
				//입력한 숫자와 정답 숫자 비교
	        	ArrayList<String> comparison = new ArrayList<>();
	        
	        	//숫자 비교
	        	for (int i = 0; i < comNum.length; i++) {
					for (int j = 0; j < userNum.length; j++) {
						if(i == j && comNum[i] == userNum[j]) {	//자리와 숫자가 모두 일치시
							comparison.add("S");
						}
						if(i != j && comNum[i] == userNum[j]) { //자리는 다르지만 숫자만 일치시
							comparison.add("B");
						}
					}
				}
	        
	        	//S, B 개수 카운트
	        	int cntS = (int) comparison.stream().filter(x -> x.equals("S")).count();
	        	int cntB = (int) comparison.stream().filter(x -> x.equals("B")).count();
	        
	        	//비교 결과 출력
	        	result = String.format("%dS%dB", cntS, cntB);
	        	System.out.println(result);
	        	cnt++;	//도전 횟수 카운트
		}
		
		//최종 결과 출력
		System.out.println("========================");
		System.out.print("도전[" + cnt + "회], 정답 숫자: ");
		for (int i = 0; i < comNum.length; i++) {
			System.out.print(comNum[i]);
		}
		System.out.println("\n☆★게임종료★☆");
		System.out.println("========================");
	}
}

 

저는 운이 좋아 6번만에 정답을 찾았네요 ㅋㅋ 더 빨리 정답을 맞춰보세요.

 

* 재밌는 예제를 통해서 쉽게 배워봅시다.  - 끝 -

관련글 더보기

댓글 영역