hayu's 개발 일지

[TIL]240208 팀 프로젝트 / 숫자 야구 게임 본문

항해99/프로젝트

[TIL]240208 팀 프로젝트 / 숫자 야구 게임

hayu00 2024. 2. 8. 20:33

숫자 야구 게임

 

과제 조건

  • 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. (ex) 123, 759
  • 사용자는 컴퓨터가 뽑은 숫자를 맞추기 위해 시도합니다.
  • 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)를 알려줍니다.
  •  - 숫자의 값과 위치가 모두 일치하면 S
  •  - 숫자의 값은 일치하지만 위치가 틀렸으면 B
  • 기회는 무제한이며, 몇번의 시도 후에 맞췄는지 기록됩니다.
  • 숫자 3개를 모두 맞춘 경우, 게임을 종료합니다.

진행 방식

컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!
1번째 시도 : 134
0B0S
2번째 시도 : 238
1B1S
3번째 시도 : 820
2B1S
4번째 시도 : 028
3B
5번째 시도 : 280
3S
5번만에 맞히셨습니다. 
게임을 종료합니다.

 

프로젝트 코드(수정 전)

package hh19; 

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

public class TeamProject1 {


    public static void main(String[] args) {
		// 1. 랜덤 객체 생성
        Random random = new Random();

		// 2. 컴퓨터 배열 생성
        int[] intArray = new int[3];

		// 3. 중복 제거한 랜덤 구하기
        for (int i = 0; i < 3; i++) {
            intArray[i] = random.nextInt(10);
            for (int j = 0; j < i; j++) {
                if (intArray[i] == intArray[j]) {
                    i--;
                }
            }
        }

// 컴퓨터의 숫자 배열 출력 (참고용)
// for (int i = 0; i < 3; i++) {
// System.out.print(intArray[i]);
// }

// 사용자 입력 숫자 배열 생성

        System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");
        Scanner sc = new Scanner(System.in);
        String num = sc.next();
        System.out.println("우리가 친 숫자는 :" + num);

		// Stirng으로 입력 받은 사용자 숫자를 int형 배열로 형변환
        String[] myString = num.split("");
        int[] myNumber = new int[3];
        for (int i = 0; i < myString.length; i++) {
            myNumber[i] = Integer.parseInt(myString[i]);
        }

		// Strike, Ball, howMany(도전 횟수) 0으로 변수 초기화
        int Strike = 0;
        int Ball = 0;
        int howMany = 0;


		// 컴퓨터의 숫자와 사용자의 숫자가 일치하는지 여부 판별
		// 정답을 맞추기 전까지 반복
        while (!(Arrays.equals(intArray, myNumber))) {
			// 정답을 못 맞추는 경우
			// 컴퓨터의 숫자 배열을 하나하나씩 사용자의 숫자와 비교 (3x3=9, 모든 경우의 수)
            for (int i = 0; i < intArray.length; i++) {
                for (int j = 0; j < myNumber.length; j++) {
					// 숫자 값 동일, 숫자 위치 동일한 경우
                    if (intArray[i] == myNumber[j] && i == j) {
						// Strike 횟수 누적
                        Strike++;
                    }
					// 숫자 값만 동일한 경우
                    else if (intArray[i] == myNumber[j] && i != j) {
						// Ball 횟수 누적
                        Ball++;
                    }
                }
            }
			// 틀린 횟수 누적
            howMany++;

			// 예시 형식에 맞춰 Strike, Ball 출력  -수정하기
            if (Strike == 3) {
                System.out.println(Strike + "S");
            } else if (Ball == 3) {
                System.out.println(Ball + "B");
            } else {
                System.out.println(Ball + "B" + Strike + "S");
            }

			// 컴퓨터의 숫자와 사용자의 숫자 비교 후 다시 loop 진행을 위해 변수 초기화
			// Strike, Ball 0으로 초기화
            Strike = 0;
            Ball = 0;
			// 사용자의 숫자 다시 입력 받아 초기화
            num = sc.next();

// 사용자의 숫자 출력 (참고용)
// System.out.println("우리가 친 숫자는 :"+num);

			// 입력 받은 Stirng형 사용자의 숫자를 int형 배열로 변환
            myString = num.split("");
            for (int i = 0; i < myString.length; i++) {
                myNumber[i] = Integer.parseInt(myString[i]);
            }
        }
		// while문 밖 : 정답을 맞춘 경우
		// 여태까지 도전한 횟수에 마지막 한 번 포함
        howMany += 1; //위에 초기화 값을 1로 수정
        System.out.println("3S");

		// 결과 출력하기
        System.out.println(howMany + "번만에 맞히셨습니다.");
        System.out.println("게임을 종료합니다.");
    }
}

 

