본문 바로가기
공부

숫자 슬라이드 퍼즐 게임

by MY블로그 2022. 10. 23.

기초단계 - 퍼즐완성시 종료 기능없음.

예외처리는 숫자범위내에서만, 문자입력시 오류.

#include<iostream>
#include<time.h>

using namespace std;

/*
00		01		02		03		04
05		06		07		08		09
10		11		12		13		14
15		16		17		18		19
20		21		22		23		24

조건 
배열24의 자리가 시작지점
처음에 표시된 랜덤숫자들은자리이동시변경x
새게임 시작할때만 다시 랜덤으로 배치
해당숫자범위 위치 내에서만 이동가능할것
*/


int main() 
{
	srand(time(NULL));
	int input;


	int Number[25] = {}; // 배열 총25개
	for (int i = 0; i < 24; i++) // 배열 0~23까지 랜덤숫자자리
	{
		Number[i] = i + 1; // 1~24까지 출력되도록 1씩더해주기
	}

	Number[24] = INT_MAX; //배열의 최대값은 고정 24번(25번째자리) 
	int Star = 24; //0~24배열중 24번자리(숫자로는25번) 별고정확인.

	int iTemp, idx1, idx2;
	for (int i = 0; i < 100; i++)  // 일단 전체 셔플(위에 별자리고정이므로)
	{
		idx1 = rand() % 24;
		idx2 = rand() % 24;
		iTemp = Number[idx1];
		Number[idx1] = Number[idx2];
		Number[idx2] = iTemp;
	}

	while (true) 	//반복 실행
	{
		cout << "\t" << "[슬라이드 퍼즐 게임]" << endl;
		cout << endl;

		for (int i = 0; i < 5; i++)  //5*5로 출력하기 0 1 2 3 4
		{
			for (int j = 0; j < 5; j++) // 0 1 2 3 4
			{
				if (Number[i * 5 + j] == INT_MAX) //반복끝에 마지막자리 별확인
				{
					cout << "*\t"; //숫자사이 간격두기
				}
				else 
				{
					cout << Number[i * 5 + j] << "\t"; //숫자사이 간격두기
				}
			}
			cout << endl;
		}
		cout << endl;
		cout << "[1]상 [2]하 [3]좌 [4]우 [0]종료" << endl;
		cout << "입력 : ";  cin >> input;
		cout << endl;
		if (input > 4) // 예외처리 //문자입력시 예외처리는 못했음.
		{
			cout << "0~4 까지의 숫자중 입력해 주세요." << endl;
			system("pause");
		}

		if (input == 0) // 0입력 종료
		{
			break;
		}

		switch (input) // 입력과 동시에 별 위치 변경 - 여기 잘몰라서 인터넷참고
		{
		case 1: // 상
			if (Star > 4) //별의자리가 4보다 작으면 더이상 윗배열이없다.
			{
				Number[Star] = Number[Star - 5];
				Number[Star - 5] = INT_MAX; // INT_MAX 별자리의 값 변경
				Star -= 5; //위로 이동시 배열자리 -5
			}
			break;
		case 2: // 하
			if (Star < 20) //별의자리가 20보다크면 더이상 아래배열이없다.
			{
				Number[Star] = Number[Star + 5];
				Number[Star + 5] = INT_MAX; // INT_MAX 별자리의 값 변경
				Star += 5; //아래로 이동시 배열자리 +5
			}
			break;
		case 3: // 좌
			if (Star % 5 != 0)  //5로나눈나머지가 0이 아닐때실행
			{
				Number[Star] = Number[Star - 1];
				Number[Star - 1] = INT_MAX; // INT_MAX 별자리의 값 변경
				Star -= 1; //좌로이동시 배열자리가 -1
			}
			break;
		case 4: // 우
			if (Star % 5 != 4) //5로 나눈 나머지가 4가 아닐때실행
			{
				Number[Star] = Number[Star + 1];
				Number[Star + 1] = INT_MAX; // INT_MAX 별자리의 값 변경
				Star += 1; //우로이동시 배열자리가 +1
			}
			break;
		}
		{
			system("cls");//입력할때 모두지우고 새로작성
		}
		}
	cout << "게임종료" << endl;
	return 0;
}

'공부' 카테고리의 다른 글

스트링 활용 빙고  (0) 2022.10.26
숫자 빙고 게임  (0) 2022.10.24
아스키코드 참고자료  (0) 2022.10.20
C++ 하이 로우 세븐 게임 연습  (0) 2022.10.19
DAY6 과제2.숫자야구게임  (0) 2022.10.17

댓글