void texas_analyse(hand_t* hand, analyse_r* ar) { int x[16]; int i; if(!hand || !ar) return; memset(x, 0, sizeof(int)*16); cards_bucket(hand, x); ar->n1 = ar->n2 = ar->n3 = ar->n4 = 0; for(i = 0; i < 16; i++){ switch(x[i]){ case 1: ar->v1[ar->n1] = i; ar->n1++; break; case 2: ar->v2[ar->n2] = i; ar->n2++; break; case 3: ar->v3[ar->n3] = i; ar->n3++; break; case 4: ar->v4[ar->n4] = i; ar->n4++; break; } } }
void gp_handtype(gp_t* gp, card_t* cards, int len, hand_type* ht) { int flag,i,n,have_k,have_3; analyse_r ar; card_t *p; cd_bucket x[20]; if (!gp || !cards || len <= 0 || !ht) return; ht->type = GP_ERROR; p = cards; ht->num = cards_num(cards, len); switch (ht->num) { case 0: return; case 1: ht->type = GP_SINGLE; memcpy(&ht->type_card, p, sizeof(card_t)); ht->param1 = card_logic(p); return; case 2: if (p->rank == (p + 1)->rank) { ht->type = GP_DOUBLE; memcpy(&ht->type_card, p, sizeof(card_t)); ht->param1 = card_logic(p); return; } return; default: break; } memset(&ar, 0, sizeof(analyse_r)); memset(x, 0, sizeof(cd_bucket) * 20); cards_bucket(cards, len, x); ar.n1 = ar.n2 = ar.n3 = ar.n4 = 0; for (i = 19; i >= 0; --i) { n = x[i].num_spade + x[i].num_heart + x[i].num_club + x[i].num_diamond; switch (n) { case 1: ar.v1[ar.n1] = i; ar.n1++; break; case 2: ar.v2[ar.n2] = i; ar.n2++; break; case 3: ar.v3[ar.n3] = i; ar.n3++; break; case 4: ar.v4[ar.n4] = i; ar.n4++; break; } } /* for bomb */ if (ar.n4 > 0) { if (ar.n4 == 1 && ht->num == 4) { if(gp->game_rule == GP_RULE_DEFAULT) ht->type = GP_BOMB; else ht->type = GP_FOUR; ht->type_card.rank = x[ar.v4[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v4[0]; return; } if (ar.n4 == 1 && ht->num == 5) { ht->type = GP_BOMB; ht->type_card.rank = x[ar.v4[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v4[0]; return; } if (gp->game_rule == GP_RULE_ZHUJI) { if (ar.n4 == 1 && ht->num == 7){ ht->type = GP_FOUR_P3; ht->type_card.rank = x[ar.v4[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v4[0]; return; } } return; } /* for three */ if (ar.n3 > 0) { if (ar.n3 == 1 && ht->num == 3) { if (gp->game_rule == GP_RULE_DEFAULT) { if (x[ar.v3[0]].rank == cdRankAce) ht->type = GP_BOMB; } else { ht->type = GP_THREE; } ht->type_card.rank = x[ar.v3[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v3[0]; return; } if (ar.n3 == 1 && ht->num == 4) { if (gp->game_rule == GP_RULE_DEFAULT) { if(x[ar.v3[0]].rank == cdRankAce) ht->type = GP_BOMB; } else { if (x[ar.v3[0]].rank == cdRankK) ht->type = GP_BOMB; else ht->type = GP_THREE_P1; } ht->type_card.rank = x[ar.v3[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v3[0]; return; } if (ar.n3 == 1 && ar.n2 == 1 && ht->num == 5) { ht->type = GP_THREE_P2; ht->type_card.rank = x[ar.v3[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v3[0]; return; } if (ar.n3 == 1 && ht->num == 6) { if (x[ar.v3[0]].rank == cdRankK) { ht->type = GP_FOUR_P3; ht->type_card.rank = x[ar.v3[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v3[0]; return; } } if (ar.n3 > 1) { /* not include rank 2 */ flag = cards_rank_num(cards, len, cdRank2); if (flag) return; /* like KKK+333 */ if (gp->game_rule == GP_RULE_ZHUJI) { if ((x[ar.v3[0]].rank == cdRankK) && ht->num == 6) { ht->type = GP_FOUR_P3; ht->type_card.rank = x[ar.v3[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v3[0]; return; } } for (i = 0; i < (ar.n3 - 1); ++i) { if((ar.v3[i] - (ar.v3[i+1])) != 1) return; } if (ar.n3 * 3 == ht->num) { ht->type = GP_T_STRAIGHT; ht->type_card.rank = x[ar.v3[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v3[0]; return; } if (ar.n3 * 5 == ht->num && ar.n3 == ar.n2) { for (i = 0; i < (ar.n2 - 1); ++i) { if ((ar.v2[i] - ar.v2[i+1]) != 1) return; } ht->type = GP_PLANE; ht->type_card.rank = x[ar.v3[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v3[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v3[0]; return; } } return; } /* for 2 */ if (ar.n2 >= 2) { flag = cards_rank_num(cards, len, cdRank2); if (flag) return; for (i = 0; i < (ar.n2 - 1); ++i){ if ((ar.v2[i] - ar.v2[i+1]) != 1) return; } if (ar.n2 * 2 == ht->num) { ht->type = GP_D_STRAIGHT; ht->type_card.rank = x[ar.v2[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v2[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v2[0]; return; } return; } /* for straight */ if (ar.n1 >= 5 && ar.n1 == ht->num) { if (gp->game_rule == GP_RULE_DEFAULT) { have_k = cards_rank_num(cards, len, cdRankK); have_3 = cards_rank_num(cards, len, cdRank3); if (have_3) { /* 2 to 2 */ flag = cards_rank_num(cards, len, cdRank2); if (flag) { x[2].rank = x[15].rank; x[2].num_spade = x[15].num_spade; x[2].num_heart = x[15].num_heart; x[2].num_club = x[15].num_club; x[2].num_diamond = x[15].num_diamond; x[15].rank = 0; x[15].num_spade = x[15].num_heart = 0; x[15].num_club = x[15].num_diamond = 0; if (!have_k) { /* ace to 1 */ x[1].rank = x[14].rank; x[1].num_spade = x[14].num_spade; x[1].num_heart = x[14].num_heart; x[1].num_club = x[14].num_club; x[1].num_diamond = x[14].num_diamond; x[14].rank = 0; x[14].num_spade = x[14].num_heart = 0; x[14].num_club = x[14].num_diamond = 0; } /* recount */ memset(&ar, 0, sizeof(analyse_r)); ar.n1 = ar.n2 = ar.n3 = ar.n4 = 0; for (i = 19; i >= 0; i--) { n = x[i].num_spade + x[i].num_heart + x[i].num_club + x[i].num_diamond; switch (n) { case 1: ar.v1[ar.n1] = i; ar.n1++; break; case 2: ar.v2[ar.n2] = i; ar.n2++; break; case 3: ar.v3[ar.n3] = i; ar.n3++; break; case 4: ar.v4[ar.n4] = i; ar.n4++; break; } } } } else { flag = cards_rank_num(cards, len, cdRank2); if (flag) return; } } else { flag = cards_rank_num(cards, len, cdRank2); if (flag) return; } /*flag = cards_have_rank(cdRankZJoker, ar.v1, MAX_CARDS); if(flag) return; flag = cards_have_rank(cdRankFJoker, ar.v1, MAX_CARDS); if(flag) return;*/ for (i = 0; i < (ar.n1 - 1); ++i) { if ((ar.v1[i] - ar.v1[i+1]) != 1) { return; } } ht->type = GP_STRAIGHT; ht->type_card.rank = x[ar.v1[0]].rank; ht->type_card.suit = get_bucket_suit(&x[ar.v1[0]]); ht->type_card.id = (ht->type_card.suit - 1) * 13 + ht->type_card.rank; ht->param1 = ar.v1[0]; return; } return; }