summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--minesweeper/mine.c63
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);