#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 |