一副扑克牌的随机发牌

前几天被问如何存储一副牌并公平发牌,就看了下,写的简单的代码如下:

<span style="font-size:12px;">
//这是一副牌斗地主的发牌(54张加了大小王)
//定义一个结构体,然后定义一个该结构体的数组Card[54](大写的),存储扑克牌(这个存储的是字符串) 
//定义一个int类型的card[54](小写的),来表示扑克牌,比如105,1代表花色(红桃),05代表面值5  
//再比如313,就是方块,401就是梅花A  
 
//********************************************************** 
#include<iostream>
#include<ctime>
using namespace std;
struct puke
{
         charcolor;  //花色
         charnumber[2]; //牌的数值
         intflag;    //3,4...J Q K A 2 XW DW
};
struct puke Card[54];  //加入大小王,54张,3人斗地主
int card[54];        //每张牌对应的整数数组
//如果按照card[52]排序,那么牌由小到大就是:A,2,3,4,5,6,7,8,9,10,J,Q,K 
//而牌由小到大排序是:3,4,5,6,7,8,9,10,J,Q,K,A,2 
 
//*************************************************************
void _shuffleCard()   //洗牌
{
         inti,j,k,temp;
         for(i=0;i<4;i++)
                   for(j=0;j<13;j++)
                            card[i*13+j]=(i+1)*100+j+1;  //101 102...初始化牌的数组
         card[52]=516;//小王大王
         card[53]=517;
         srand(time(NULL));   //产生随机数列的种子
         for(i=0;i<54;i++)
         {
                   k=rand()%(53-i+1)+i;   //利用随机数打乱数组
                   temp=card[i];
                   card[i]=card[k];
                   card[k]=temp;
         }
         cout<<endl;
}
 
 
//转换函数:card[52]->Card[52],将牌的存储由int类型转换为char类型
void _turnCard()   //将数字转换成对应的花色的牌存入扑克数组
{ 
         inti,temp;
         for(i=0;i<54;i++)
         {
                   temp= card[i]%100; //取牌的数值,A为1 一直K 13
                   Card[i].color= card[i]/100+'0';
                   if(Card[i].color=='1')   //为了可视化的代替红黑方梅四种不同的花色
                            Card[i].color='*';
                   if(Card[i].color=='2')
                            Card[i].color='&';
                   if(Card[i].color=='3')
                            Card[i].color='#';
                   if(Card[i].color=='4')
                            Card[i].color='~';
                   if(Card[i].color=='5')
                            Card[i].color='\0';
                   if(temp==1){
                            Card[i].number[0]='A';
                            Card[i].number[1]='\0';
                            continue;
                   }
                   if(temp==10){
                            Card[i].number[0]='1';
                            Card[i].number[1]='0';
                            continue;
                   }   
                   if(temp==11){
                            Card[i].number[0]='J';
                            Card[i].number[1]='\0';
                            continue;
                   }
                   if(temp==12){
                            Card[i].number[0]='Q';
                            Card[i].number[1]='\0';
                            continue;
                   }
                   if(temp==13){
                            Card[i].number[0]='K';
                            Card[i].number[1]='\0';
                            continue;
                   }
                   if(temp==16){
                            Card[i].number[0]='X';
                            Card[i].number[1]='W';
                            continue;
                   }
                   if(temp==17){
                            Card[i].number[0]='D';
                            Card[i].number[1]='W';
                            continue;
                   }
 
                   Card[i].number[0]=temp+48;
                   Card[i].number[1]='\0';
 
         }
 
         for(i=0;i<54;i++)
         {
                   temp= card[i]%100; 
                   Card[i].flag= temp;
                   if(temp==1||temp==2)   //A 2比 3,4,,,k 大
                            Card[i].flag+=13;
 
         }
         //cout<<endl;
 
}
 
