]> git.cworth.org Git - wordgame/blobdiff - rack-fancy.c
Add back randomization
[wordgame] / rack-fancy.c
index 38c125394e9c8aeeaa6f4070cf643dafc8b3f362..310e6dd54943d55f98c1c6043456c13b0d2b924b 100644 (file)
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."
  */
 #include <stdlib.h>
+#include <string.h>
 #include <goocanvas.h>
+#include <sys/time.h>
+#include <time.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "word-game.h"
 #include "demo-item.h"
 
 static gboolean
@@ -50,21 +57,69 @@ create_window (void)
     return scrolled_window;
 }
 
+#define MAX_LETTERS 7
+static GooCanvasItem *letter_items[MAX_LETTERS];
+static int num_letters;
+
+static int
+rand_within (int num_values)
+{
+    return (int) ((double) num_values * (rand() / (RAND_MAX + 1.0)));
+}
+
+static void
+shuffle (int *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;
+    }
+}
+
+#define LETTER_SIZE 60
+#define LETTER_PAD 5
+
+static void
+get_letter_position (int i, int *x, int *y)
+{
+    *x = 20 + i * (LETTER_SIZE + LETTER_PAD);
+    *y = 20;
+}
+
 static gboolean
 on_button_press (GooCanvasItem  *item,
                 GooCanvasItem  *target,
                 GdkEventButton *event,
                 gpointer        data)
 {
-    g_print ("demo item received button press event\n");
+    int indices[MAX_LETTERS];
+    int i, x, y;
+
+    for (i = 0; i < num_letters; i++)
+       indices[i] = i;
+
+    shuffle (indices, num_letters);
+
+    for (i = 0; i < num_letters; i++) {
+       get_letter_position (indices[i], &x, &y);
+       goo_demo_item_glide_to (letter_items[i], x, y);
+    }
+
     return TRUE;
 }
 
 static void
-create_canvas (GtkWidget *parent)
+create_canvas (GtkWidget *parent, char *word)
 {
     GtkWidget *canvas;
-    GooCanvasItem *root, *rect;
+    GooCanvasItem *root;
+    int i;
+    int x, y;
 
     canvas = goo_canvas_new ();
     gtk_widget_set_size_request (canvas, 400, 400);
@@ -74,25 +129,47 @@ create_canvas (GtkWidget *parent)
 
     root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
 
-    rect = goo_demo_item_new (root, 30, 20, 50, 30,
-                             "fill-color", "purple",
-                             NULL);
-
-    g_signal_connect (rect, "button_press_event",
-                     (GtkSignalFunc) on_button_press, NULL);
-
+    for (i = 0; i < MIN (MAX_LETTERS, strlen (word)); i++) {
+       get_letter_position (i, &x, &y);
+       letter_items[i] = goo_demo_item_new (root,
+                                            x, y,
+                                            LETTER_SIZE,
+                                            word[i],
+                                            NULL);
+
+       g_signal_connect (letter_items[i], "button_press_event",
+                         (GtkSignalFunc) on_button_press, NULL);
+    }
+    num_letters = i;
+    while (i < MAX_LETTERS)
+       letter_items[i] = NULL; 
 }
 
 int
 main (int argc, char *argv[])
 {
+    struct timeval tv;
+    bag_t bag;
+    char rack[8];
+    int i;
     GtkWidget *window;
 
-    gtk_init (&argc, &argv);
+    gettimeofday (&tv, NULL);
+    srand (tv.tv_sec ^ tv.tv_usec);
+
+    bag_init (&bag);
+    bag_shuffle (&bag);
 
+    memcpy (rack, bag.tiles, 7);
+    rack[7] = '\0';
+
+    for (i = 0; i < 7; i++)
+       rack[i] = toupper (rack[i]);
+
+    gtk_init (&argc, &argv);
     window = create_window ();
 
-    create_canvas (window);
+    create_canvas (window, rack);
 
     gtk_main ();