SMALL
[ 해당 코드는 강의를 기반으로 하고 있습니다. ]
int main()
{
srand(time(NULL));
rand();
int nRand1, nRand2, nRand3; // 랜덤값, 유저값, 카운트 값에 대한 변수 만들어준다.
int nUser1, nUser2, nUser3;
int nStrike, nBall, nOut; // Strike 값은 while 문에 사용이 되고 있어서 초기화 해줘야한다.
int nCount = 0; // 총 몆번의 횟수를 맞췄는지 저장
bool bGame = true; //반복문 사용 계속적으로 지속되는 bool값 이용
while (bGame) //(while문 정해진 작업을 반복 몆번인지) 모르기에 게임을 다 맞추고 나서도 플레이어가 무한으로 할 수도 있고 맞추는 횟수도 정확히 알수 없음
{
// 게임 데이터 초기화
nRand1 = rand() % 9 + 1;
while (true)
{
nRand2 = rand() % 9 + 1;
if (nRand2 != nRand1) // 이미 나온 숫자가 나오면 다시 반복 작업하도록 만들어 준다.
break;
}
while (true)
{
nRand3 = rand() % 9 + 1;
if (nRand3 != nRand1 && nRand3 != nRand2)
break;
}
nStrike = 0; //이미 사용되는 값은 초기화 해줘야한다.
//게임 진행
while (nStrike < 3) // strike가 값이 3이하면 반복하고 3이면 게임을 종료 게임클리어 조건
{
system("cls"); // 화면을 깨끗하게 지워주는 명령문
nCount++;
//cout << nRand1 << nRand2 << nRand3 << endl;
cout << "1 숫자를 고르시오 (1 ~ 9) : ";
cin >> nUser1;
cout << "2 숫자를 고르시오 (1 ~ 9) : ";
cin >> nUser2;
cout << "3 숫자를 고르시오 (1 ~ 9) : ";
cin >> nUser3;
nStrike = nBall = nOut = 0;
if (nUser1 == nRand1)
nStrike++;
else if (nUser1 == nRand2 || nUser1 == nRand3)
nBall++;
else
nOut++;
if (nUser2 == nRand2)
nStrike++;
else if (nUser2 == nRand1 || nUser2 == nRand3)
nBall++;
else
nOut++;
if (nUser3 == nRand3)
nStrike++;
else if (nUser3 == nRand1 || nUser3 == nRand2)
nBall++;
else
nOut++;
// 스트라이크, 아웃, 볼의 갯수가 나오도록 하는 작업
cout << "스트라이크 : " << nStrike << endl; // 스트라이크가 3개가 되면 while문을 빠져나가면서 총 도전 횟수가 출력 되고 게임을 계속 진행할 것인지. 물어봄
cout << " 볼 : " << nBall << endl;
cout << " 아웃 : " << nOut << endl;
system("pause");
}
cout << "총 도전 횟수 : " << nCount << endl; // 게임 끝 후 총 몆번을 돌렸는가?
//클리어후 새게임을 할지 물어봄
char chYN;
cout << "새 게임(y, n)";
cin >> chYN;
if (chYN == 'n')
bGame = false;
}
system("pause");
return 0;
}
나는 기존 게임에서 셔플을 이용하여 조금더 간단하게 만들어 보고자 한다.
위 사항은 While반복문을 이용하여 조건을 달고 출력 되게끔 하였다.
하지만 셔플을 이용하면 조금더 간편하게 짧아진 문장을 볼 수 있다.
int main()
{
srand(time(NULL));
rand();
int nRand[9];
int nUser[3];
int nStrike, nBall, nOut;
int nCount = 0;
bool bGame = true;
while (bGame)
{
for (int i = 0; i < 9; i++)
nRand[i] = i + 1;
for (int i = 0; i < 100; i++)
{
int nSrc = rand() % 9;
int nDest = rand() % 9;
int nTemp = nRand[nSrc];
nRand[nSrc] = nRand[nDest];
nRand[nDest] = nTemp;
}// 이렇듯 랜덤으로 뭔가 선택하는 것이 있을때 셔플을 사용 (퍼즐 게임/ 카드게임/ 섯다/ 포카 등등)
// 이렇게 셔플을 이용하면 복잡하게 while문을 사용하지 않고 만들 수 있다.
// 즉 위에 랜덤 숫자를 총 9개 선언하고 아래쪽에서 0~2 까지 3개만 사용하고
셔플에서 9개의 숫자를 섞어주고 그중에 제일 앞에 3개만 사용 한다
// 결국엔 랜덤된 임의의 값을 섞은 것이기에 중복될 수 없다.
nStrike = 0;
//게임 진행
while (nStrike < 3)
{
system("cls");
nCount++;
//cout << nRand[0] << nRand[1] << nRand[2] << endl;
cout << "1 숫자를 고르시오 (1 ~ 9) : ";
cin >> nUser[0];
cout << "2 숫자를 고르시오 (1 ~ 9) : ";
cin >> nUser[1];
cout << "3 숫자를 고르시오 (1 ~ 9) : ";
cin >> nUser[2];
nStrike = nBall = nOut = 0;
//반복 횟수가 많아 질수록 주의
for (int i = 0; i < 3; i++)
{ //더 늘리고 싶다하면 여기 array 수와 i < " " 가 늘어나면 된다.
if (nUser[i] == nRand[i])
nStrike++;
else if (nUser[i] == nRand[(i + 1) % 3] || nUser[i] == nRand[(i + 2) % 3])
nBall++; // mod 연산자를 사용하면 간단하게 제작 가능 0으로 되돌릴 때
else
nOut++;
}
cout << "스트라이크 : " << nStrike << endl;
cout << " 볼 : " << nBall << endl;
cout << " 아웃 : " << nOut << endl;
system("pause");
}
cout << "총 도전 횟수 : " << nCount << endl;
char chYN;
cout << "새 게임(y, n)";
cin >> chYN;
if (chYN == 'n')
bGame = false;
}
system("pause");
return 0;
}
배열을 사용하여 데이터를 저장하게 되고 그 해당 데이터를
셔플로 랜덤숫자를 돌릴 수 있게 되어
코드가 간결해진 것을 볼 수 있다.
// 배열 : 순차적인 공간을 할당해서 데이터를 저장하는 방식 (공간을 할당해서 자료형 변수를 저장)
// 셔플 : 랜덤하게 섞고 같은 값은 나오지 않는다. ( 여러개의 값을 섞는것) 셔플은 Temp 값이 필요
//----------------배열예시 -------------------
//int nData = 10;
//// 배열에서 초기화 방법
//int aData[3] = {1, 2, 3};//이것이 초기화 방법 1 //배열 int형 변수 3개를 만들어 낸 것 과 같음
//
//aData[0] = 1;//배열 초기화 방법 2
//aData[1] = 1;
//aData[2] = 1; // 3보다 작은수 총 3개의 변수를 사용할 수 있게끔 만들어 주는것
//int nData[10]; //헝가리안 표기법으로 앞에 array를 a로 표기 안하고 뒤에 대괄호를 통해 알수 있기에 정수형n으로 표기
//for (int i = 1; i <= 10; i++)
// nData[i] = i + 1 // 인덱스 번호 i , i가 0부터 출발 0~10까지 1 부터 출발 하면 인덱스 안에 [i - 1] = i ?
//-------------------------------------------------------------------
//-------셔플 예시 ------
//int nData[9];
//for (int i = 0; i < 9; i++)
// nData[i] = i + 1;
//for (int i = 0; i < 100; i++)
//{
// int nSrc = rand() % 9; // 0~8 까지 소스 인덱스 번호
// int nDest = rand() % 9; // 데스트 인덱스 번호
// int nTemp = nData[nSrc]; // 셔플은 Temp값이 필요 // 소스 인덱스로 선택된 데이터 값을 담아둔다.
// nData[nSrc] = nData[nDest];
// nData[nDest] = nTemp; // 2개의 랜덤한 인덱스 번호를 선택해서 서로 바꾸는 것
//}
//for (int i = 0; i < 9; i++)
// cout << nData[i] << endl;
//-------------------------------------------
- 이 사항은 배열과 셔플에 대한 예시이다. 참고하면 될 거 같다.
728x90
728x90
LIST
'🅿🆁🅾🅶🆁🅰🅼🅼🅸🅽🅶 > C_C++' 카테고리의 다른 글
[Data Structure] unorderd_map (0) | 2022.04.09 |
---|---|
[C++] 역사부터 기초까지 (0) | 2021.11.21 |
[C++] 숫자야구게임 만들기 1장 (중복문사용) (0) | 2021.10.13 |