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,16 +80,11 @@ int main(){ InitWindow(screenWidth, screenHeight, "Minesweeper"); SetTargetFPS(60); + Screen screen = GAME_LOOP; + Screen (*loop)(Minefield*); while(!WindowShouldClose()){ - - if (!dead){ - handle_click(&mf); - } - - BeginDrawing(); - ClearBackground(RAYWHITE); - draw_minefield(&mf); - EndDrawing(); + loop = screen_fn(screen); + screen = (*loop)(&mf); } free_minefield(&mf); @@ -84,6 +92,51 @@ int main(){ return 0; } +Screen game_loop(Minefield* mf){ + while(!WindowShouldClose()){ + + if (IsKeyPressed(KEY_H)){ + break; + } + + if (!dead){ + handle_click(mf); + } + + BeginDrawing(); + ClearBackground(RAYWHITE); + draw_minefield(mf); + EndDrawing(); + } + last_screen = GAME_LOOP; + return HELP; +} + +Screen help_screen(Minefield* mf){ + while(!WindowShouldClose() && IsKeyDown(KEY_H)){ + + 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){ Minefield mf = {.row = row, .col = col}; int size = mf.row * mf.col; @@ -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);