본문 바로가기
프로그래머의 길/C & C++

지뢰찾기

by 제이콥케이 2007. 6. 28.
반응형

#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>

int x, y, boom;
int **o_board, **user_board, **check_board;

void board_print(int **board, int flag);
int board_open(int px, int py, int flag);
int check_mine();

int main()
{
 int i, j, cnt;
 int ran_x, ran_y;
 int u_x, u_y, u_select;
 
 srand(time(NULL));

 printf("지뢰찾기 사이즈 입력(가로, 세로) [예) 10 6] : ");
 scanf("%d%d", &y, &x);
 printf("지뢰의 개수를 입력(%d 이하) : ", x*y);
 scanf("%d", &boom);

 o_board = (int **)calloc(x+2, sizeof(int *));
 user_board = (int **)calloc(x+2, sizeof(int *));
 check_board = (int **)calloc(x+2, sizeof(int *));

 for(i=0; i<x+2; i++)
 {
  o_board[i] = (int *)calloc(y+2, sizeof(int));
  user_board[i] = (int *)calloc(y+2, sizeof(int));
  check_board[i] = (int *)calloc(y+2, sizeof(int));
 }

 cnt = boom;
 while(cnt != 0)
 {
  ran_x = rand()%x+1;
  ran_y = rand()%y+1;
 // printf("%d, %d   ", ran_x, ran_y);
  if(o_board[ran_x][ran_y] == 9)
   continue;
 
  o_board[ran_x][ran_y] = 9;
  cnt--;
 }

 for(i=1; i<=x; i++)
 {  
  for(j=1; j<=y; j++)
  {
   cnt=0;
   if(o_board[i][j] != 9)
   {
    if(o_board[i - 1][j - 1] == 9) cnt++;
    if(o_board[i - 1][j] == 9) cnt++;
    if(o_board[i - 1][j + 1] == 9) cnt++;
    if(o_board[i][j - 1] == 9) cnt++;
    if(o_board[i][j + 1] == 9) cnt++;
    if(o_board[i + 1][j - 1] == 9) cnt++;
    if(o_board[i + 1][j] == 9) cnt++;
    if(o_board[i + 1][j + 1] == 9) cnt++;

    o_board[i][j] = cnt;
   }
  }
 }

 while(1)
 {
  system("cls");
  board_print(user_board, 0);

  fflush(stdin);
  printf("\n좌표 입력 (가로, 세로) : ");
  scanf("%d%d", &u_y, &u_x);
  printf("열기 1, 지뢰표시 2 : ");
  scanf("%d", &u_select);
 
  board_open(u_x, u_y, u_select);
 
  if(check_mine() == 0)
   break;
 }

 system("cls");
 board_print(o_board, 0);

 printf("\n지뢰를 다 찾았습니다.\n");

 return 0;
}

int board_open(int px, int py, int flag)
{
 if((o_board[px][py]==9) && (flag==1))
 {
  printf("%d %d 지뢰를 밟았습니다. 정답은 아래와 같습니다.\n", px, py);
  board_print(o_board, 1);  
  exit(1);
 }

 check_board[px][py] = 1;
 
 if(flag==2)
 {
  user_board[px][py] = 9;
  return 0;
 }
 
 user_board[px][py] = o_board[px][py];


 if(o_board[px][py] == 0)
 {
  if((px-1)>0 && (py-1)>0 && check_board[px-1][py-1]!=1)
   board_open(px-1, py-1, 1);
  if((px-1)>0 && check_board[px-1][py]!=1)
   board_open(px-1, py, 1);
  if((px-1)>0 && (py+1)<=y && check_board[px-1][py+1]!=1)
   board_open(px-1, py+1, 1);
  if((py-1)>0 && check_board[px][py-1]!=1)
   board_open(px, py-1, 1);
  if((py+1)<=y && check_board[px][py+1]!=1)
   board_open(px, py+1, 1);
  if((px+1)<=x && (py-1)>0 && check_board[px+1][py-1]!=1)
   board_open(px+1, py-1, 1);
  if((px+1)<=x && check_board[px+1][py]!=1)
   board_open(px+1, py, 1);
  if((px+1)<=x && (py+1)<=y && check_board[px+1][py+1]!=1)
   board_open(px+1, py+1, 1);
 }
 
 return 0;
}

int check_mine()
{
 int i, j;

 for(i=1; i<=x; i++)
 {
  for(j=1; j<=y; j++)
  {
   if(o_board[i][j] != user_board[i][j])
    return 1;
  }
 }
 return 0;
}

void board_print(int **board, int flag)
{
 int i, j;  


 printf("\n지뢰개수 : %d\n   ", boom);
 for(i=1; i<=y; i++)
 {
  printf("%3d ", i);  
 }
 printf("\n");

 printf("  ┌");
 for(i=1; i<y; i++)
 {
  printf("─┬");  
 }
 printf("─┐\n");


 for(i=1; i<=x; i++)
 {
  printf("%2d", i);
  for(j=1; j<=y; j++)
  { 
   if(board[i][j] == 0 && (check_board[i][j] == 0 && flag == 0))
    printf("│  ");
   else
   {
    if(board[i][j] == 0)
     printf("│ -");
    else if(board[i][j] == 9)
     printf("│ *");
    else
     printf("│ %d", board[i][j]);
   }
  }
  printf("│\n");

  if(i!=x)
  {
   printf("  ├");
   for(j=1; j<y; j++)
   {  
    printf("─┼");
   }
   printf("─┤\n");
  }
 }

 printf("  └");
 for(i=1; i<y; i++)
 {
  printf("─┴");  
 }
 printf("─┘\n");
}

반응형

'프로그래머의 길 > C & C++' 카테고리의 다른 글

TranslateMessage()  (0) 2008.04.15
assert()  (0) 2008.04.15
라이프 게임  (0) 2007.06.28
마방진 소스  (0) 2007.06.28
오늘의 날짜를 리턴해 주는 함수 <time.h>  (0) 2007.04.12