#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct Block {
char c;
int isFlagged;
int isQuestion;
int isClicked;
int value;
};
struct GameConfig {
int rows;
int cols;
int mineCount;
int level;
};
int T=0;
int mine=0;
int con=0;
enum ActionType {
LEFT_CLICK = 1,
RIGHT_CLICK_FLAG = 2,
RIGHT_CLICK_QUESTION = 3,
RIGHT_CLICK_UNFLAG = 4,
DOUBLE_CLICK = 9
};
void initializeBoard(struct Block** board, int rows, int cols) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
board[i][j].c='.';
board[i][j].isFlagged = 0;
board[i][j].isQuestion = 0;
board[i][j].isClicked = 0;
board[i][j].value = 0;
}
}
}
void setMines(struct Block** board, int rows, int cols) {
for(int i=0;i<rows;i++){
char array[100];
scanf("%s",&array);
for(int j=0;j<cols;j++){
board[i][j].c=array[j];
}
}
}
void printBoard(struct Block** board, int rows, int cols) {
int i, j;
int ttt=0;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if(board[i][j].c!='*'&&!board[i][j].isClicked){
ttt++;
}
}
}
if(ttt==0)T=2;
con++;
if(T==0){
printf("Game in progress\n");
}
else if(T==1){
printf("Hit mine, you lose\n");
}
else {
printf("Game over, you win\n");
}
printf("%d %d %d\n",con,mine,T);
printf("\n");
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if(board[i][j].isClicked){
printf("%d",board[i][j].value);
}
else if(board[i][j].isFlagged){
printf("!");
}
else if(board[i][j].isQuestion){
printf("?");
}
else{
if(T==0)printf(".");
else printf("%c",board[i][j].c);
}
}
printf("\n");
}
}
void handleAction(struct Block** board, int rows, int cols, int actionType, int row, int col) {
if (row < 0 || row >=rows || col < 0 || col >=cols&&board[row][col].isClicked) {
return;
}
switch (actionType) {
case LEFT_CLICK:
{
if(board[row][col].isFlagged||board[row][col].isQuestion||board[row][col].isClicked){
return ;
}
int x=row,y=col;
int i,j;
if(board[x][y].c=='*'){
T=1;return ;
}
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++){
if(i>=0&&i<rows && j>=0 &&j<cols && board[i][j].c=='*'){
board[row][col].value++;
}
}
}
board[row][col].isClicked=1;
if(board[row][col].value==0){
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++){
handleAction(board,rows,cols,1,i,j);
}
}
}
break;
}
case RIGHT_CLICK_FLAG:
if (board[row][col].isClicked) {
return ;
}
else if(board[row][col].isFlagged){
;
}
else{
mine--;
board[row][col].isFlagged=1;
board[row][col].isQuestion=0;
}
break;
case RIGHT_CLICK_QUESTION:
if (board[row][col].isClicked) {
return ;
}
else if(board[row][col].isQuestion){
;
}
else{
mine++;
board[row][col].isFlagged=0;
board[row][col].isQuestion=1;
}
break;
case RIGHT_CLICK_UNFLAG:
if (board[row][col].isClicked) {
return ;
}
else if(board[row][col].isFlagged){
board[row][col].isFlagged=0;mine++;
}
else if(board[row][col].isQuestion){
board[row][col].isQuestion=0;
}
break;
case DOUBLE_CLICK:
{
if(!board[row][col].isClicked){
return ;
}
int x=row,y=col;
int i,j;
int sum=0;
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++){
if(i>=0&&i<rows && j>=0 &&j<cols&&board[i][j].isFlagged){
sum++;
}
}
}
if(board[row][col].value==sum){
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++){
if(i>=0&&i<rows && j>=0 &&j<cols&&!board[i][j].isClicked){
handleAction(board,rows,cols,1,i,j);
}
}
}
}
break;
}
}
}
int main() {
struct GameConfig config;
scanf("%d", &(config.level));
if (config.level == 4) {
scanf("%d %d %d", &(config.rows), &(config.cols), &(config.mineCount));
} else {
switch (config.level) {
case 1:
config.rows = 9;
config.cols = 9;
config.mineCount = 10;
break;
case 2:
config.rows = 16;
config.cols = 16;
config.mineCount = 40;
break;
case 3:
config.rows = 16;
config.cols = 30;
config.mineCount = 99;
break;
}
}
mine=config.mineCount;
struct Block** board = (struct Block**)malloc(config.rows * sizeof(struct Block*));
for (int i = 0; i < config.rows; i++) {
board[i] = (struct Block*)malloc(config.cols * sizeof(struct Block));
}
initializeBoard(board, config.rows, config.cols);
setMines(board, config.rows, config.cols);
while(1){
int actionType,row,col;
scanf("%d %d %d",&actionType,&row,&col);
row--;col--;
handleAction(board,config.rows, config.cols,actionType,row,col);
printBoard(board, config.rows, config.cols);
if(T!=0)break;
}
for (int i = 0; i < config.rows; i++) {
free(board[i]);
}
free(board);
return 0;
}