(작성중) 지옥의 야구공 던지기 문제 🤯

아기개발왕짱열무·2024년 1월 18일

단계별로 점점 어려워지는 야구공 문제를 풀어봅시다 .. ~!!

문제

야구 게임 (스크린 야구, 공격만)

스크린 야구 게임을 제작하려고 합니다.
해당 게임은 항상 공격만 하는 게임으로, 투수가 공을 던지는 것을 치기만 하면 됩니다.
투수의 공은 컴퓨터이며, 타자는 사용자 입니다.
(반복문, 조건문, 배열을 최대한 사용하시면 됩니다.)


0단계

투수가 매번 던지는 공은 1 ~ 10의 난수로 설정합니다.
사용자의 입력도 1 ~10까지이며,
투수의 공과 사용자의 입력이 동일하면 안타로, 동일하지 않으면 아웃으로 간주합니다.
해당 게임은 3아웃이면 종료됩니다.

✅코드

public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		int hitCnt = 0; // 안타수
		int outCnt = 0; // 아웃수

		System.out.println("===게임을 시작합니다===");
        System.out.println();
		while (true) {
			int pitchBall = (int) (Math.random() * 10) + 1; // 투수가 던지는 공

			System.out.print("공을 던져주세요 : ");
			int playerBall = scan.nextInt(); // 유저가 입력한 공

			// 입력한 공이 1~10을 벗어나면
			if (playerBall < 1 || playerBall > 10) {
				System.out.println("*공은 1~10까지 던질 수 있습니다.*");
			} else { // 1~10 사이로 잘 입력했으면

				// 투수공과 유저공이 같은면 안타수 증가
				if (pitchBall == playerBall) {
					hitCnt++;
				} else { // 다르면 아웃수 증가
					outCnt++;
				}

				System.out.printf("투수:%d 플레이어:%d 안타:%d 아웃:%d\n", 
                pitchBall, playerBall, hitCnt, outCnt);
                System.out.println();

				// 아웃 3번이 되면 반복문 종료
				if (outCnt == 3) {
					System.out.println("===게임을 종료합니다===");
					break;
				}
			}
		}
	}

✅출력결과

===0단계 게임을 시작합니다===

공을 던져주세요 : 2
[투수:2 플레이어:2 안타:1 아웃:0]

공을 던져주세요 : 0 // 일부러 잘못 던져봤음
*공은 1~10까지 던질 수 있습니다.*
공을 던져주세요 : 1
[투수:5 플레이어:1 안타:1 아웃:1]

공을 던져주세요 : 5
[투수:5 플레이어:5 안타:2 아웃:1]

공을 던져주세요 : 4
[투수:3 플레이어:4 안타:2 아웃:2]

공을 던져주세요 : 5
[투수:7 플레이어:5 안타:2 아웃:3]

===게임을 종료합니다===

1단계

1회부터 3회까지만 진행합니다.
각 회는 3아웃 마다 회가 넘어가며, 매회가 시작 할 때마다 0아웃으로 시작합니다.

✅코드

public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		int hitCnt = 0; // 안타수
		int outCnt = 0; // 아웃수
		int totalRound = 3; // 총횟수

		System.out.println("===1단계 게임을 시작합니다===");

		// 총횟수만큼만 게임 진행
		for (int i = 1; i <= totalRound; i++) {
			System.out.printf("***%d회차\n", i);
            System.out.println();

			while (true) {
				int pitchBall = (int) (Math.random() * 10) + 1; // 투수가 던지는 공

				System.out.print("공을 던져주세요 : ");
				int playerBall = scan.nextInt(); // 유저가 입력한 공

				// 입력한 공이 1~10을 벗어나면
				if (playerBall < 1 || playerBall > 10) {
					System.out.println("*공은 1~10까지 던질 수 있습니다.*");
				} else { // 1~10 사이로 잘 입력했으면

					// 투수공과 유저공이 같은면 안타수 증가
					if (pitchBall == playerBall) {
						hitCnt++;
					} else { // 다르면 아웃수 증가
						outCnt++;
					}

					System.out.printf("[투수:%d 플레이어:%d 안타:%d 아웃:%d]\n", 
                    pitchBall, playerBall, hitCnt, outCnt);
                    System.out.println();

					// 아웃 3번이 되면 반복문 종료
					if (outCnt == 3) {
						System.out.printf("===%d회차를 종료합니다===\n", i);
						break;
					}
				}
			}
			outCnt = 0; // 다음 회차 시작 전에 안타수 초기화
		}
		System.out.println("===게임을 종료합니다===");
	}
