X-Git-Url: https://git.cworth.org/git?p=wordgame;a=blobdiff_plain;f=rack-fancy.c;fp=rack-fancy.c;h=7f0542d0dc3fc0ba3523154a35fd4d1938b579f8;hp=834492af00ba8ca33509444c5ec5e63941b7677d;hb=a14ef3b1c9d6cc4142da7effc872efacdcd325c0;hpb=0dd9b1cd908b90236fba38ef4d7402c8fbcbb99b 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