//*************************冒泡排序******************************
void _sortCard() //二维数组,每层排序(即每个人18张牌排序)
{
         inti,j,k;
         structpuke temp;
         for(i=0;i<3;i++)
         {
                   for(j=0;j<18;j++)
                            for(k=0;k<18-j-1;k++)
                            {
                                     if(Card[i*18+k].flag>Card[i*18+k+1].flag)
                                     {
                                               temp= Card[i*18+k];
                                               Card[i*18+k]= Card[i*18+k+1];
                                               Card[i*18+k+1]= temp;         
                                     }
                            }
 
         }
}
 
/*
void _print2()  //打印每个人的牌对应的数字
{
         inti = 0;
         for(;i<54;i++)
                   cout<<card[i]<<"";
         cout<<endl;
 
}
*/
 
/* void _print3()  //检测牌重复不
{
         inti = 0;
         for(;i<54;i++)
                   cout<<Card[i].flag<<"";
         cout<<endl;
 
}
*/
 
//********************************************
void _printCard()  //打印每个人的牌
{
         inti,j;
         for(i=0;i<3;i++){
                   cout<<"第"<<i+1<<"个人的牌:";
                   for(j=0;j<18;j++)
                   {
                            cout<<Card[i*18+j].color<<Card[i*18+j].number[0]<<Card[i*18+j].number[1]<<"";
 
                   }
                   cout<<endl;
         }
         cout<<endl;
}
 
 
 
//*****************************
void _testCard() //验牌重复不
{
         inti,j,flag = 0;
         for(i=0;i<54;i++)
                   for(j=0;j<54-i-1;j++)
                   {
                            if(i!=j)
                            {
                                     if(card[i]==card[j])
                                               flag= 1;
                            }
                   }
                   if(flag==0)
                            cout<<"验证成功,无重复牌!"<<endl;
                   if(flag==1)
                            cout<<"验证失败,存在重复牌!"<<endl;
 
 
}
 
int main()
{
         _shuffleCard();
         _turnCard();
         //  _print2();
         //  _print3();
         _sortCard();
         _testCard();
         _printCard();
         system("pause");
         return0;
}
 </span>

运行如下:


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。实现扑克牌比大小的游戏需要以下几个步骤: 1. 定义扑克牌的数据结构 可以使用一个二维数组来表示一副扑克牌,其中第一维表示牌的花色,第二维表示牌的点数。例如,可以用0-3表示黑桃、红桃、梅花、方块,用1-13表示A、2、3、...、10、J、Q、K。 2. 洗牌 将一副扑克牌按照随机顺序洗牌,可以使用随机数来实现。 3. 发牌 将洗好的扑克牌发给家和庄家,每人发两张牌。 4. 比较大小 根据扑克牌的点数来比较大小,A算1点,J、Q、K算10点,其他牌按照点数算。如果家或庄家的牌点数超过21点,则认为该家输了;如果点数相同,则平局;否则点数大的获胜。 下面是一个简单的实现示例: ```python import random # 定义一副扑克牌 deck = [[i, j] for i in range(4) for j in range(1, 14)] # 定义比较大小的函数 def compare(cards): total = sum([min(card[1], 10) for card in cards]) if total > 21: return -1 else: return total # 洗牌 random.shuffle(deck) # 发牌 player_cards = [deck.pop(), deck.pop()] dealer_cards = [deck.pop(), deck.pop()] # 显示家的牌和庄家的第一张牌 print("Your cards:", player_cards) print("Dealer's cards:", [dealer_cards[0], ['*', '*']]) # 家决定是否要继续要牌 while True: choice = input("Do you want to hit or stand? (h/s)") if choice == 'h': player_cards.append(deck.pop()) print("Your cards:", player_cards) if compare(player_cards) == -1: print("You lose!") break else: break # 庄家开始要牌 while compare(dealer_cards) < 17: dealer_cards.append(deck.pop()) # 显示庄家的牌 print("Dealer's cards:", dealer_cards) # 比较大小 player_score = compare(player_cards) dealer_score = compare(dealer_cards) if player_score == -1: print("You lose!") elif dealer_score == -1 or player_score > dealer_score: print("You win!") elif player_score == dealer_score: print("Tie!") else: print("You lose!") ``` 希望这个示例能够帮助你实现扑克牌比大小的游戏!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值