洗牌算法

本文介绍了如何使用C++编程实现一个洗牌算法,将一副54张的扑克牌随机分配给三个人,并对每个人得到的牌进行降序排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看到一个题是这样的

实现一个算法: 将一副54张扑克牌经过洗牌后顺序发给三个人,然后将每个人的牌按降序排序。

自己实现了一下,代码如下:

Card.h

#ifndef CARD_H
#define CARD_H
#include <string>
using namespace std;

//扑克牌类
class Card
{
public:
	int suit;  //花色
	int rank;  //点数
	//枚举依次代表点数{3,4,5,6,7,8,9,10,J,Q,K,A,2,小王,大王}
	enum{THREE=0,FOUR=1,FIVE=2,SIX=3,SEVEN=4,EIGHT=5,NINI=6,TEN=7,
	    JACK=8,QUEEN=9,KING=10,ACE=11,DEUCE=12,BLACK=13,RED=14};
    //枚举依次代表花色{方块,梅花,红桃,黑桃,王}
	enum{DIAMOND=0,CLUB=1,HEART=2,SPADE=3,JOKER=4};

private:
	static const string SUIT_NAMES[5];
	static const string RANK_NAMES[15];

public:
	Card() {}
	Card(int s,int r):suit(s),rank(r) {}
	string toString();
};

#endif

/*****************************************************/
Card.cpp

#include <iostream>
#include "Card.h"

const string Card::SUIT_NAMES[] = {"方块","梅花","红桃","黑桃",""};
const string Card::RANK_NAMES[] =  {"3","4","5","6","7","8","9","10","J",
"Q","K","A","2","小王","大王"};

string Card::toString()
{
	return SUIT_NAMES[suit] + RANK_NAMES[rank];
}


/*****************************************************/
//算法类
Game.h
#ifndef GAME_H
#define GAME_H
#include "Card.h"

using namespace std;

class Game
{
public:
	//洗牌函数,把一副牌的次序随机打乱
	void shuffle(Card *cards,int len);
	//发牌函数,第一个数组是洗牌后的结果,第二个数组是二维数组
	//的首地址,num是人数。发牌的时候每个人的牌都要做排序
	void deal(Card *cards,int len,Card *ret,int num);
};

#endif

/*****************************************************/
Game.cpp
#include "Game.h"
//洗牌函数
void Game::shuffle(Card *cards,int len)
{
	srand(time(0));
	
	for(int i = len-1; i>=1; i--)
	{
		int j = rand()%i;
		Card temp = cards[i];
		cards[i] = cards[j];
        cards[j] = temp;
	}
}
//排序函数(冒泡)
void sort(Card *array,int len)
{
	assert(array!=NULL && len>0);
	int i,j;
	bool flag = true;
	for(i=0; i<len-1 && flag; i++)
	{
		flag = false;
		for(j=len-2; j>=0; j--)
		{
			if((array+j)->rank < (array+j+1)->rank)
			{
				Card temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                flag = true;
			}
		}
	}
}
//发牌函数
void Game::deal(Card *cards,int len,Card *ret,int num)
{
	assert(cards!=NULL && ret!=NULL && len>0 && num>1);
	int sum = len/num;
	int i,j;
	for(i=0,j=0; i<sum; i++)
	{
		ret[i] = cards[j++];
		ret[sum+i] = cards[j++];
		ret[2*sum+i] = cards[j++];
	}

	for(i=0;i<num; i++)
	{
		sort(ret+i*sum,sum);
    }
}

/*****************************************************/
//测试代码
Main.cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include "Game.h"
using namespace std;

int main()
{
	Card *cards = new Card[54];
	int i=0,j=0;
	int rank,suit;
	for(rank = Card::THREE; rank <= Card::DEUCE; rank++)
	{
		for(suit = Card::DIAMOND; suit <= Card::SPADE; suit++)
		{
			(cards+i)->suit = suit;
			(cards+i)->rank = rank;
			i++;
		}
	}
	(cards+i)->suit = Card::JOKER;
    (cards+i)->rank = Card::BLACK;
    i++;
    (cards+i)->suit = Card::JOKER;
    (cards+i)->rank = Card::RED;
    //洗牌
    Game *game = new Game;
    game->shuffle(cards,54);
    cout<<"一副扑克牌"<<endl;
	cout << "[";
	for(i=0; i<54; i++)
	{
		cout << cards[i].toString();
		if(i!=53)
			cout << ",";
	}
	cout <<"]"<< endl;
     //发牌
    Card res[3][18];
    game->deal(cards,54,(Card*)res,3);
    cout<<"发牌之后"<<endl;
    for(i=0;i<3;i++)
    {
        cout << "[";
        for(j=0;j<18;j++)
        {
            cout << res[i][j].toString();
            if(j!=17) 
				cout<<",";
        }
        cout <<"]"<< endl;
    }
	return 0;
}

测试程序运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值