From a14ef3b1c9d6cc4142da7effc872efacdcd325c0 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Tue, 19 Dec 2006 00:53:03 -0800 Subject: [PATCH] Ensure that there is at least one word using all letters in the rack. --- dict.c | 3 ++- rack-fancy.c | 67 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/dict.c b/dict.c index b23da18..11ddaf1 100644 --- a/dict.c +++ b/dict.c @@ -227,7 +227,8 @@ trie_for_each_of_length_if (trie_t *trie, { count = 1; - action (closure, string->s, &trie->flags); + if (action) + action (closure, string->s, &trie->flags); } if (length == max_length) diff --git a/rack-fancy.c b/rack-fancy.c index 834492a..7f0542d 100644 --- a/rack-fancy.c +++ b/rack-fancy.c @@ -334,35 +334,56 @@ rack_init (rack_t *rack, static void rack_new_game (rack_t *rack) { - int i; - char *draw; - char word[8]; - - /* Clean up any remnants from the last game */ - dict_fini (&rack->solution); - - bag_shuffle (&rack->bag); + int i, bottom; + char word[MAX_TILES + 1]; + int length = MAX_TILES; + int count; + + /* We'll shuffle as many times as necessary until we can find a + * sequence of letters with at least one full-length + * word. */ + while (1) { + bag_shuffle (&rack->bag); + + /* In this game, we're not interested in blank tiles, so first + * find any blanks and sort them to the bottom of the bag. */ + i = 0; + bottom = BAG_SIZE - 1; + for (i = 0; i < bottom; i++) { + if (rack->bag.tiles[i] == '?') { + rack->bag.tiles[i] = rack->bag.tiles[bottom]; + rack->bag.tiles[bottom] = '?'; + bottom--; + /* Re-examine ith element */ + i--; + } + } - /* Keep drawing until we get 7 non-blank tiles */ - i = 0; - draw = rack->bag.tiles; - while (i < 7) { - if (*draw != '?') - word[i++] = *draw; - draw++; + for (i = 0; i + length <= bottom + 1; i++) { + memcpy (word, &rack->bag.tiles[i], length); + word[length] = '\0'; + printf ("Candidate word %s\n", word); + dict_fini (&rack->solution); + dict_init (&rack->solution); + subanagram_expand (word, &rack->dict, &rack->solution); + count = dict_for_each_of_length (&rack->solution, + NULL, NULL, + length, length); + if (count) + goto DONE; + i++; + } } - word[7] = '\0'; - for (i = 0; i < 7; i++) { + DONE: + rack->solution_total = dict_count (&rack->solution); + goo_canvas_item_simple_changed (GOO_CANVAS_ITEM_SIMPLE (rack->solution_item), FALSE); + + for (i = 0; i < length; i++) { rack->tiles[i]->letter = toupper (word[i]); goo_canvas_item_simple_changed (GOO_CANVAS_ITEM_SIMPLE (rack->tiles[i]->item), FALSE); } - rack->num_tiles = 7; - - dict_init (&rack->solution); - subanagram_expand (word, &rack->dict, &rack->solution); - rack->solution_total = dict_count (&rack->solution); - goo_canvas_item_simple_changed (GOO_CANVAS_ITEM_SIMPLE (rack->solution_item), FALSE); + rack->num_tiles = length; } static gboolean -- 2.43.0