프로젝트 코드(수정 후)

package hh19;

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

public class TeamProject2 {
    public static void main(String[] args) {
		// 1. 랜덤 객체 생성
        Random random = new Random();

		// 2. 컴퓨터 배열 생성
        int[] intArray = new int[3];

		// 3. 중복 제거한 랜덤 구하기
        for (int i = 0; i < 3; i++) {
            intArray[i] = random.nextInt(10);
            for (int j = 0; j < i; j++) {
                if (intArray[i] == intArray[j]) {
                    i--;
                }
            }
        }

// 컴퓨터의 숫자 배열 출력 (참고용)
// for (int i = 0; i < 3; i++) {
// System.out.print(intArray[i]);
// }

		// 사용자 입력 숫자 배열 생성

        System.out.println("컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!");
        Scanner sc = new Scanner(System.in);
        int[] myNumber = new int[3];

		// Strike, Ball, howMany(도전 횟수) 0으로 변수 초기화
        int Strike = 0;
        int Ball = 0;
        int howMany = 0;


		// 컴퓨터의 숫자와 사용자의 숫자가 일치하는지 여부 판별
		// 정답을 맞추기 전까지 반복
        while (!(Arrays.equals(intArray, myNumber))) {
			// 사용자의 숫자 다시 입력 받아 초기화
            String num = sc.next();
            System.out.println(howMany + 1 + "번째 시도 : " + num);

			// Stirng으로 입력 받은 사용자 숫자를 int형 배열로 형변환
            String[] myString = num.split("");
            for (int i = 0; i < myString.length; i++) {
                myNumber[i] = Integer.parseInt(myString[i]);
            }

			// 정답을 못 맞추는 경우
			// 컴퓨터의 숫자 배열을 하나하나씩 사용자의 숫자와 비교 (3x3=9, 모든 경우의 수)
            for (int i = 0; i < intArray.length; i++) {
                for (int j = 0; j < myNumber.length; j++) {
					// 숫자 값 동일, 숫자 위치 동일한 경우
                    if (intArray[i] == myNumber[j] && i == j) {
						// Strike 횟수 누적
                        Strike++;
                    }
					// 숫자 값만 동일한 경우
                    else if (intArray[i] == myNumber[j] && i != j) {
						// Ball 횟수 누적
                        Ball++;
                    }
                }
            }
			// 틀린 횟수 누적
            howMany++;

			// 예시 형식에 맞춰 Strike, Ball 출력
            if (Ball == 3) {
                System.out.println(Ball + "B");
            } else if (Strike == 3) {
                System.out.println(Strike + "S");
            } else {
                System.out.println(Ball + "B" + Strike + "S");
            }

			// 컴퓨터의 숫자와 사용자의 숫자 비교 후 다시 loop 진행을 위해 변수 초기화
			// Strike, Ball 0으로 초기화
            Strike = 0;
            Ball = 0;

        }
		// 결과 출력하기
        System.out.println(howMany + "번만에 맞히셨습니다.");
        System.out.println("게임을 종료합니다.");
    }
}

 

- 중복된 코드를 제거했다. / 코드에서 불필요하게 중복되는 부분들이 있어서 개선했다. 

 

출력 예시

컴퓨터가 숫자를 생성하였습니다. 답을 맞춰보세요!
123
1번째 시도 : 123
1B0S
145
2번째 시도 : 145
0B0S
256
3번째 시도 : 256
0B1S
278
4번째 시도 : 278
0B0S
896
5번째 시도 : 896
1B1S
926
6번째 시도 : 926
0B2S
826
7번째 시도 : 826
0B1S
936
8번째 시도 : 936
3S
8번만에 맞히셨습니다.
게임을 종료합니다.

 

회고

배운점

- 배열 활용

- 배열을 나누어 비교하는 것.

- 중복된 숫자 제거하는 것.

- 배열 일치 여부법.

 

많은 것을 배웠고, 활용해봐야겠다는 생각을 했다.

 

아쉬운점

- 코드를 더 깔끔하게 짜지못한 것.

- 다음에는 배열이 아닌 문자열로 코드를 짜보고 싶다.

- 중복되는 코드 확인을 못한 것.