#include
#include
#include
#define sizeX 10
#define sizeY 10
#define sizeY 10
enum MINE { mine = 9 };
int answer[sizeX][sizeY] = { 0 };//답 배열을 0으로 초기화
char player[sizeX][sizeY];
int i, k, ii, kk, mineQuan, posX, posY, mineCnt = 0;
int guessX, guessY;
int revealedCell;
void spread(int x, int y);
char player[sizeX][sizeY];
int i, k, ii, kk, mineQuan, posX, posY, mineCnt = 0;
int guessX, guessY;
int revealedCell;
void spread(int x, int y);
int main() {
srand(time(NULL));
for (i = 0; i < sizeX; i++) { //플레이어에게 보여줄 배열 초기화
for (k = 0; k < sizeY; k++) {
player[i][k] = '\\';
}
}
while (1) {
printf("지뢰를 몇개 설치할까요? : ");
scanf("%d", &mineQuan);
getchar();
if (mineQuan > sizeX) {
printf("지뢰가 너무 많습니다. %d개 이하로 설치하세요\n", sizeX);
continue;
}
break;
}
printf("\n");
printf(" ");
for (i = 0; i < sizeX; i++) {
printf(" %d ", i);
}
printf("\n");
printf(" =======================================\n");
for (k = 0; k < sizeY; k++) {
player[i][k] = '\\';
}
}
while (1) {
printf("지뢰를 몇개 설치할까요? : ");
scanf("%d", &mineQuan);
getchar();
if (mineQuan > sizeX) {
printf("지뢰가 너무 많습니다. %d개 이하로 설치하세요\n", sizeX);
continue;
}
break;
}
printf("\n");
printf(" ");
for (i = 0; i < sizeX; i++) {
printf(" %d ", i);
}
printf("\n");
printf(" =======================================\n");
for (i = 0; i < sizeX; i++) {
printf("%d |", i);
for (k = 0; k < sizeY; k++) {
if (player[i][k] > 0 && player[i][k] <= 9) {
printf(" %d ", player[i][k]);
++revealedCell;
}
else if (player[i][k] == 0) {
printf(" . ");
++revealedCell;
}
else {
printf(" %c ", player[i][k]);
}
}
printf("\n");
}
printf("%d |", i);
for (k = 0; k < sizeY; k++) {
if (player[i][k] > 0 && player[i][k] <= 9) {
printf(" %d ", player[i][k]);
++revealedCell;
}
else if (player[i][k] == 0) {
printf(" . ");
++revealedCell;
}
else {
printf(" %c ", player[i][k]);
}
}
printf("\n");
}
for (i = 0; i < mineQuan; i++) { //답배열에 입력받은 갯수만큼 지뢰설치
posX = rand() % sizeX;
posY = rand() % sizeY;
if (answer[posX][posY] == mine) {//이미 지뢰가 숨겨져있을 때 새위치를 배정받음
i--;
continue;
}
answer[posX][posY] = mine;
}
posX = rand() % sizeX;
posY = rand() % sizeY;
if (answer[posX][posY] == mine) {//이미 지뢰가 숨겨져있을 때 새위치를 배정받음
i--;
continue;
}
answer[posX][posY] = mine;
}
for (i = 0; i < sizeX; i++) { //주위에 몇개의 지뢰가 있는지 알려주는 숫자힌트생성 // 1 1 1 0 0
for (k = 0; k < sizeY; k++) { // 1 * 2 1 1
if (answer[i][k] == mine) { // 1 2 3 * 1
for (ii = i - 1; ii < i + 2; ii++) { // 1 * 2 1 1
for (kk = k - 1; kk < k + 2; kk++) { // 1 1 1 0 0
if ((ii >= 0 && ii < sizeX) && (kk >= 0 && kk < sizeY)) { // 0 0 0 0 0
if (answer[ii][kk] != mine) {
answer[ii][kk] += 1;
}
}
}
}
}
}
}
for (k = 0; k < sizeY; k++) { // 1 * 2 1 1
if (answer[i][k] == mine) { // 1 2 3 * 1
for (ii = i - 1; ii < i + 2; ii++) { // 1 * 2 1 1
for (kk = k - 1; kk < k + 2; kk++) { // 1 1 1 0 0
if ((ii >= 0 && ii < sizeX) && (kk >= 0 && kk < sizeY)) { // 0 0 0 0 0
if (answer[ii][kk] != mine) {
answer[ii][kk] += 1;
}
}
}
}
}
}
}
while (1) { //게임 시작
revealedCell = 0;
printf("\n");
printf("X 축 좌표 입력 : "); //좌표값 입력, 인덱스는 0부터 시작함
scanf("%d", &guessX);
getchar();
printf("Y 축 좌표 입력 : ");
scanf("%d", &guessY);
getchar();
revealedCell = 0;
printf("\n");
printf("X 축 좌표 입력 : "); //좌표값 입력, 인덱스는 0부터 시작함
scanf("%d", &guessX);
getchar();
printf("Y 축 좌표 입력 : ");
scanf("%d", &guessY);
getchar();
if (guessX < 0 || guessX >= sizeX || guessY < 0 || guessY >= sizeY) {//입력 좌표가 범위내인지 확인
printf("좌표 크기를 다시 확인하세요\n");
continue;
}
printf("\n");
printf("좌표 크기를 다시 확인하세요\n");
continue;
}
printf("\n");
if (answer[guessX][guessY] == 9) { //내가 지뢰를 골랐을때 답을 보여줌
printf("실패! 지뢰를 골랐습니다.\n");
printf(" ");
for (i = 0; i < sizeX; i++) {
printf(" %d ", i);
}
printf("\n");
printf(" =======================================\n");
for (i = 0; i < sizeX; i++) {
printf(" %d ", i);
}
printf("\n");
printf(" =======================================\n");
for (i = 0; i < sizeX; i++) {
printf("%d |", i);
for (k = 0; k < sizeY; k++) {
if ((i == guessX) && (k == guessY)) { //내가고른자리에 인덱스가 왔을때
if (answer[i][k] == 9) {
printf("%4s", " <*>"); //내가 골랐던자리는 < >표시를 해서 강조
}
else {
printf("%4d", answer[i][k]);
}
}
else {
if (answer[i][k] == 9) {
printf("%4s", " *");
}
else if (answer[i][k] == 0) {
printf("%4s", " .");
}
else{
printf("%4d", answer[i][k]);
}
}
}
printf("\n");
}
return 0;
}
printf("%d |", i);
for (k = 0; k < sizeY; k++) {
if ((i == guessX) && (k == guessY)) { //내가고른자리에 인덱스가 왔을때
if (answer[i][k] == 9) {
printf("%4s", " <*>"); //내가 골랐던자리는 < >표시를 해서 강조
}
else {
printf("%4d", answer[i][k]);
}
}
else {
if (answer[i][k] == 9) {
printf("%4s", " *");
}
else if (answer[i][k] == 0) {
printf("%4s", " .");
}
else{
printf("%4d", answer[i][k]);
}
}
}
printf("\n");
}
return 0;
}
else {//지뢰가 아닌경우 고른 좌표 주위를 보여줌
spread(guessX, guessY);
printf(" ");
for (i = 0; i < sizeX; i++) {
printf(" %d ", i);
}
printf("\n");
printf(" =======================================\n");
for (i = 0; i < sizeX; i++) {
printf("%d |", i);
for (k = 0; k < sizeY; k++) {
if (player[i][k] > 0 && player[i][k] <= 9) {
printf(" %d ", player[i][k]);
++revealedCell;
}
else if (player[i][k] == 0) {
printf(" . ");
++revealedCell;
}
else {
printf(" %c ", player[i][k]);
}
}
printf("\n");
}
}
printf("\n");
spread(guessX, guessY);
printf(" ");
for (i = 0; i < sizeX; i++) {
printf(" %d ", i);
}
printf("\n");
printf(" =======================================\n");
for (i = 0; i < sizeX; i++) {
printf("%d |", i);
for (k = 0; k < sizeY; k++) {
if (player[i][k] > 0 && player[i][k] <= 9) {
printf(" %d ", player[i][k]);
++revealedCell;
}
else if (player[i][k] == 0) {
printf(" . ");
++revealedCell;
}
else {
printf(" %c ", player[i][k]);
}
}
printf("\n");
}
}
printf("\n");
if (sizeX*sizeY - mineQuan == revealedCell) {
printf("지뢰를 모두 찾았습니다.\n\n");
return 0;
}
}//end of while
printf("지뢰를 모두 찾았습니다.\n\n");
return 0;
}
}//end of while
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void spread(int x, int y) {
int i, k;
if ((x< 0 || x >= sizeX) || (y < 0 || y >= sizeY)) {
return;
}
if (player[x][y] == 0) {
return;
}
if (answer[x][y] == 0) {//0일때
for (i = x - 1; i< x + 2; i++) {
for (k = y - 1; k < y + 2; k++) {
if ((i >= 0 && i < sizeX) && (k >= 0 && k < sizeY)) {//제자리에서는 다시 재귀함수를 호출하지 않고, 그 이외에는 8방향으로 재귀함수호출을 통해 빈칸탐색을 계속함
if (i == x&&k == y) {
player[x][y] = answer[x][y];
continue;
}
else {
spread(i, k);
}
}
}
}
}
else {//0이 아닌 숫자를 골랐을때는 하나만 숫자를 플레이어 배열에 옮겨줌
player[x][y] = answer[x][y];
return;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void spread(int x, int y) {
int i, k;
if ((x< 0 || x >= sizeX) || (y < 0 || y >= sizeY)) {
return;
}
if (player[x][y] == 0) {
return;
}
if (answer[x][y] == 0) {//0일때
for (i = x - 1; i< x + 2; i++) {
for (k = y - 1; k < y + 2; k++) {
if ((i >= 0 && i < sizeX) && (k >= 0 && k < sizeY)) {//제자리에서는 다시 재귀함수를 호출하지 않고, 그 이외에는 8방향으로 재귀함수호출을 통해 빈칸탐색을 계속함
if (i == x&&k == y) {
player[x][y] = answer[x][y];
continue;
}
else {
spread(i, k);
}
}
}
}
}
else {//0이 아닌 숫자를 골랐을때는 하나만 숫자를 플레이어 배열에 옮겨줌
player[x][y] = answer[x][y];
return;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
예전버전은 지뢰가 아닌곳을 고르면 3x3범위를 보여주면서 지뢰를 모두 찾아야했었는데
이번에는 재귀함수를 사용하여 무려 실제지뢰찾기같이 빈칸을 만나면 부왘하고 맵이 밝아집니다
부왘!!
///////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
번외) 40*40 지뢰 500개짜리 지뢰찾기
겜만드면서 배우는게 젤 좋은방법이 아닐까 생각해요
만들면서 잼잇엇져?