diff options
author | scratko <m@scratko.xyz> | 2024-08-03 03:39:46 +0300 |
---|---|---|
committer | scratko <m@scratko.xyz> | 2024-08-03 03:39:46 +0300 |
commit | 9e9919b897b00ff23aee6581471b4d7b4567bf4a (patch) | |
tree | e76a6801606510dc357de803c76a16756727dca3 /server_game_process.c | |
parent | 0733ff24c89c8208b7e5d2789d0913d435b9e0fa (diff) | |
download | durak-9e9919b897b00ff23aee6581471b4d7b4567bf4a.tar.gz durak-9e9919b897b00ff23aee6581471b4d7b4567bf4a.tar.bz2 durak-9e9919b897b00ff23aee6581471b4d7b4567bf4a.zip |
Compilation succeeds
Diffstat (limited to 'server_game_process.c')
-rw-r--r-- | server_game_process.c | 147 |
1 files changed, 95 insertions, 52 deletions
diff --git a/server_game_process.c b/server_game_process.c index 5f1aacb..99b50fe 100644 --- a/server_game_process.c +++ b/server_game_process.c @@ -4,6 +4,8 @@ #include <string.h> #include <stdio.h> +enum { deck_size = 52 }; + static const char *basic_deck[deck_size] = { "2^", "3^", "4^", "5^", "6^", "7^", "8^", "9^", "10^", "J^", "Q^", "K^", "A^", "2#", @@ -20,10 +22,10 @@ static int get_random_idx() return 0 + (int)((double)deck_size*rand()/(RAND_MAX + 1.0)); } -char** get_shuffled_deck() +const char** get_shuffled_deck() { int i, new_idx; - char **shuffled_deck = realloc(deck_size, sizeof(char*)); + const char **shuffled_deck = calloc(deck_size, sizeof(char*)); for(i = 0; i < deck_size; ++i) { new_idx = get_random_idx(); while(shuffled_deck[new_idx]) @@ -33,10 +35,11 @@ char** get_shuffled_deck() return shuffled_deck; } -void deal_first_cards(char **shuffled_deck, int *cards_left, player_cards *deck) +void deal_first_cards(const char **shuffled_deck, int *cards_left, + player_cards *deck) { int i, last_idx; - char *str; + const char *str; for(i = 0; i < start_deck_size; ++i) { last_idx = *cards_left-1; str = shuffled_deck[last_idx]; @@ -48,6 +51,32 @@ void deal_first_cards(char **shuffled_deck, int *cards_left, player_cards *deck) } } +void deal_cards(const char **shuffled_deck, int *shuffled_cards_left, + struct session **turn_queue, int players_number, + int *card_quantity_arr) +{ + int i, j, key, player_deck_size, card_shortage_quantity, last_idx; + const char *extracted_card = NULL; + + for(i = 0; i < players_number; ++i) { + key = turn_queue[i]->player_position - 1; + player_deck_size = card_quantity_arr[key]; + if(player_deck_size < start_deck_size) { + card_shortage_quantity = start_deck_size - player_deck_size; + for(j = 0; j < card_shortage_quantity; ++j) { + last_idx = *shuffled_cards_left-1; + /* shuffled deck is empty */ + if(last_idx == 0 || last_idx < 0) + return; + extracted_card = shuffled_deck[last_idx]; + push_stack(&turn_queue[i]->deck, extracted_card); + --*shuffled_cards_left; + shuffled_deck[last_idx] = NULL; + } + } + } +} + const char* find_trump_suit(const char **shuffled_deck, int *cards_left) { const char *trump_suit = NULL; @@ -61,38 +90,44 @@ const char* find_trump_suit(const char **shuffled_deck, int *cards_left) int convert_rank_to_int(const char *card) { - int length, rank = 0; - char str_rand[2]; + int length; + char str_rank[2]; length = strlen(card); /* 10 - the only one of its kind */ if(length == 3) return 10; - strncpy(str_rank, 1); + + str_rank[0] = card[0]; str_rank[1] = '\0'; - if(!strncmp(str_rank, "J", 1)) - rank = 11; - else if(!strncmp(str_rank, "Q", 1)) - rank = 12; - else if(!strncmp(str_rank, "K", 1)) - rank = 13; - else if(!strncmp(str_rank, "A", 1)) - rank = 14; - else - rank = strtol(str_rank, NULL, 10); - return rank; + + switch(card[0]) { + case 'J': + return 11; + case 'Q': + return 12; + case 'K': + return 13; + case 'A': + return 14; + default: + return strtol(str_rank, NULL, 10); + } + return 0; } -int find_lowest_trump(player_cards deck, char *trump_suit) +int find_lowest_trump(player_cards deck, const char *trump_suit) { - const char *card; - int lowest_rank = 0; + int length, lowest_rank = 0, current_rank; + const char *suit = NULL; while(deck) { - if(!strncmp(card+length-1, trump_suit, 1)) { - lowest_rank = convert_rank_to_int(deck->str); - if(!lowest_rank || lowest_rank > rank) - lowest_rank = rank; + length = strlen(deck->str); + suit = deck->str + length - 1; + if(*suit == *trump_suit) { + current_rank = convert_rank_to_int(deck->str); + if(!lowest_rank || lowest_rank > current_rank) + lowest_rank = current_rank; } deck = deck->next; } @@ -108,26 +143,35 @@ void shift_turn_queue_by_one(struct session **turn_queue, int size) turn_queue[i-1] = tmp; } +void move_turn_queue_two_players_ahead(struct session **turn_queue, int size) +{ + int i; + + for(i = 0; i < 2; ++i) + shift_turn_queue_by_one(turn_queue, size); +} + void update_card_quantity_arr(struct server *serv) { - int i, j; + int i, player_position_idx; - for(i = 0, j = 0; i < serv->max_sess_arr_size; ++i) + for(i = 0; i < serv->max_sess_arr_size; ++i) if(serv->sess_arr[i]) { - serv->card_quantity_arr[j] = + player_position_idx = serv->sess_arr[i]->player_position - 1; + serv->card_quantity_arr[player_position_idx] = find_out_card_quantity_in_deck(serv->sess_arr[i]->deck); - ++j; } } struct game_info* get_new_game_info(int players_number, int *card_quantity_arr, - int shuffled_cards_left, char *trump_suit, + int shuffled_cards_left, + const char *trump_suit, int position_whose_turn, struct card_queue *cq, struct cards_on_table *cot) { - struct game_info *gi = malloc(sizeof(game_info)); + struct game_info *gi = malloc(sizeof(struct game_info)); gi->players_number = players_number; gi->card_quantity_arr = card_quantity_arr; gi->shuffled_cards_left = shuffled_cards_left; @@ -166,8 +210,7 @@ int is_card_bit(const char *attack_card, const char *defend_card, /* defender has a trump suit */ } else if(!strcmp(defend_suit, trump_suit)) return 1; - else - return 0; + return 0; } /* * analyze that each attacker card can be beat @@ -176,7 +219,7 @@ int is_card_bit(const char *attack_card, const char *defend_card, int check_defender_can_defend(struct card_queue *cq, player_cards deck, const char *trump_suit) { - int i, is_bited_card; + int is_bited_card; struct card_stack_item *next_defend_card; struct card_queue_item *next_attack_card; player_cards involved_cards; @@ -227,7 +270,7 @@ int check_someone_can_toss_card(struct session **turn_queue, { int i, j; struct card_queue_item *attack_card_in_queue; - struct card_stack item *not_defender_card; + struct card_stack_item *not_defender_card; for(i = 0; i < players_quantity; ++i) { /* skipping defender's cards */ @@ -250,7 +293,7 @@ int check_someone_can_toss_card(struct session **turn_queue, } /* checking cards on table */ for(j = cot->card_arr_idx; j >= 0; --j) { - if(cot->card_arr[j] == '-' || cot->card_arr[j] == '\') + if(cot->card_arr[j][0] == '-' || cot->card_arr[j][0] == '\\') continue; not_defender_card = NULL; while((not_defender_card = @@ -269,16 +312,15 @@ int check_someone_can_toss_card(struct session **turn_queue, int check_player_can_toss_card(player_cards deck, struct cards_on_table *cot) { int i; - struct card_stack item *not_defender_card; + struct card_stack_item *not_defender_card; /* checking cards on table */ for(i = cot->card_arr_idx; i >= 0; --i) { - if(cot->card_arr[i] == '-' || cot->card_arr[i] == '\') + if(cot->card_arr[i][0] == '-' || cot->card_arr[i][0] == '\\') continue; not_defender_card = NULL; while((not_defender_card = - get_next_card_from_stack(turn_queue[i]->deck, - not_defender_card)) && + get_next_card_from_stack(deck, not_defender_card)) && !check_matched_ranks(cot->card_arr[i], not_defender_card->str)) {} if(not_defender_card) @@ -292,7 +334,7 @@ int is_correct_tossing_card(const char *card, struct cards_on_table *cot) int i; for(i = cot->card_arr_idx; i >= 0; --i) { - if(cot->card_arr[i] == '-' || cot->card_arr[i] == '\') + if(cot->card_arr[i][0] == '-' || cot->card_arr[i][0] == '\\') continue; if(check_matched_ranks(cot->card_arr[i], card)) return 1; @@ -309,11 +351,11 @@ void put_all_cards_from_queue_to_table(struct cards_on_table *cot, while(!is_empty_queue(cq)) { card = pop_card_queue(cq); ++cot->card_arr_idx; - cot->card_arr[card_arr_idx] = card; + cot->card_arr[cot->card_arr_idx] = card; ++cot->card_arr_idx; - cot->card_arr[card_arr_idx] = "\\"; + cot->card_arr[cot->card_arr_idx] = "\\"; ++cot->card_arr_idx; - cot->card_arr[card_arr_idx] = "-"; + cot->card_arr[cot->card_arr_idx] = "-"; } } @@ -324,33 +366,34 @@ void put_one_card_from_queue_to_table(struct cards_on_table *cot, card = pop_card_queue(cq); ++cot->card_arr_idx; - cot->card_arr[card_arr_idx] = card; + cot->card_arr[cot->card_arr_idx] = card; ++cot->card_arr_idx; - cot->card_arr[card_arr_idx] = "\\"; + cot->card_arr[cot->card_arr_idx] = "\\"; ++cot->card_arr_idx; - cot->card_arr[card_arr_idx] = "-"; + cot->card_arr[cot->card_arr_idx] = "-"; } /* it used by defender to bit attack card */ void put_defender_card_on_table(struct cards_on_table *cot, const char *card) { - cot->card_arr[card_arr_idx] = card; + cot->card_arr[cot->card_arr_idx] = card; } void move_all_cards_to_defender(struct cards_on_table *cot, player_cards *deck) { + int i; +#if 0 const char *card; -#if 0 while(!is_empty_queue(cq)) { card = pop_card_queue(cq); push_stack(deck, card); } #endif for(i = cot->card_arr_idx; i >= 0; --i) { - if(cot->card_arr == '-' || cot->card_arr == '\') + if(cot->card_arr[i][0] == '-' || cot->card_arr[i][0] == '\\') continue; - push_stack(deck, card); + push_stack(deck, cot->card_arr[i]); } cot->card_arr_idx = i; } @@ -386,7 +429,7 @@ int calculate_attack_card_quantity_on_table(const struct cards_on_table *cot) return counter; } -int check_all_answers_were_received(const session **turn_queue, int size) +int check_all_answers_were_received(const struct session **turn_queue, int size) { int i; |