Adventure of 빠타박스
article thumbnail
728x90
728x90
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

'Programming > C_C++' 카테고리의 다른 글

[Data Structure] unorderd_map  (0) 2022.04.09
[C++] 역사부터 기초까지  (0) 2021.11.21
[C++] 숫자야구게임 만들기 1장 (중복문사용)  (0) 2021.10.13
profile

Adventure of 빠타박스

@PPATABOX

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!