|
@ -15,6 +15,10 @@ |
|
|
#define NORMAL 5 |
|
|
#define NORMAL 5 |
|
|
#define HARD 3 |
|
|
#define HARD 3 |
|
|
#define OFFSET_NUM_CHARS 48 |
|
|
#define OFFSET_NUM_CHARS 48 |
|
|
|
|
|
#define OPEN_TILE 0 |
|
|
|
|
|
#define FLAG_TILE 1 |
|
|
|
|
|
#define QUIT_GAME 2 |
|
|
|
|
|
#define ERROR -1 |
|
|
#pragma endregion |
|
|
#pragma endregion |
|
|
|
|
|
|
|
|
#pragma region Funktion_heads |
|
|
#pragma region Funktion_heads |
|
@ -91,15 +95,18 @@ void game_minesweeper(){ |
|
|
getchar(); |
|
|
getchar(); |
|
|
if(x < board.width && x > -1 && y < board.height && y > -1){ |
|
|
if(x < board.width && x > -1 && y < board.height && y > -1){ |
|
|
x = x + y * board.width; |
|
|
x = x + y * board.width; |
|
|
if(t == 0){ |
|
|
|
|
|
|
|
|
if(t == OPEN_TILE){ |
|
|
int bombs = open_tile(&board, x); |
|
|
int bombs = open_tile(&board, x); |
|
|
if(bombs == -1){printf("You Lose!"); getchar(); break;} |
|
|
|
|
|
else if(bombs == 0){open_empty_space(&board, x, 0);} |
|
|
|
|
|
|
|
|
if(bombs == ERROR){printf("You Lose!"); getchar(); break;} |
|
|
|
|
|
else if(bombs == 0){ |
|
|
|
|
|
open_empty_space(&board, x, 0); |
|
|
|
|
|
for(int i = 0; i < board.width * board.height; i++){board.marked[i] = ERROR;} |
|
|
|
|
|
} |
|
|
else{board.tiles[x] = bombs + OFFSET_NUM_CHARS;} |
|
|
else{board.tiles[x] = bombs + OFFSET_NUM_CHARS;} |
|
|
} |
|
|
} |
|
|
if(t == 1){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} |
|
|
|
|
|
|
|
|
if(t == FLAG_TILE){board.tiles[x] = board.tiles[x] == FLAG ? BLOCK : board.tiles[x] == BLOCK ? FLAG : board.tiles[x];} |
|
|
} |
|
|
} |
|
|
if (t == 2){break;} |
|
|
|
|
|
|
|
|
if (t == QUIT_GAME){break;} |
|
|
|
|
|
|
|
|
int test = 1; |
|
|
int test = 1; |
|
|
for (int i = 0; i < board.height * board.width; i++){if(board.tiles[i] == BLOCK){test = 0; break;}} |
|
|
for (int i = 0; i < board.height * board.width; i++){if(board.tiles[i] == BLOCK){test = 0; break;}} |
|
@ -168,10 +175,10 @@ Minesweeper_Board initialize_minesweeper(){ |
|
|
board.tiles = (int*) malloc(width * height * sizeof(int)); |
|
|
board.tiles = (int*) malloc(width * height * sizeof(int)); |
|
|
for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} |
|
|
for(int i = 0; i < width * height; i++){board.tiles[i] = BLOCK;} |
|
|
board.marked = (int*) malloc(width * height * sizeof(int)); |
|
|
board.marked = (int*) malloc(width * height * sizeof(int)); |
|
|
for(int i = 0; i < width * height; i++){board.marked[i] = -1;} |
|
|
|
|
|
|
|
|
for(int i = 0; i < width * height; i++){board.marked[i] = ERROR;} |
|
|
board.num_bombs = num_bombs; |
|
|
board.num_bombs = num_bombs; |
|
|
board.bombs = (int*) malloc(board.num_bombs * sizeof(int)); |
|
|
board.bombs = (int*) malloc(board.num_bombs * sizeof(int)); |
|
|
for(int i = 0; i < num_bombs; i++){board.bombs[i] = -1;} |
|
|
|
|
|
|
|
|
for(int i = 0; i < num_bombs; i++){board.bombs[i] = ERROR;} |
|
|
return board; |
|
|
return board; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -222,7 +229,7 @@ void draw_minesweeper(Minesweeper_Board *board){ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int open_tile(Minesweeper_Board *board, int tile){ |
|
|
int open_tile(Minesweeper_Board *board, int tile){ |
|
|
if(array_contains_value(board->bombs, tile, board->num_bombs)){return -1;} |
|
|
|
|
|
|
|
|
if(array_contains_value(board->bombs, tile, board->num_bombs)){return ERROR;} |
|
|
return number_of_bombs(board, tile); |
|
|
return number_of_bombs(board, tile); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -230,7 +237,7 @@ int number_of_bombs(Minesweeper_Board *board, int tile){ |
|
|
int sum = 0; |
|
|
int sum = 0; |
|
|
for(int i = 0; i < 8; i++){ |
|
|
for(int i = 0; i < 8; i++){ |
|
|
int check_tile = is_Valid_tile(board, tile, i); |
|
|
int check_tile = is_Valid_tile(board, tile, i); |
|
|
if(check_tile == -1){continue;} |
|
|
|
|
|
|
|
|
if(check_tile == ERROR){continue;} |
|
|
if(array_contains_value(board->bombs, check_tile, board->num_bombs)){sum++;} |
|
|
if(array_contains_value(board->bombs, check_tile, board->num_bombs)){sum++;} |
|
|
} |
|
|
} |
|
|
return sum; |
|
|
return sum; |
|
@ -241,7 +248,7 @@ void open_empty_space(Minesweeper_Board *board, int tile, int index){ |
|
|
board->marked[index] = tile; |
|
|
board->marked[index] = tile; |
|
|
for(int i = 0; i < 8; i++){ |
|
|
for(int i = 0; i < 8; i++){ |
|
|
int check_tile = is_Valid_tile(board, tile, i); |
|
|
int check_tile = is_Valid_tile(board, tile, i); |
|
|
if(check_tile == -1){continue;} |
|
|
|
|
|
|
|
|
if(check_tile == ERROR){continue;} |
|
|
int sum = open_tile(board, check_tile); |
|
|
int sum = open_tile(board, check_tile); |
|
|
if(sum != 0){board->tiles[check_tile] = sum + OFFSET_NUM_CHARS;} |
|
|
if(sum != 0){board->tiles[check_tile] = sum + OFFSET_NUM_CHARS;} |
|
|
else if(!array_contains_value(board->marked, check_tile, board->height * board->width)){open_empty_space(board, check_tile, index + 1);} |
|
|
else if(!array_contains_value(board->marked, check_tile, board->height * board->width)){open_empty_space(board, check_tile, index + 1);} |
|
@ -252,13 +259,13 @@ void open_empty_space(Minesweeper_Board *board, int tile, int index){ |
|
|
int is_Valid_tile(Minesweeper_Board *board, int tile, int direction){ |
|
|
int is_Valid_tile(Minesweeper_Board *board, int tile, int direction){ |
|
|
int check_tile = tile; |
|
|
int check_tile = tile; |
|
|
|
|
|
|
|
|
if(direction < 3){if(tile % board->width == 0){return -1;} |
|
|
|
|
|
|
|
|
if(direction < 3){if(tile % board->width == 0){return ERROR;} |
|
|
else{check_tile -= 1;}} |
|
|
else{check_tile -= 1;}} |
|
|
if(direction > 4){if(tile % board->width + 1 == board->width){return -1;} |
|
|
|
|
|
|
|
|
if(direction > 4){if(tile % board->width + 1 == board->width){return ERROR;} |
|
|
else{check_tile += 1;}} |
|
|
else{check_tile += 1;}} |
|
|
if(direction % 3 == 0){if(tile / board->width == 0){return -1;} |
|
|
|
|
|
|
|
|
if(direction % 3 == 0){if(tile / board->width == 0){return ERROR;} |
|
|
else{check_tile -= board->width;}} |
|
|
else{check_tile -= board->width;}} |
|
|
if(direction % 3 == 1){if(tile / board->width + 1 == height){return -1;} |
|
|
|
|
|
|
|
|
if(direction % 3 == 1){if(tile / board->width + 1 == height){return ERROR;} |
|
|
else{check_tile += board->width;}} |
|
|
else{check_tile += board->width;}} |
|
|
|
|
|
|
|
|
return check_tile; |
|
|
return check_tile; |