숫자 퍼즐 게임(클래스 + 2차원 배열 셔플)

//헤더파일
#pragma once
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;
class puzzleGame
{
private:
//이곳에서 변수를 선언한다.
int _num[5][5];
int _numS[25];
public:
//이곳에서 함수를 만든다.
//출력 함수
void board();
puzzleGame();
~puzzleGame();
};
//cpp 파일
#include "puzzleGame.h"
/*< 숫자퍼즐>
1. 5 5 퍼즐 배열 만들기
2. 셔플 (0 숫자가 젤 마지막에 배치 되도록)
3. 숫자 움직이게 하기, 2,4,8,6 숫자패드로 방향키 처리
*/
//2.숫자 판 만들기
void puzzleGame::board()
{
system("cls");
for (int j = 0; j < 5; j++)
{
for (int i = 0; i < 5; i++)
{
//cout << "numS[" << j * 5 + i << "] : " << _numS[j * 5 + i] << endl;
//cout << "num[" << j << "][" << i << "] : " << _num[j][i] << endl;
cout << _num[j][i] << "\t";
}
cout << "\n\n\n" << endl;
}
};
puzzleGame::puzzleGame()
{
srand(time(NULL));
//이곳에서 게임을 만든다
// 0 1 2 3 4 ?
// 5 6 7 8 9 ?
//1.숫자 배열 초기화 하기
for (int j = 0; j < 5; j++)
{
for (int i = 0; i < 5; i++)
{
_num[j][i] = i + j * 5;
_numS[(j * 5) + i] = _num[j][i]; //셔플용 배열 완성
}
}
//셔플
for (int i = 0; i < 1000; i++) //전체 셔플 방법은?
{
int index1 = rand() % 25;
int index2 = rand() % 25;
int temp = _numS[index1];
_numS[index1] = _numS[index2];
_numS[index2] = temp;
}
//0이 들어 있는 배열 찾기
int tempN = 0;
for (int i = 0; i < 25; i++)
{
if (_numS[i] == 0)
{
tempN = i;
break;
}
}
//cout << tempN << endl;
//0이 들어 있는 배열을 24번째 배열과 바꾸기
int temp = _numS[24];
_numS[24] = _numS[tempN];
_numS[tempN] = temp;
//다시 원래 배열에 대입
for (int j = 0; j < 5; j++)
{
for (int i = 0; i < 5; i++)
{
//_num[j][i] = i + j * 5;
_num[j][i] = _numS[(j * 5) + i];
}
}
//숫자 움직이게 해라
int x = 4;
int y = 4;
int input;
while (true)
{
board();
input = _getch();
//cin >> input;
//system("pause");
if (input == 50 || input == 56 || input == 52 || input == 54)
{
switch (input)
{
case 56://위로
tempN = _num[y][x];
_num[y][x] = _num[y - 1][x];
_num[y - 1][x] = tempN;
y--;
if (y < 0)
{
//cout << "이동할 수 없습니다." << endl;
tempN = _num[y][x];
_num[y][x] = _num[y + 1][x];
_num[y + 1][x] = tempN;
y++;
continue;
}
break;
case 50://아래로
tempN = _num[y][x];
_num[y][x] = _num[y + 1][x];
_num[y + 1][x] = tempN;
y++;
if (y > 4)
{
//cout << "이동할 수 없습니다." << endl;
tempN = _num[y][x];
_num[y][x] = _num[y - 1][x];
_num[y - 1][x] = tempN;
y--;
continue;
}
break;
case 52://좌로
tempN = _num[y][x];
_num[y][x] = _num[y][x - 1];
_num[y][x - 1] = tempN;
x--;
if (x < 0)
{
//cout << "이동할 수 없습니다." << endl;
tempN = _num[y][x];
_num[y][x] = _num[y][x + 1];
_num[y][x + 1] = tempN;
x++;
continue;
}
break;
case 54://우로
tempN = _num[y][x];
_num[y][x] = _num[y][x + 1];
_num[y][x + 1] = tempN;
x++;
if (x > 4)
{
//cout << "이동할 수 없습니다." << endl;
tempN = _num[y][x];
_num[y][x] = _num[y][x - 1];
_num[y][x - 1] = tempN;
x--;
continue;
}
break;
}
}
else continue;
}
//cout << "퍼즐 게임 완성" << endl;
}
puzzleGame::~puzzleGame()
{
}
댓글
댓글 쓰기