본문 바로가기

코딩

슬라이드 게임

함수를 사용해서 좀 더 효율적으로 바꿀 수 있을 것 같은데... 감이 안 잡힌다...ㅠㅠ

#include<iostream>
#include<time.h>
#include<string>
using namespace std;

int temp;
int numb[25];

void SHUFFLE()
{
	for (int i = 0; i < 100; i++)
	{
		int num1 = rand() % 25;
		int num2 = rand() % 25;

		if (numb[num1] == 0)
		{
			temp = numb[24];
			numb[24] = numb[num1];
			numb[num1] = temp;
		}
		else if (numb[num2] == 0)
		{
			temp = numb[24];
			numb[24] = numb[num2];
			numb[num2] = temp;
		}
		else
		{
			temp = numb[num1];
			numb[num1] = numb[num2];
			numb[num2] = temp;
		}
	}
}

int main() {
	srand(time(NULL));
	int count = 0, input, x = 4, y = 4;
	

	for (int i = 0; i < 25; i++)
	{
		numb[i] = i;
	}

	SHUFFLE();	

	while (true)
	{
		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				cout << numb[count++] << "\t";
			}
			cout << endl << endl;
		}

		cout << "2.아래 / 4.왼쪽 / 6.오른쪽 / 8.위" << endl << "선택 : ";
		cin >> input;

		switch (input)
		{
		case 2:
			if (x < 4)
			{
				temp = numb[x * 5 + y];
				numb[x * 5 + y] = numb[(x + 1) * 5 + y];
				numb[(x + 1) * 5 + y] = temp;
				x++;
			}
			break;
		case 4:
			if (y > 0)
			{
				temp = numb[x * 5 + y];
				numb[x * 5 + y] = numb[x * 5 + y - 1];
				numb[x * 5 + y - 1] = temp;
				y--;
			}
			break;
		case 6:
			if (y < 4)
			{
				temp = numb[x * 5 + y];
				numb[x * 5 + y] = numb[x * 5 + y + 1];
				numb[x * 5 + y + 1] = temp;
				y++;
			}
			break;
		case 8:
			if (x > 0)
			{
				temp = numb[x * 5 + y];
				numb[x * 5 + y] = numb[(x - 1) * 5 + y];
				numb[(x - 1) * 5 + y] = temp;
				x--;
			}
			break;
		default:
			cout << "다시 입력해주세요." << endl;
			break;
		}
		cout << "==================================================" << endl;
		count = 0;
	}
}

2.0 ver Patch Note

좌표 임시 저장할 구조체 추가

스왑, 셔플 함수 재정립

2차원 배열 위치 값을 1차원 배열 위치 값으로 변환시켜줄 함수 추가

가독성 향상을 위해 enum 추가

배열 출력 부분 이중 for문에서 if문으로 수정

위, 아래, 좌, 우 움직임 검출 코드 switch문에서 if문으로 수정

#include<iostream>
#include<time.h>
#include<string>
using namespace std;

//전역변수로 선언한 1차원배열
int numb[25];

//좌표를 담아둘 구조체
struct COORD
{
	int x;
	int y;
};

//스왑함수
void Swap(int num1,int num2)
{
	int temp = numb[num1];
	numb[num1] = numb[num2];
	numb[num2] = temp;
}

//셔플함수
void Shuffle()
{
	for (int i = 0; i < 1000; i++)
	{
		int num1 = rand() % 24;
		int num2 = rand() % 24;
		Swap(num1, num2);
	}	
}

//2차원배열위치를 1차원배열위치로 변환해줄 함수
int TransPos(COORD pos)
{
	return pos.y * 5 + pos.x;
}

//가독성을 위한 enum선언
enum Dir
{
	DOWN = 2,
	LEFT = 4,
	RIGHT = 6,
	UP = 8
};

int main() {
	srand(time(NULL));
	int input;
	COORD zeroPos;
	zeroPos.x = 4;
	zeroPos.y = 4;
	
	//배열 초기화
	for (int i = 0; i < 25; i++)
	{
		numb[i] = i;
	}

	Swap(0, 24); //0과 24의 위치를 바꿔준다.
	Shuffle(); //셔플

	while (true)
	{
		//출력
		for (int i = 0; i < 25; i++)
		{
			cout << numb[i] << "\t";
			if (i % 5 == 4)
			{
				cout << endl;
			}
		}

		cout << "2.아래 / 4.왼쪽 / 6.오른쪽 / 8.위" << endl << "선택 : ";
		cin >> input;

		//움직일 조건확인
		if (input == DOWN && zeroPos.y != 4)
		{
			COORD down;
			down.x = zeroPos.x;
			down.y = zeroPos.y + 1;
			Swap(TransPos(down), TransPos(zeroPos));
			zeroPos = down;
		}
		else if (input == LEFT && zeroPos.x != 0)
		{
			COORD left;
			left.x = zeroPos.x - 1;
			left.y = zeroPos.y;
			Swap(TransPos(left), TransPos(zeroPos));
			zeroPos = left;
		}
		else if (input == RIGHT && zeroPos.x != 4)
		{
			COORD right;
			right.x = zeroPos.x + 1;
			right.y = zeroPos.y;
			Swap(TransPos(right), TransPos(zeroPos));
			zeroPos = right;
		}
		else if (input == UP && zeroPos.y != 0)
		{
			COORD up;
			up.x = zeroPos.x;
			up.y = zeroPos.y - 1;
			Swap(TransPos(up), TransPos(zeroPos));
			zeroPos = up;
		}
		else
		{
			cout << "잘못 입력했습니다." << endl;
			continue;
		}
	}
}

'코딩' 카테고리의 다른 글

빙고 ver2(문자열)  (2) 2022.10.26
빙고 게임  (0) 2022.10.25
Low High Seven 게임  (0) 2022.10.19
월남뽕 게임  (2) 2022.10.18
별찍기 / 숫자야구게임  (0) 2022.10.18