diff options
-rw-r--r-- | minesweeper/mine.c | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/minesweeper/mine.c b/minesweeper/mine.c index 51a7281..a196f7c 100644 --- a/minesweeper/mine.c +++ b/minesweeper/mine.c @@ -46,6 +46,19 @@ cell* clicked_cell(Minefield* mf, int x, int y); void expose_cell(Minefield* mf, int r, int c); void handle_click(Minefield* mf); +typedef enum screens { + GAME_LOOP, + GAME_OVER, + HELP, +} Screen; + +Screen game_loop(Minefield* mf); +/* Screen game_over(Minefield* mf); */ +Screen help_screen(Minefield* mf); + +Screen (*screen_fn(Screen scr))(Minefield *); +Screen last_screen; + const int screenWidth = 800; const int screenHeight = 450; float cell_size; @@ -67,21 +80,61 @@ int main(){ InitWindow(screenWidth, screenHeight, "Minesweeper"); SetTargetFPS(60); + Screen screen = GAME_LOOP; + Screen (*loop)(Minefield*); + while(!WindowShouldClose()){ + loop = screen_fn(screen); + screen = (*loop)(&mf); + } + + free_minefield(&mf); + + return 0; +} + +Screen game_loop(Minefield* mf){ while(!WindowShouldClose()){ + if (IsKeyPressed(KEY_H)){ + break; + } + if (!dead){ - handle_click(&mf); + handle_click(mf); } BeginDrawing(); ClearBackground(RAYWHITE); - draw_minefield(&mf); + draw_minefield(mf); EndDrawing(); } + last_screen = GAME_LOOP; + return HELP; +} - free_minefield(&mf); +Screen help_screen(Minefield* mf){ + while(!WindowShouldClose() && IsKeyDown(KEY_H)){ - return 0; + BeginDrawing(); + ClearBackground(RAYWHITE); + DrawText("Left Mouse Click - Open tile.", 100, 100, 30, BLACK); + DrawText("Right Mouse Click - Mark tile.", 100, 150, 30, BLACK); + EndDrawing(); + } + return last_screen; +} + +Screen (*screen_fn(Screen scr))(Minefield *) { + switch (scr) { + case GAME_LOOP: + return game_loop; + /* case GAME_OVER: */ + /* return game_loop; */ + case HELP: + return help_screen; + default: + return game_loop; + } } Minefield make_minefield(int row, int col, int mine_count){ @@ -173,7 +226,7 @@ void draw_minefield(Minefield* mf){ } char time_str[20]; float time = GetTime(); - snprintf(time_str, 100, "%02d.%02d - %d/%d", + snprintf(time_str, 20, "%02d.%02d - %d/%d", (int) time / 60, (int) time % 60, mark_count, mf->mine_count); DrawText(time_str, screenWidth / 2 - 20, screenHeight - 30, 20, BLACK); |