From 07c11b469250752d24f981c1cbbbb800a92ced3d Mon Sep 17 00:00:00 2001 From: Ian C Date: Fri, 11 Jan 2019 15:40:23 +0000 Subject: Added score file. --- csol.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 141 insertions(+), 9 deletions(-) (limited to 'csol.c') diff --git a/csol.c b/csol.c index e417b39..4afa853 100644 --- a/csol.c +++ b/csol.c @@ -24,6 +24,7 @@ */ #include #include +#include #include #include @@ -33,8 +34,113 @@ #include "util.h" #include "klondike.h" +#define NO_GAMES 4 + +typedef struct +{ + unsigned long played; + unsigned long won; +} Score; + +static Score score[NO_GAMES]; +static char score_file[4096]; + +static void LoadScores() +{ + FILE *fp; + + if (!score_file[0]) + { + char *home = NULL; + + home = getenv("HOME"); + + if (home) + { + strcpy(score_file, home); + } + + strcat(score_file,"/.csolscore"); + } + + fp = fopen(score_file, "r"); + + if (fp) + { + int f; + char line[80]; + + for(f = 0; f < NO_GAMES; f++) + { + if (fgets(line, sizeof line, fp)) + { + char *p; + + p = strtok(line, "\r\n "); + + if (p) + { + score[f].played = strtoul(p, NULL, 0); + + p = strtok(NULL, "\r\n "); + + if (p) + { + score[f].won = strtoul(p, NULL, 0); + } + } + } + } + + fclose(fp); + } +} + +static const char *GetScore(int game) +{ + static char buff[80]; + + if (score[game].played == 0) + { + strcpy(buff, "0 played, 0.00% won"); + } + else + { + snprintf(buff, sizeof buff, "%lu played, %.2f%% won", + score[game].played, + (double)score[game].won / (double)score[game].played * 100.0); + } + + return buff; +} + +static void SaveScores() +{ + FILE *fp; + int f; + + fp = fopen(score_file, "w"); + + if (fp) + { + for(f = 0; f < NO_GAMES; f++) + { + fprintf(fp, "%lu %lu\n", score[f].played, score[f].won); + } + + fclose(fp); + } +} + int main(int argc, char *argv[]) { + const char *game_title[NO_GAMES] = + { + "1 ............. Klondike (draw three)", + "2 ............... Klondike (draw one)", + "3 .. Thoughtful Klondike (draw three)", + "4 .... Thoughtful Klondike (draw one)" + }; int key; int opt = 1; int quit = FALSE; @@ -46,38 +152,52 @@ int main(int argc, char *argv[]) noecho(); keypad(stdscr, TRUE); + LoadScores(); + while(!quit) { int row = 3; + int won = 0; + int game; + int f; erase(); Centre(1, "CURSES solitaire"); - Centre(row++, "1 ............. Klondike (draw three)"); - Centre(row++, "2 ............... Klondike (draw one)"); - Centre(row++, "3 .. Thoughtful Klondike (draw three)"); - Centre(row++, "4 .... Thoughtful Klondike (draw one)"); - Centre(row++, "Q .............................. Quit"); + + for(f = 0; f < NO_GAMES; f++) + { + mvprintw(row++, 0, "%s [%s]", game_title[f], GetScore(f)); + } + + row++; + mvaddstr(row++, 0, "Q .. Quit"); key = getch(); + game = -1; + switch(key) { case '1': erase(); - Klondike(3, FALSE); + game = 0; + won = Klondike(3, FALSE); break; case '2': erase(); - Klondike(1, FALSE); + game = 1; + won = Klondike(1, FALSE); break; case '3': erase(); - Klondike(3, TRUE); + game = 2; + won = Klondike(3, TRUE); break; case '4': erase(); - Klondike(1, TRUE); + game = 3; + won = Klondike(1, TRUE); break; case 'q': case 'Q': @@ -93,6 +213,18 @@ int main(int argc, char *argv[]) default: break; } + + if (game != -1) + { + score[game].played++; + + if (won) + { + score[game].won++; + } + + SaveScores(); + } } erase(); -- cgit v1.2.3