From 38b0d9c74ac0bd90a6249b0ec45ae7c9a41bdaa7 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 21 Sep 2006 02:42:09 -0700 Subject: [PATCH] grid: Add the ability to print stats at any point in the game. --- grid.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/grid.c b/grid.c index 5b57a51..0ebd786 100644 --- a/grid.c +++ b/grid.c @@ -147,11 +147,11 @@ board_solve (board_t *board, dict_t *dict, dict_t *solution) { int x, y; int16_t seen = 0; - char word[17]; + char word[18]; board->results = solution; - memset (word, '\0', 17); + memset (word, '\0', 18); for (y = 0; y < 4; y++) for (x = 0; x < 4; x++) @@ -170,16 +170,37 @@ unseen_predicate (dict_entry_t entry) return ! seen_predicate (entry); } +static void +_count_possible (dict_cursor_t cursor, + int depth, + int possible[17]) +{ + char c; + + if (cursor == DICT_CURSOR_NIL) + return; + + if (DICT_ENTRY_IS_WORD (dict_cursor_resolve (cursor))) + possible[depth]++; + + for (c = 'a'; c <= 'z'; c++) + _count_possible (dict_cursor_next (cursor, c), depth + 1, possible); +} + #define GAME_LENGTH (3 * 60) int main (void) { + int i; dict_t dict, solution; board_t board; struct timeval tv, tv_stop; int remaining, minutes, seconds; - int found, missed; + /* 16 tiles + Qu on one tile = max 17 letters in one word. */ + int found[17], possible[17]; + int found_total, possible_total; char prompt[7], *response; + bool_t just_saw_board; gettimeofday (&tv, NULL); srand (tv.tv_sec ^ tv.tv_usec); @@ -191,7 +212,18 @@ main (void) dict_init (&solution); board_solve (&board, &dict, &solution); + for (i=0; i < 17; i++) { + found[i] = 0; + possible[i] = 0; + } + _count_possible (dict_root (&solution), 0, possible); + found_total = 0; + possible_total = 0; + for (i=0; i < 17; i++) + possible_total += possible[i]; + board_print (&board); + just_saw_board = TRUE; gettimeofday (&tv, NULL); tv_stop = tv; @@ -204,17 +236,31 @@ main (void) response = readline (prompt); add_history (response); if (strlen (response) == 0) { - board_print (&board); + if (! just_saw_board) { + board_print (&board); + just_saw_board = TRUE; + } else { + for (i = 2; i <= 17; i++) + if (possible[i]) + printf ("%d: (%d/%d) ", i, found[i], possible[i]); + printf ("total: (%d/%d = %.2f%%)\n", + found_total, possible_total, + 100 * (double) found_total / possible_total); + } } else { dict_entry_t *entry; + just_saw_board = FALSE; if (response[strlen (response) - 1] == '\n') response[strlen (response) - 1] = '\0'; entry = dict_lookup (&solution, response); if (DICT_ENTRY_IS_WORD (entry)) { - if (*entry & GRID_WORD_SEEN) + if (*entry & GRID_WORD_SEEN) { printf ("(repeat)\n"); - else + } else { *entry |= GRID_WORD_SEEN; + found [strlen (response)]++; + found_total++; + } } else { entry = dict_lookup (&dict, response); if (DICT_ENTRY_IS_WORD (entry)) @@ -232,15 +278,15 @@ main (void) board_print (&board); printf ("Words you found:\n"); - found = dict_print_by_length_if (&solution, seen_predicate); + dict_print_by_length_if (&solution, seen_predicate); printf ("\nWords you missed:\n"); - missed = dict_print_by_length_if (&solution, unseen_predicate); + dict_print_by_length_if (&solution, unseen_predicate); printf ("\n"); printf ("You found %d of %d words (%.2f%%)\n", - found, found + missed, - 100 * (double) found / (found + missed)); + found_total, possible_total, + 100 * (double) found_total / possible_total); dict_fini (&dict); -- 2.43.0