숫자 야구 게임
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}");
}
'경일게임아카데미 실습 > 11월' 카테고리의 다른 글
2024 - 11 - 29 (0) | 2024.11.29 |
---|---|
배열 과제 - 2차원 배열 활용 (2024 - 11- 28) (0) | 2024.11.28 |
반복문 과제 - 피라미드와 다이아몬드 출력 (2024 - 11 - 26) (0) | 2024.11.26 |