#include <unistd.h>
#include <math.h>
#include <time.h>
+#include <ctype.h>
#include <assert.h>
typedef struct board {
int num_slots;
slot_t slots[BOARD_MAX_SLOTS];
- int needs_deal;
int sets_possible;
} board_t;
static int
set_game_shuffle (set_game_t *game);
+static void
+set_game_new_game (set_game_t *game);
+
static int
attribute_all_same (card_t *cards, int num_cards, int attr)
{
return 1;
}
-static int
-check_selected_for_set (board_t *board)
-{
- int i, num_selected;
- card_t cards[3];
-
- num_selected = 0;
- for (i=0; i < board->num_slots; i++) {
- if (board->slots[i].selected) {
- if (num_selected >= 3)
- return 0;
- cards[num_selected++] = board->slots[i].card;
- }
- }
-
- if (num_selected !=3)
- return 0;
-
- if (! is_set (cards, num_selected))
- return 0;
-
- board_count_sets_possible (board);
-
- board->needs_deal = 1;
-
- return 1;
-}
-
static void
deck_shuffle (deck_t *deck)
{
board->slots[i].has_card = 0;
board->slots[i].selected = 0;
}
- board->needs_deal = 0;
board_count_sets_possible (board);
}
}
board_count_sets_possible (board);
-
- board->needs_deal = 0;
}
static void
return;
}
- set_game_shuffle (game);
+ if (game->deck.num_cards == 0) {
+ loudgame_sendf (&game->lg, peer,
+ "Deck exhausted, starting a new game.");
+ set_game_new_game (game);
+ } else {
+ set_game_shuffle (game);
+ }
+}
+
+static void
+set_game_handle_set (set_game_t *game,
+ const char *peer,
+ const char *message)
+{
+ const char *s;
+ char *end = NULL;
+ int i;
+ int slots[3];
+ card_t cards[3];
+
+ s = message;
+ i = 0;
+ while (*s && i < 3) {
+ slots[i++] = strtoul (s, &end, 10);
+ if (end == s) {
+ loudgame_sendf (&game->lg, peer,
+ "Error: Not an integer: %s", s);
+ return;
+ }
+ s = end;
+ }
+
+ while (end && *end && isspace (*end))
+ end++;
+
+ if (i != 3 || *end != '\0') {
+ loudgame_sendf (&game->lg, peer,
+ "Error: The 'set' command requires exactly 3 integers");
+ return;
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (slots[i] < 0 || slots[i] > BOARD_MAX_SLOTS) {
+ loudgame_sendf (&game->lg, peer,
+ "Error: Value %d is out of range (0-%d)",
+ slots[i], BOARD_MAX_SLOTS);
+ return;
+ }
+ }
+
+ if (slots[0] == slots[1] ||
+ slots[0] == slots[2] ||
+ slots[1] == slots[2])
+ {
+ loudgame_sendf (&game->lg, peer,
+ "Error: All 3 values must be unique");
+ return;
+ }
+
+ for (i=0; i < 3; i++) {
+ if (game->board.slots[slots[i]].has_card) {
+ cards[i] = game->board.slots[slots[i]].card;
+ } else {
+ loudgame_sendf (&game->lg, peer,
+ "Error: There's no card at position %d", i);
+ return;
+ }
+ }
+
+ if (! is_set (cards, 3)) {
+ loudgame_sendf (&game->lg, peer,
+ "Sorry, that's not a set");
+ return;
+ }
+
+ loudgame_sendf (&game->lg, peer,
+ "Yes, that's a set!");
+
+ for (i = 0; i < 3; i++)
+ game->board.slots[slots[i]].has_card = 0;
+
+ board_count_sets_possible (&game->board);
+
+ deal (&game->deck, &game->board);
}
static void
set_game_handle_hint (game, peer);
else if (strcmp (message, "shuffle") == 0)
set_game_handle_shuffle (game, peer);
+ else if (strncmp (message, "set", 3) == 0)
+ set_game_handle_set (game, peer, message + 3);
else
loudgame_sendf (lg, peer, "Unknown command: '%s'", message);
}
/* Begin a new game */
+static void
+set_game_new_game (set_game_t *game)
+{
+ deck_init (&game->deck);
+ board_init (&game->board);
+ deal (&game->deck, &game->board);
+}
+
static int
set_game_init (set_game_t *game, int argc, char *argv[])
{
if (err)
return err;
- deck_init (&game->deck);
- board_init (&game->board);
- deal (&game->deck, &game->board);
+ set_game_new_game (game);
return 0;
}