경일게임아카데미 실습/11월

과제 - 숫자 야구 게임 (2024 - 11 - 27)

mynote6590 2024. 11. 27. 17:59

숫자 야구 게임

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaseBall
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int numberPlayerInt = 0;
            string numberPlayerStr = "";
            int numberComputerInt = 0;
            bool checkCompuerNum = true;
            int inning = 0;

            // 컴퓨터 값 자릿수 별로 변수 생성 및 초기화
            int numberComputer1 = 0;
            int numberComputer10 = 0;
            int numberComputer100 = 0;

            // 플레이어 값 자릿수 변수 생성 및 초기화
            int numberPlayer1 = 0;
            int numberPlayer10 = 0;
            int numberPlayer100 = 0;

            while (inning < 11)
            {
                Console.WriteLine($"{inning} 이닝 입니다");
                int strike = 0;
                int boool = 0;

                // 컴퓨터의 값이 알맞은지 확인 후 저장하는 반복문
                while (checkCompuerNum)
                {
                    // 랜덤값 받기
                    Random random = new Random();

                    // 랜덤값 자릿수 별로 변수에 저장
                    numberComputerInt = random.Next(100, 1000);
                    numberComputer1 = numberComputerInt % 10;
                    numberComputer10 = (numberComputerInt / 10) % 10;
                    numberComputer100 = (numberComputerInt / 100);

                    // 자릿수별로 중복되는 값이 있는지 체크 
                    if (numberComputer1 != numberComputer10 && numberComputer10 != numberComputer100 && numberComputer100 != numberComputer1)
                    {
                        checkCompuerNum = false;
                    }
                    Console.WriteLine($"컴퓨터 난수 : {numberComputerInt}");
                }

                // 플레이어의 값이 알맞은지 확인 후 저장하는 반복문
                bool checkNumStr = true;
                bool checkNumRepeat = true;
                bool checkNumLength = true;
                while (checkNumStr == true || checkNumRepeat == true || checkNumLength == true)
                {
                    numberPlayerStr = Console.ReadLine();
                    checkNumStr = int.TryParse(numberPlayerStr, out numberPlayerInt);
                    checkNumLength = numberPlayerInt > 1000 || numberPlayerInt < 100;
                    if (checkNumStr == false)
                    {
                        Console.WriteLine("정수를 입력 해주세요.");
                        checkNumStr = false;
                    }
                    else if (checkNumLength)
                    {
                        Console.WriteLine("3자리의 정수를 입력하여 주세요");
                        checkNumLength = false;
                    }
                    else if (numberPlayerStr[0] == numberPlayerStr[1] || numberPlayerStr[1] == numberPlayerStr[2] || numberPlayerStr[2] == numberPlayerStr[0])
                    {
                        Console.WriteLine("중복값을 사용하지 마세요");
                        checkNumRepeat = false;
                    }
                    else
                    {
                        numberPlayer1 = numberPlayerInt % 10;
                        numberPlayer10 = (numberPlayerInt / 10) % 10;
                        numberPlayer100 = numberPlayerInt / 100;
                        break;
                    }

                }

                // 자릿수 별로 스트라이크 , 볼 계산 

                if (numberComputer1 == numberPlayer1)
                {
                    strike += 1;
                }
                if (numberComputer10 == numberPlayer10)
                {
                    strike += 1;
                }
                if (numberComputer100 == numberPlayer100)
                {
                    strike += 1;
                }

                if (numberComputer1 == numberPlayer10)
                {
                    boool += 1;
                }
                if (numberComputer1 == numberPlayer100)
                {
                    boool += 1;
                }
                if (numberComputer10 == numberPlayer1)
                {
                    boool += 1;
                }
                if (numberComputer10 == numberPlayer100)
                {
                    boool += 1;
                }
                if (numberComputer100 == numberPlayer1)
                {
                    boool += 1;
                }
                if (numberComputer100 == numberPlayer10)
                {
                    boool += 1;
                }

                // 결과 출력

                if (strike == 0 && boool == 0)
                {
                    Console.WriteLine("아웃");
                } else {
                    Console.WriteLine($"스트라이크 : {strike} , 볼 : {boool}");
                }

                // 게임 결과
                if (strike == 3)
                {
                    Console.WriteLine("플레이어 승리");
                    break;
                }
                if (inning == 11)
                {
                    Console.WriteLine("컴퓨터 승리");
                    break;
                }
                inning++;
            }


        }
    }
}

 

문제점

 

코드 설명

반복문을 사용해서 numberComputerInt 에 랜덤한 값을 넣고 그 값에 중복된 값이 존재하는지 자릿수 별로  비교해 확인 합니다. 중복된 값이 존재하면 반복문을 계속 돌게, 중복값이 존재하지 않으면 반복문을 나오게 됩니다.

 

여기에 문제점이 있는데 중복된 값이 존재하게 되면 그 값을 여러번 출력하게 되는 문제점이 발생하였습니다.

 

해결 방법 : random.Next(100, 1000); 코드를 while문 밖으로 빼기

원인: ramdom.Next로 랜덤한 변수를 가져오는 속도가 while문이 돌아가는 속도보다 느려서 같은 값을 다수 출력하게 된 것입니다.

 numberComputerInt = random.Next(100, 1000);
 while (checkCompuerNum)
    {
        // 랜덤값 받기
        Random random = new Random();
        // 랜덤값 자릿수 별로 변수에 저장
       
        numberComputer1 = numberComputerInt % 10;
        numberComputer10 = (numberComputerInt / 10) % 10;
        numberComputer100 = (numberComputerInt / 100);

        // 자릿수별로 중복되는 값이 있는지 체크 
        if (numberComputer1 != numberComputer10 && numberComputer10 != numberComputer100 && numberComputer100 != numberComputer1)
        {
            checkCompuerNum = false;
        }
        Console.WriteLine($"컴퓨터 난수 : {numberComputerInt}");
    }