コード例 #1
0
ファイル: texas.c プロジェクト: cncr031/libqp
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;
        }
    }
}
コード例 #2
0
ファイル: gp.c プロジェクト: huangtao/qipai
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;
}