From 49af79f93295f2d4e347604a7cdd3b79b0ccb580 Mon Sep 17 00:00:00 2001 From: Bill Rossi Date: Sat, 15 Feb 2025 15:10:26 -0500 Subject: [PATCH] Play through en entire game!! --- card.c | 2 +- game.c | 107 ++++++++++++++++++++++++++++++++++++++++++++------------- game.h | 4 +++ play.c | 10 ++++++ play.h | 8 +++++ 5 files changed, 106 insertions(+), 25 deletions(-) diff --git a/card.c b/card.c index c378d1a..b4753a6 100644 --- a/card.c +++ b/card.c @@ -96,7 +96,7 @@ void add_to_hand(Hand *h, Card *c) { } c->move.curve = CURVE_EASE_IN_OUT; c->move.current_time = 0.; - c->move.end_time = 0.1; + c->move.end_time = 0.5; h->count++; } diff --git a/game.c b/game.c index d46b1a6..fd8973a 100644 --- a/game.c +++ b/game.c @@ -71,10 +71,10 @@ void initialize_game(Game *g) { g->player_hand.position = (Vector2) { 300, 600 }; g->player_hand.display_type = HAND_DISPLAY_ROW; g->right_hand.count = 0; - g->right_hand.position = (Vector2) { 50, 125 }; + g->right_hand.position = (Vector2) { 750, 125 }; g->right_hand.display_type = HAND_DISPLAY_ROW; g->left_hand.count = 0; - g->left_hand.position = (Vector2) { 750, 125 }; + g->left_hand.position = (Vector2) { 50, 125 }; g->left_hand.display_type = HAND_DISPLAY_ROW; g->field.count = 0; g->field.position = (Vector2) { 400, 300 }; @@ -83,10 +83,10 @@ void initialize_game(Game *g) { g->player_scored.position = (Vector2) { 300, 750 }; g->player_scored.display_type = HAND_DISPLAY_ROW; g->right_scored.count = 0; - g->right_scored.position = (Vector2) { 50, 25 }; + g->right_scored.position = (Vector2) { 750, 25 }; g->right_scored.display_type = HAND_DISPLAY_ROW; g->left_scored.count = 0; - g->left_scored.position = (Vector2) { 750, 25 }; + g->left_scored.position = (Vector2) { 50, 25 }; g->left_scored.display_type = HAND_DISPLAY_ROW; strcpy(teyaku_calculation, ""); @@ -166,6 +166,47 @@ void handle_input(Game *g) { } } +bool run_frame_from_deck(Game *g, Hand *to_hand) { + Card *top_card = g->deck.cards[g->deck.count - 1]; + if (top_card->visible) { + Card *target = valid_target(top_card, &g->field); + if (target) { + remove_from_hand(&g->field, target); + add_to_hand(to_hand, target); + remove_from_hand(&g->deck, top_card); + add_to_hand(to_hand, top_card); + } else { + remove_from_hand(&g->deck, top_card); + add_to_hand(&g->field, top_card); + } + return true; + } else { + remove_from_hand(&g->deck, top_card); + add_to_hand(&g->deck, top_card); + top_card->visible = true; + top_card->move.end_time = 0.3; + top_card->move.destination.x = top_card->move.destination.x + 100; + return false; + } +} + +void run_frame_ai_playing(Game *g, Hand *hand, Hand *scored) { + Play play = ai_play(hand, &g->field); + if (play.target) printf("Playing %d on %d\n", play.played->index, play.target->index); + else printf("Playing %d on field\n", play.played->index); + play.played->visible = true; + + if (play.target) { + remove_from_hand(hand, play.played); + add_to_hand(scored, play.played); + remove_from_hand(&g->field, play.target); + add_to_hand(scored, play.target); + } else { + remove_from_hand(hand, play.played); + add_to_hand(&g->field, play.played); + } +} + void run_frame_dealing(Game *g) { if (g->player_hand.count < 4) { deal(&g->deck, &g->player_hand, 4, true); @@ -244,26 +285,32 @@ void run_frame_player_choosing_target(Game *g) { } void run_frame_player_from_deck(Game *g) { - Card *top_card = g->deck.cards[g->deck.count - 1]; - if (top_card->visible) { - Card *target = valid_target(top_card, &g->field); - if (target) { - remove_from_hand(&g->field, target); - add_to_hand(&g->player_scored, target); - remove_from_hand(&g->deck, top_card); - add_to_hand(&g->player_scored, top_card); - } else { - remove_from_hand(&g->deck, top_card); - add_to_hand(&g->field, top_card); - } - g->state = GAME_STATE_INITIALIZING; - } else { - remove_from_hand(&g->deck, top_card); - add_to_hand(&g->deck, top_card); - top_card->visible = true; - top_card->move.end_time = 0.3; - top_card->move.destination.x = top_card->move.destination.x + 100; - } + if (run_frame_from_deck(g, &g->right_hand)) + g->state = GAME_STATE_RIGHT_PLAYING; +} + +void run_frame_right_playing(Game *g) { + printf("right play\n"); + run_frame_ai_playing(g, &g->right_hand, &g->right_scored); + g->state = GAME_STATE_RIGHT_FROM_DECK; +} + +void run_frame_right_from_deck(Game *g) { + printf("right deck\n"); + if (run_frame_from_deck(g, &g->right_scored)) + g->state = GAME_STATE_LEFT_PLAYING; +} + +void run_frame_left_playing(Game *g) { + printf("left play\n"); + run_frame_ai_playing(g, &g->left_hand, &g->left_scored); + g->state = GAME_STATE_LEFT_FROM_DECK; +} + +void run_frame_left_from_deck(Game *g) { + printf("left deck\n"); + if (run_frame_from_deck(g, &g->left_scored)) + g->state = GAME_STATE_PLAYER_CHOOSING_FROM_HAND; } void run_frame(Game *g) { @@ -298,6 +345,18 @@ void run_frame(Game *g) { case GAME_STATE_PLAYER_FROM_DECK: run_frame_player_from_deck(g); break; + case GAME_STATE_RIGHT_PLAYING: + run_frame_right_playing(g); + break; + case GAME_STATE_RIGHT_FROM_DECK: + run_frame_right_from_deck(g); + break; + case GAME_STATE_LEFT_PLAYING: + run_frame_left_playing(g); + break; + case GAME_STATE_LEFT_FROM_DECK: + run_frame_left_from_deck(g); + break; } } diff --git a/game.h b/game.h index bc219db..907aa70 100644 --- a/game.h +++ b/game.h @@ -17,6 +17,10 @@ typedef enum GameState { GAME_STATE_PLAYER_CHOOSING_FROM_HAND, GAME_STATE_PLAYER_CHOOSING_TARGET, GAME_STATE_PLAYER_FROM_DECK, + GAME_STATE_RIGHT_PLAYING, + GAME_STATE_RIGHT_FROM_DECK, + GAME_STATE_LEFT_PLAYING, + GAME_STATE_LEFT_FROM_DECK, } GameState; struct Game { diff --git a/play.c b/play.c index f4c66f1..49f8181 100644 --- a/play.c +++ b/play.c @@ -34,3 +34,13 @@ Card *valid_target(Card *active, Hand *field) { return NULL; } + +Play ai_play(Hand *hand, Hand *field) { + // very naive play initially + Card *played = hand->cards[0]; + for (int i = 0; i < field->count; i++) { + Card *target = field->cards[i]; + if (valid_play(field, played, target)) return (Play) { played, target }; + } + return (Play) { played, NULL }; +} diff --git a/play.h b/play.h index b67c40b..c580c45 100644 --- a/play.h +++ b/play.h @@ -3,9 +3,17 @@ #include +typedef struct Play Play; + #include "card.h" +struct Play { + Card *played; + Card *target; +}; + bool valid_play(Hand *field, Card *played, Card *target); Card *valid_target(Card *active, Hand *field); +Play ai_play(Hand *hand, Hand *field); #endif