뀨읭
접속 : 5240   Lv. 60

Category

Profile

Counter

  • 오늘 : 3933 명
  • 전체 : 2172395 명
  • Mypi Ver. 0.3.1 β
[그냥] 모바일개발자과정-국비지원] C로 지뢰찾기 만들어보기 (완성) (4) 2017/05/11 PM 01:28

#include
#include
#include

#define sizeX 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);
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 (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");
 }
 for (i = 0; i < mineQuan; i++) { //답배열에 입력받은 갯수만큼 지뢰설치
  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;
       }
      }
     }
    }
   }
  }
 }
 while (1) { //게임 시작
  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");

  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);
    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");
  if (sizeX*sizeY - mineQuan == revealedCell) {
   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;
 }
}
 
 
///////////////////////////////////////////////////////////////////////////////////////////////
예전버전은 지뢰가 아닌곳을 고르면 3x3범위를 보여주면서 지뢰를 모두 찾아야했었는데
 
이번에는 재귀함수를 사용하여 무려 실제지뢰찾기같이 빈칸을 만나면 부왘하고 맵이 밝아집니다
 
부왘!!
 
///////////////////////////////////////////////////////////////////////////////////////////////
 

mine1.jpg

 

mine2.jpg

 

 

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

번외) 40*40 지뢰 500개짜리 지뢰찾기

 

hugemine.jpg

 

신고

 

리턴제로    친구신청

개인적으로 프로그래밍은
겜만드면서 배우는게 젤 좋은방법이 아닐까 생각해요
만들면서 잼잇엇져?

뀨읭    친구신청

넴ㅋㅋ 지금 초대형 지뢰찾기 해보는중ㅋㅋㅋ

万能ネコピ~♬    친구신청

코딩한줄당 주석 하나씩 안 넣으셨네요
-100점

뀨읭    친구신청

8ㅅ8
X