===1단계 게임을 시작합니다===
***1회차

공을 던져주세요 : 4
[투수:3 플레이어:4 안타:0 아웃:1]

공을 던져주세요 : 5
[투수:9 플레이어:5 안타:0 아웃:2]

공을 던져주세요 : 4
[투수:7 플레이어:4 안타:0 아웃:3]

===1회차를 종료합니다===
***2회차

공을 던져주세요 : 1
[투수:9 플레이어:1 안타:0 아웃:1]

공을 던져주세요 : 2
[투수:2 플레이어:2 안타:1 아웃:1]

공을 던져주세요 : 2
[투수:4 플레이어:2 안타:1 아웃:2]

공을 던져주세요 : 6
[투수:4 플레이어:6 안타:1 아웃:3]

===2회차를 종료합니다===
***3회차

공을 던져주세요 : 1
[투수:9 플레이어:1 안타:1 아웃:1]

공을 던져주세요 : 5
[투수:10 플레이어:5 안타:1 아웃:2]

공을 던져주세요 : 2
[투수:2 플레이어:2 안타:2 아웃:2]

공을 던져주세요 : 2
[투수:1 플레이어:2 안타:2 아웃:3]

===3회차를 종료합니다===
===게임을 종료합니다===

2단계

9명의 타자선수를 등록합니다.
각 타자가 타격하기 위해 타석에 등장시, 타순 및 타자명이 출력됩니다.
9번 타자 다음 순서는 1번 타자로 9명이 로테이션 됩니다. (9번 타자가 끝나면 다시 1번 타자)

1회차가 끝나는 기준이 3아웃입니다.
타자가 1아웃이 되면 다음 선수로 넘어갑니다.
타자가 안타를 쳐도, 출루했다고 가정하고 다음 선수로 넘어갑니다.

✅코드

public static void main(String[] args) {
        // 타자 등록
		String playerArr[] = {"일번타자", "이번타자", "삼번타자", "사번타자",
				"오번타자", "육번타자", "칠번타자", "팔번타자", "구번타자"};

		Scanner scan = new Scanner(System.in);

		int hitCnt = 0; // 안타수
		int outCnt = 0; // 아웃수
		int totalRound = 3; // 총횟수
		int playerIndex = 0; // 타자 순서 인덱스

		System.out.println("===2단계 게임을 시작합니다===");

		// 총횟수만큼만 게임 진행
		for (int i = 1; i <= totalRound; i++) {
			System.out.printf("***%d회차\n", i);
            System.out.println();

			while (true) {
				// 선수 입장문
				System.out.printf(">>>%d번 타자 '%s선수' 입장 !!\n", 
						(playerIndex+1), playerArr[playerIndex]); // 선수배열[인덱스]
				playerIndex++; // 다음 선수를 위해 값 증가
				
				int pitchBall = (int) (Math.random() * 10) + 1; // 투수가 던지는 공

				System.out.print("공을 던져주세요 : ");
				int playerBall = scan.nextInt(); // 유저가 입력한 공

				// 입력한 공이 1~10을 벗어나면
				if (playerBall < 1 || playerBall > 10) {
					System.out.println("*공은 1~10까지 던질 수 있습니다.*");
				} else { // 1~10 사이로 잘 입력했으면

					// 투수공과 유저공이 같은면 안타수 증가
					if (pitchBall == playerBall) {
						hitCnt++;
					} else { // 다르면 아웃수 증가
						outCnt++;
					}
					
					// 9명의 선수가 다 출루했으면 초기화
					if(playerIndex == playerArr.length) { 
						playerIndex = 0;
					}
					System.out.printf("[투수:%d 플레이어:%d 안타:%d 아웃:%d]\n", 
                    pitchBall, playerBall, hitCnt, outCnt);
                    System.out.println();

					// 아웃 3번이 되면 반복문 종료
					if (outCnt == 3) {
						System.out.printf("===%d회차를 종료합니다===\n", i);
						break;
					}
				}
			}
			outCnt = 0; // 다음 회차 시작 전에 아웃수 초기화
		}
		System.out.println("===게임을 종료합니다===");
	}

✅출력결과

===2단계 게임을 시작합니다===
***1회차

>>>1번 타자 '일번타자선수' 입장 !!
공을 던져주세요 : 1
[투수:4 플레이어:1 안타:0 아웃:1]

