From 17112b7f9d47ed17c86702c1bd815b0e1b9a6281 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 30 Nov 2006 23:17:07 -0800 Subject: [PATCH] Abstract bag code from rack into new bag.c This will allow for some simpler sharing with the new rack-fancy --- Makefile | 2 +- bag.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ bag.h | 34 +++++++++++++++++++++++++++++++ rack.c | 33 +++++------------------------- word-game.h | 1 + 5 files changed, 99 insertions(+), 29 deletions(-) create mode 100644 bag.c create mode 100644 bag.h diff --git a/Makefile b/Makefile index 6faae15..903deee 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ FANCYLIBS=`pkg-config --libs goocanvas` PROGRAMS=grid4 grid5 drill2 rack rack-fancy all: $(PROGRAMS) -LIBRARY=dict.o grid.o word-game.o +LIBRARY=bag.o dict.o grid.o word-game.o FANCYLIBRARY=demo-item.o %: %.o $(LIBRARY) diff --git a/bag.c b/bag.c new file mode 100644 index 0000000..1594d8e --- /dev/null +++ b/bag.c @@ -0,0 +1,58 @@ +/* + * Copyright © 2006 Carl Worth + * + * This program is free software; you can redistribute it and\/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." + */ + +#include "word-game.h" + +#include + +static char tile_distribution[BAG_SIZE+1] = +"AAAAAAAAABBCCDDDDEEEEEEEEEEEEFFGGGHHIIIIIIIIIJKLLLL" +"MMNNNNNNOOOOOOOOPPQRRRRRRSSSSTTTTTTUUUUVVWWXYYZ??"; + +static int +rand_within (int num_values) +{ + return (int) ((double) num_values * (rand() / (RAND_MAX + 1.0))); +} + +static void +shuffle (char *array, int length) +{ + int i, r, tmp; + + for (i = 0; i < length; i++) + { + r = i + rand_within (length - i); + tmp = array[i]; + array[i] = array[r]; + array[r] = tmp; + } +} + +void +bag_init (bag_t *bag) +{ + memcpy (bag->tiles, tile_distribution, BAG_SIZE); +} + +void +bag_shuffle (bag_t *bag) +{ + shuffle (bag->tiles, BAG_SIZE); +} + diff --git a/bag.h b/bag.h new file mode 100644 index 0000000..24b1dda --- /dev/null +++ b/bag.h @@ -0,0 +1,34 @@ +/* + * Copyright © 2006 Carl Worth + * + * This program is free software; you can redistribute it and\/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." + */ + +#ifndef _BAG_H_ +#define _BAG_H_ + +#define BAG_SIZE 100 + +typedef struct { + char tiles[BAG_SIZE]; +} bag_t; + +void +bag_init (bag_t *bag); + +void +bag_shuffle (bag_t *bag); + +#endif /* _BAG_H_ */ diff --git a/rack.c b/rack.c index fa0cdc1..968a9ee 100644 --- a/rack.c +++ b/rack.c @@ -23,30 +23,6 @@ #include #include -char bag_orig[101] = -"AAAAAAAAABBCCDDDDEEEEEEEEEEEEFFGGGHHIIIIIIIIIJKLLLL" -"MMNNNNNNOOOOOOOOPPQRRRRRRSSSSTTTTTTUUUUVVWWXYYZ??"; - -static int -rand_within (int num_values) -{ - return (int) ((double) num_values * (rand() / (RAND_MAX + 1.0))); -} - -static void -shuffle (char *array, int length) -{ - int i, r, tmp; - - for (i = 0; i < length; i++) - { - r = i + rand_within (length - i); - tmp = array[i]; - array[i] = array[r]; - array[r] = tmp; - } -} - static const char *subanagram_anagram; static char subanagram_enumerate_word[WORD_GAME_MAX_WORD_LENGTH]; static dict_t *subanagram_enumerate_answers; @@ -114,15 +90,16 @@ main (void) { dict_t dict, solution; struct timeval tv; - char bag[100], rack[8]; + bag_t bag; + char rack[8]; gettimeofday (&tv, NULL); srand (tv.tv_sec ^ tv.tv_usec); - memcpy (bag, bag_orig, 100); - shuffle (bag, 100); + bag_init (&bag); + bag_shuffle (&bag); - memcpy (rack, bag, 7); + memcpy (rack, bag.tiles, 7); rack[7] = '\0'; qsort (rack, 7, 1, character_compare); diff --git a/word-game.h b/word-game.h index 063d299..9088a89 100644 --- a/word-game.h +++ b/word-game.h @@ -20,6 +20,7 @@ #define _WORD_GAME_H_ #include "dict.h" +#include "bag.h" #define WORD_GAME_MAX_WORD_LENGTH 15 -- 2.43.0