扑克牌的模拟

A × B 张扑克牌。每张扑克牌有一个大小(整数,记为a,范围区间是 0 到 A - 1)和一个花色(整数,记为b,范围区间是 0 到 B - 1。

有两张牌已知,求剩下的牌的不同组合,分别构成9种不同牌型的可能方案数。

重点在于给每个牌一个编号 number*B+color以方便进行遍历,AB的数据范围较小,通过三重for循环可以遍历剩余三张牌的的所有可能结果,然后依次判断属于哪种牌型。

#include<bits/stdc++.h>
using namespace std;
typedef struct{
    int number,color,index;//给每个牌一个编号 number*B+color
}card;
bool cmp(card a,card b){
    return a.index<=b.index;
}
int A,B,n;//n为牌的总数
card c[6],a,b;
int ans[9];


int main(){
    scanf("%d%d%d%d%d%d",&A,&B,&c[0].number,&c[0].color,&c[1].number,&c[1].color);
    c[0].index=c[0].number*B+c[0].color;
    c[1].index=c[1].number*B+c[1].color;
    a=c[0];b=c[1];//否则之后排序后会丢失原有牌的信息
    n=A*B;
    //cout<<c[0].index<<" "<<c[1].index<<endl;
    for(int i=0;i<9;i++) ans[i]=0;//初始化
    for(int i=0;i<n-2;i++){
        if(i==a.index||i==b.index) continue;
        for(int j=i+1;j<n-1;j++){
            if(j==a.index||j==b.index) continue;
            for(int k=j+1;k<n;k++){
                if(k==a.index||k==b.index) continue;
                c[0]=a;c[1]=b;
                c[2].index=i;c[2].color=i%B;c[2].number=i/B;
                c[3].index=j;c[3].color=j%B;c[3].number=j/B;
                c[4].index=k;c[4].color=k%B;c[4].number=k/B;
                //for(int i=0;i<5;i++) cout<<c[i].index<<" ";//!!!!!
                sort(c,c+5,cmp);
                //cout<<endl;
                //同花顺
                if(c[0].color==c[1].color&&c[0].color==c[2].color&&c[0].color==c[3].color&&c[0].color==c[4].color&&c[0].number==c[1].number-1
                  &&c[1].number==c[2].number-1&&c[2].number==c[3].number-1&&c[3].number==c[4].number-1) ans[0]++;
                //炸弹
                else if((c[0].number==c[1].number&&c[1].number==c[2].number&&c[2].number==c[3].number)||
                  (c[1].number==c[2].number&&c[2].number==c[3].number&&c[3].number==c[4].number)) ans[1]++;
                //三带二
                else if((c[0].number==c[1].number&&c[1].number==c[2].number&&c[3].number==c[4].number)||(c[0].number==c[1].number&&c[2].number==c[3].number&&c[3].number==c[4].number)) ans[2]++;
                //同花
                else if(c[0].color==c[1].color&&c[0].color==c[2].color&&c[0].color==c[3].color&&c[0].color==c[4].color) ans[3]++;
                //顺子
                else if(c[0].number==c[1].number-1 &&c[1].number==c[2].number-1&&c[2].number==c[3].number-1&&c[3].number==c[4].number-1) ans[4]++;
                //三条
                else if((c[0].number==c[1].number&&c[1].number==c[2].number)||(c[1].number==c[2].number&&c[2].number==c[3].number)||(c[2].number==c[3].number&&c[3].number==c[4].number)) ans[5]++;
                //两对
                else if((c[0].number==c[1].number&&c[2].number==c[3].number)||(c[0].number==c[1].number&&c[4].number==c[3].number)||(c[1].number==c[2].number&&c[3].number==c[4].number)) ans[6]++;
                //一对
                else if(c[0].number==c[1].number||c[1].number==c[2].number||c[2].number==c[3].number||c[3].number==c[4].number) ans[7]++;
                else ans[8]++;
            }
        }
    }
    for(int i=0;i<9;i++) printf("%d ",ans[i]);
}

需要注意的是,在排序之后会丢失原来已经选择的牌的信息,所以应该用两个变量把已经拥有的牌的信息保存下来,for循环中也应该在最里面的循环进行牌数组的赋值。

好的,下面是一个简单的 C 语言程序,可以模拟扑克牌自动发牌的过程: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM_SUITS 4 #define NUM_RANKS 13 #define NUM_CARDS 52 int main() { // 定义扑克牌的花色和点数 const char* suits[NUM_SUITS] = {"Spades", "Hearts", "Diamonds", "Clubs"}; const char* ranks[NUM_RANKS] = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"}; // 定义一个扑克牌的数组 int deck[NUM_CARDS]; // 生成一个初始的扑克牌数组 int i, j, k; for (i = 0; i < NUM_SUITS; i++) { for (j = 0; j < NUM_RANKS; j++) { deck[NUM_RANKS*i+j] = j; } } // 打乱扑克牌数组的顺序 srand(time(NULL)); for (i = 0; i < NUM_CARDS; i++) { j = rand() % NUM_CARDS; k = deck[i]; deck[i] = deck[j]; deck[j] = k; } // 发牌 int num_players = 4; int num_cards_per_player = NUM_CARDS / num_players; for (i = 0; i < num_players; i++) { printf("Player %d's cards:\n", i+1); for (j = 0; j < num_cards_per_player; j++) { int card_index = i*num_cards_per_player+j; int suit_index = deck[card_index] / NUM_RANKS; int rank_index = deck[card_index] % NUM_RANKS; printf("%s of %s\n", ranks[rank_index], suits[suit_index]); } printf("\n"); } return 0; } ``` 这个程序定义了扑克牌的花色和点数,然后生成一个初始的扑克牌数组。接着,使用 `srand()` 函数和 `rand()` 函数打乱扑克牌数组的顺序。最后,按照设定的玩家数和每个玩家的牌数,发牌并输出每个玩家手中的牌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值