>>>2번 타자 '이번타자선수' 입장 !!
공을 던져주세요 : 2
[투수:6 플레이어:2 안타:0 아웃:2]

>>>3번 타자 '삼번타자선수' 입장 !!
공을 던져주세요 : 6
[투수:8 플레이어:6 안타:0 아웃:3

===1회차를 종료합니다===
***2회차

>>>4번 타자 '사번타자선수' 입장 !!
공을 던져주세요 : 4
[투수:1 플레이어:4 안타:0 아웃:1]

>>>5번 타자 '오번타자선수' 입장 !!
공을 던져주세요 : 5
[투수:3 플레이어:5 안타:0 아웃:2]

>>>6번 타자 '육번타자선수' 입장 !!
공을 던져주세요 : 5
[투수:5 플레이어:5 안타:1 아웃:2]

>>>7번 타자 '칠번타자선수' 입장 !!
공을 던져주세요 : 2
[투수:2 플레이어:2 안타:2 아웃:2]

>>>8번 타자 '팔번타자선수' 입장 !!
공을 던져주세요 : 3
[투수:2 플레이어:3 안타:2 아웃:3]

===2회차를 종료합니다===
***3회차

>>>9번 타자 '구번타자선수' 입장 !!
공을 던져주세요 : 1
[투수:3 플레이어:1 안타:2 아웃:1]

>>>1번 타자 '일번타자선수' 입장 !!
공을 던져주세요 : 2
[투수:9 플레이어:2 안타:2 아웃:2]

>>>2번 타자 '이번타자선수' 입장 !!
공을 던져주세요 : 5
[투수:10 플레이어:5 안타:2 아웃:3]

===3회차를 종료합니다===
===게임을 종료합니다===

3단계

각 타자의 전체 타석 및 안타수를 기록합니다.
타석에 등장시, 타순 및 타자명 뿐만 아니라 타율도 출력됩니다. (타율 = 안타수 / 타석수)
첫 타석의 타율은 0 입니다.

✅코드

public static void main(String[] args) {
        // 타자 등록
		String playerArr[] = {"일번타자", "이번타자", "삼번타자", "사번타자",
				"오번타자", "육번타자", "칠번타자", "팔번타자", "구번타자"};

		Scanner scan = new Scanner(System.in);

		int hitCnt = 0; // 안타수
		int outCnt = 0; // 아웃수
		int totalRound = 3; // 총횟수
		int playerIndex = 0; // 타자 순서 인덱스
		
		int batCntArr[] = new int[9]; // 선수별 타석수
		int hitCntArr[] = new int[9]; // 선수별 안타수
		double battingAvg = 0; // 타율

		System.out.println("===3단계 게임을 시작합니다===");

		// 총횟수만큼만 게임 진행
		for (int i = 1; i <= totalRound; i++) {
			System.out.printf("***%d회차\n", i);
            System.out.println();

			while (true) {
				// 선수 입장문
				System.out.printf(">>>%d번 타자 '%s선수' 입장 !!\n", 
						(playerIndex+1), playerArr[playerIndex]); // 선수배열[인덱스]
				
				// 선수별 타율 표시
				if(batCntArr[playerIndex] > 0) { // 첫타석이 아니면
					battingAvg = (double)(hitCntArr[playerIndex]/batCntArr[playerIndex]);
				}
				System.out.printf(">>>타율:%.2f(안타:%d/타석:%d)\n", 
						battingAvg, hitCntArr[playerIndex], batCntArr[playerIndex]);
				
				int pitchBall = (int) (Math.random() * 10) + 1; // 투수가 던지는 공

				System.out.print("공을 던져주세요 : ");
				int playerBall = scan.nextInt(); // 유저가 입력한 공

				// 입력한 공이 1~10을 벗어나면
				if (playerBall < 1 || playerBall > 10) {
					System.out.println("*공은 1~10까지 던질 수 있습니다.*");
				} else { // 1~10 사이로 잘 입력했으면

					// 투수공과 유저공이 같은면 안타수 증가
					if (pitchBall == playerBall) {
						hitCnt++;
					} else { // 다르면 아웃수 증가
						outCnt++;
					}
					
					playerIndex++; // 다음 선수를 위해 값 증가
					// 9명의 선수가 다 출루했으면 초기화
					if(playerIndex == playerArr.length) { 
						playerIndex = 0;
					}
					System.out.printf("[투수:%d 플레이어:%d 안타:%d 아웃:%d]\n", 
                    pitchBall, playerBall, hitCnt, outCnt);
                    System.out.println();

					// 아웃 3번이 되면 반복문 종료
					if (outCnt == 3) {
						System.out.printf("===%d회차를 종료합니다===\n", i);
						break;
					}
				}
			}
			outCnt = 0; // 다음 회차 시작 전에 아웃수 초기화
		}
		System.out.println("===게임을 종료합니다===");
	}

✅출력결과
(안타가 잘 안 나와서 .. 타율이 0이네요 .. 쩝)

===3단계 게임을 시작합니다===
***1회차

>>>1번 타자 '일번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 1
[투수:3 플레이어:1 안타:0 아웃:1]

>>>2번 타자 '이번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 2
[투수:5 플레이어:2 안타:0 아웃:2]

>>>3번 타자 '삼번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 3
[투수:2 플레이어:3 안타:0 아웃:3]

===1회차를 종료합니다===
***2회차

>>>4번 타자 '사번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 4
[투수:1 플레이어:4 안타:0 아웃:1]

>>>5번 타자 '오번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 5
[투수:3 플레이어:5 안타:0 아웃:2]

>>>6번 타자 '육번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 2
[투수:5 플레이어:2 안타:0 아웃:3]

===2회차를 종료합니다===
***3회차

>>>7번 타자 '칠번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 5
[투수:3 플레이어:5 안타:0 아웃:1]

>>>8번 타자 '팔번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 4
[투수:4 플레이어:4 안타:1 아웃:1]

>>>9번 타자 '구번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 5
[투수:8 플레이어:5 안타:1 아웃:2]

>>>1번 타자 '일번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 1
[투수:1 플레이어:1 안타:2 아웃:2]

>>>2번 타자 '이번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
공을 던져주세요 : 5
[투수:3 플레이어:5 안타:2 아웃:3]

===3회차를 종료합니다===
===게임을 종료합니다===


4단계

사용자 대신 자동 시뮬레이션으로 장르를 변경합니다.
투수가 던지는 공에 스트라이크와 볼을 추가 합니다.

이를 위해, 사용자 입력 대신, 1 ~ 100의 난수로 설정합니다.
투수가 던지는 공도 1 ~ 100의 난수로 설정합니다.

투수가 던지는 공 중 아래의 값 사이에 들어올 경우 "스트라이크"로 간주합니다.
1 ~ 10, 50 ~ 60, 90 ~100
그 외의 값은 "볼"로 간주 합니다.
(사용자 값과 투수의 값이 같을 경우는 스트라이크와 볼 상관 없이 안타)

스트라이크가 3개일 경우 아웃이 되며, 볼이 4개일 경우 안타로 처리됩니다.
안타 혹은 아웃 이후, 다음 타자가 타석에 들어설 때 스트라이크와 볼은 0으로 시작됩니다.

✅코드

public static void main(String[] args) {
        // 타자 등록
        String playerArr[] = { "일번타자", "이번타자", "삼번타자", "사번타자",
                "오번타자", "육번타자", "칠번타자", "팔번타자", "구번타자" };

        boolean isHit = false; // 안타 여부
        int totalRound = 3; // 총횟수
        int playerIndex = 0; // 타자 순서 인덱스

        int batCntArr[] = new int[9]; // 선수별 타석수
        int hitCntArr[] = new int[9]; // 선수별 안타수
        double battingAvg = 0; // 타율

        System.out.println("===4단계 게임을 시작합니다===");

        // 총횟수만큼만 게임 진행
        for (int i = 1; i <= totalRound; i++) {
            System.out.printf("***%d회차\n", i);
            System.out.println();

            // 한 선수 게임이 끝나면 안타/아웃 초기화
            int hitCnt = 0; // 안타수
            int outCnt = 0; // 아웃수

            while (outCnt < 3) { // 아웃 3번이면 반복문 탈출
                // 선수 입장문
                System.out.printf(">>>%d번 타자 '%s선수' 입장 !!\n",
                        (playerIndex + 1), playerArr[playerIndex]); // 선수배열[인덱스]

                // 선수별 타율 표시
                if (batCntArr[playerIndex] > 0) { // 첫타석이 아니면
                    battingAvg = (double) (hitCntArr[playerIndex] / batCntArr[playerIndex]);
                }
                System.out.printf(">>>타율:%.2f(안타:%d/타석:%d)\n",
                        battingAvg, hitCntArr[playerIndex], batCntArr[playerIndex]);

                // 한 선수의 플레이
                while (true) {
                    // 한 선수의 게임이 끝나면 볼/스트라이크 초기화
                    int ballCnt = 0; // 볼 수
                    int strikeCnt = 0; // 스트라이크 수

                    int pitchBall = (int) (Math.random() * 100) + 1; // 투수가 던지는 공
                    int playerBall = (int) (Math.random() * 100) + 1; // 타자가 치는 공

                    // 타자의 공이 안타냐 볼이냐 스트라이크냐
                    if (pitchBall == playerBall) {
                        hitCnt++; // 투수랑 타자랑 같으면 안타 수 증가
                        isHit = true; // 안타
                    } else if ((pitchBall >= 1 && pitchBall <= 10) ||
                            (pitchBall >= 50 && pitchBall <= 60) ||
                            (pitchBall >= 90 && pitchBall <= 100)) {
                        strikeCnt++; // 범위에 들어오면 스트라이크 수 증가
                    } else {
                        ballCnt++; // 다른 경우엔 볼 수 증가
                    }

                    System.out.printf("[투수:%d 플레이어:%d 스트라이크:%d 볼:%d 안타:%d 아웃:%d ]\n",
                            pitchBall, playerBall, strikeCnt, ballCnt, hitCnt, outCnt);

                    // 스트라이크가 3개면 아웃
                    if (strikeCnt == 3) {
                        System.out.println("===스트라이크 3번 아웃===");
                        outCnt++; // 아웃수 증가
                        break; // 반복문 종료
                    }

                    // 볼이 4개면 안타
                    if (ballCnt == 4) {
                        hitCnt++;
                        isHit = true;
                    }

                    // 안타 or 아웃이면 타자변경
                    if (isHit) {
                        hitCntArr[playerIndex]++; // 선수의 안타수 증가
                        break;
                    }

                    System.out.println();
                }

                playerIndex++; // 다음 선수를 위해 값 증가

                // 9명의 선수가 다 출루했으면 초기화
                if (playerIndex == playerArr.length) {
                    playerIndex = 0;
                }

                // 아웃 3번이 되면 반복문 종료
                if (outCnt == 3) {
                    System.out.printf("===%d회차를 종료합니다===\n", i);
                    break;
                }
            }
        }
        System.out.println("===게임을 종료합니다===");

    }

✅출력결과
안타가 안 나와서 바로 삼진아웃 ... 😓😓

===4단계 게임을 시작합니다===
***1회차

>>>1번 타자 '일번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
[투수:57 플레이어:12 스트라이크:1:0 안타:0 아웃:0 ]
[투수:64 플레이어:89 스트라이크:1:1 안타:0 아웃:0 ]
[투수:11 플레이어:65 스트라이크:1:1 안타:0 아웃:0 ]
[투수:39 플레이어:72 스트라이크:1:2 안타:0 아웃:0 ]
[투수:63 플레이어:55 스트라이크:2:2 안타:0 아웃:0 ]
[투수:70 플레이어:51 스트라이크:3:2 안타:0 아웃:0 ]
===스트라이크 3번 아웃===
==1회차를 종료합니다===
***2회차

>>>2번 타자 '이번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
[투수:43 플레이어:66 스트라이크:1:0 안타:0 아웃:0 ]
[투수:68 플레이어:77 스트라이크:1:1 안타:0 아웃:0 ]
[투수:49 플레이어:56 스트라이크:1:1 안타:0 아웃:0 ]
[투수:19 플레이어:6 스트라이크:2:1 안타:0 아웃:0 ]
[투수:64 플레이어:4 스트라이크:3:1 안타:0 아웃:0 ]
===스트라이크 3번 아웃===
==2회차를 종료합니다===
***3회차

>>>3번 타자 '삼번타자선수' 입장 !!
>>>타율:0.00(안타:0/타석:0)
[투수:54 플레이어:14 스트라이크:1:0 안타:0 아웃:0 ]
[투수:47 플레이어:97 스트라이크:1:1 안타:0 아웃:0 ]
[투수:95 플레이어:84 스트라이크:1:1 안타:0 아웃:0 ]
[투수:67 플레이어:11 스트라이크:2:1 안타:0 아웃:0 ]
[투수:10 플레이어:11 스트라이크:2:2 안타:0 아웃:0 ]
[투수:62 플레이어:17 스트라이크:3:2 안타:0 아웃:0 ]
===스트라이크 3번 아웃===
==3회차를 종료합니다===
===게임을 종료합니다===

... 작성중

profile
공부 중입니다 ..

0개의 댓글