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

// scanfで文字を入れると永久ループする

#define MAX_MINE   3    // 地雷の数
#define MAX_ROW    3    // 配置行数
#define MAX_COL    3    // 配置列数
#define MAX_PLAY   6    // 遊戯回数

typedef struct {
    int x;
    int y;
} Point;

// 位置衝突チェック
int colision(Point a, Point b) 
{
    return (a.x == b.x) && (a.y == b.y);
}

int main() 
{
    Point mines[MAX_MINE] = {0};
    Point guess[MAX_PLAY] = {0};
    unsigned char dispmap[MAX_COL][MAX_ROW] = {0};

    int i = 0, j = 0, ng = 0, playcount = 0;

    srand(time(NULL));

    // 地雷設置
    for (i = 0; i < MAX_MINE; i++) {
        do {
            // ※乱数を毎回生成して衝突しなくなるまでループ。本当は良くないが行列数が少ないので。
            ng = 0;
            mines[i].x = rand() % MAX_COL;
            mines[i].y = rand() % MAX_ROW;
            // 配置衝突チェック
            for (j = 0; j < i; j++) {
                if (colision(mines[i], mines[j])) {
                    ng = 1;
                    break;
                }
            }
        } while (ng);
    }

    // 地雷表示
//  for (i = 0; i < MAX_MINE; i++) {
//      printf("mine(%d, %d) ", mines[i].x, mines[i].y);
//  }
//  printf("\n");

    // ゲーム開始
    while (playcount < MAX_PLAY) {
        printf("X: ");
        scanf("%d", &guess[playcount].x);
        printf("Y: ");
        scanf("%d", &guess[playcount].y);

        // 入力範囲チェック
        if ((guess[playcount].x < 0) || (guess[playcount].x >= MAX_COL) ||
            (guess[playcount].y < 0) || (guess[playcount].y >= MAX_ROW)) {
            printf("Please input the numerical value in the range.\n");
            continue;
        }

        // 入力済みチェック
        ng = 0;
        for (i = 0; i < playcount; i++) {
            if (colision(guess[playcount], guess[i])) {
                ng = 1;
                break;
            }
        }
        if (ng) {
            printf("It has been already input.\n");
            continue;
        }

        // 地雷衝突チェック
        for (i = 0; i < MAX_MINE; i++) {
            if (colision(guess[playcount], mines[i])) {
                printf("Wham!\n");
                exit(0); // 終了
            }
        }
        printf("You are safe.\n");

        // 行列表示
        dispmap[guess[playcount].x][guess[playcount].y] = 1;
        for (i = 0; i < MAX_ROW; i++) {
            for (j = 0; j < MAX_COL; j++) {
                printf("%d ", dispmap[j][i]);
            }
            printf("\n");
        }
        
        // 遊戯回数
        playcount++;
    }

    // ゲーム勝利
    printf("You Win!\n");

    exit(0);
}