프로그래밍 언어/Java(자바)
숫자 야구 게임
kky2
2023. 6. 29. 14:41
* 자바를 활용하여 다음과 같은 프로그램을 만들어 봅시다.
* 숫자 야구 게임?
- 중복되지 않는 4자리 숫자를 맞추는 게임으로 숫자와 자리가 일치하면 Strike, 숫자는 일치하지만 자리가 다르면 Ball 의 결과를 받아 4자리 숫자와 자리를 모두 일치시키는 게임입니다.
코드를 작성하기 앞서 어떤 순서로 진행될지 논리적 흐름을 정해봅시다.
* 흐름
- 코드의 실행 순서에 맞게 출력문을 출력한다.
- 중복되지 않는 4자리 숫자를 무작위 생성하여 배열에 저장한다. (중복 제거를 위해 2중 for문)
- 정답을 맞힐 때까지 반복하도록 반복문을 시작한다.
- 사용자로부터 정답을 입력받고 또 다른 배열에 저장한다.
- 입력받은 숫자 4자리에 중복된 숫자가 있으면 반복문의 처음으로 돌아간다.
- 중복되지 않는 숫자를 입력했다면 정답 숫자와 입력 숫자를 비교한다.
- 자리와 숫자가 일치하는지에 따라 ArrayList에 문자열을 저장한다. ( S or B )
- ArrayList에 저장된 S 혹은 B의 개수를 카운트하여 출력한다.
- 정답을 맞힐 때까지 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번만에 정답을 찾았네요 ㅋㅋ 더 빨리 정답을 맞춰보세요.
* 재밌는 예제를 통해서 쉽게 배워봅시다. - 끝 -