c/c++实现模拟洗牌发牌

学习了博主nkmnkm的实现, http://blog.csdn.net/niu_gao/article/details/51458721,自己重写了一下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
enum Suit{
	 heart,
    spade,
    diamond,
    club,
    joker1,
    joker2
};
#define CARD_COUNT 54

typedef struct Card//一副牌有花色和大小
{
	int value;
	enum Suit suit;
}Card;

typedef struct Player
{
	char name[64];
	Card* cards;//因为玩家数量不确定,所以在这里没有分配确定的内存,而是一个指针
	int cardsCount;
}Player;

typedef int (* COMPAER)(Card *,Card *);//定义函数指针

char* getCardName(const Card *);
int shuffle(Card *cards,Card** p_card);
void dispatchCards(Player *player,int number,Card* card);
void sort(Card**,int,COMPAER);
int compare1(Card* ,Card*);
int compare2(Card* ,Card*);
void initOnePack();

Card pokers[CARD_COUNT];

void main()
{
	int ret=0;
	initOnePack();

	Card* cards=NULL;
	ret=shuffle(pokers,&cards);
	/*for(int i=0;i<CARD_COUNT;i++)
	{
		cout<<cards[i].value<<"  ";
	}*/
	
	Player player1,player2,player3;

	strcpy(player1.name,"张三");
	player1.cards=NULL;
	player1.cardsCount=0;

	strcpy(player2.name,"李四");
	player2.cards=NULL;
	player2.cardsCount=0;

	strcpy(player3.name,"王麻子");
	player3.cards=NULL;
	player3.cardsCount=0;

	Player players[]={player1,player2,player3};
	dispatchCards(players,3,cards);
	delete[] cards;
	sort(&(players[0].cards),players[0].cardsCount,compare1);

	sort(&(players[1].cards),players[1].cardsCount,compare1);

	sort(&(players[2].cards),players[2].cardsCount,compare1);
	cout<<player1.name<<"\t"<<player2.name<<"\t"<<player3.name<<endl;
	cout<<endl;
	int n=0,t=0;
	for(int i=0;i<CARD_COUNT;i++)
	{
		++t;
		int index=i%3;
		char* cardname=getCardName(players[index].cards+n);
		cout<<cardname<<"\t";
		//cout<<players[index].cards[n].value<<"\t";
		if(t%3==0)
		{
			cout<<endl;
			n++;
		}
		
	}
	for(int i=0;i<sizeof(players)/sizeof(Player);i++)
        free(players[i].cards);
	cout<<endl;
	system("pause");
}
void initOnePack()
{
	int i=0;
	for(;i<CARD_COUNT-2;i++)
	{
		pokers[i].value=i/4+1;
		pokers[i].suit=(Suit)(i%4);
	}
	pokers[i].value=i/4+1;
	pokers[i].suit=joker1;
	pokers[i+1].value=(i+1)/4+2;
	pokers[i+1].suit=joker2;
}
int shuffle(Card *cards,Card** p_card)
{
	Card ** p=NULL;
	Card *shufCards=new Card[CARD_COUNT];//重弄一副牌
	Card *tmpCards=new Card[CARD_COUNT];//整一副临时的牌
	for(int i=0;i<CARD_COUNT;i++)
	{
		tmpCards[i].value=cards[i].value;
		tmpCards[i].suit=cards[i].suit;
	}
	srand(time(NULL));
	for(int i=0;i<CARD_COUNT;i++)
	{
		int index=rand()%CARD_COUNT;
		if(tmpCards[index].value!=-1)
		{
			shufCards[i].value=tmpCards[index].value;
			shufCards[i].suit=tmpCards[index].suit;
			tmpCards[index].value=-1;//已经用过的牌的值就赋值成-1
		}
		else
		{
			--i;
		}
	}
	delete[] tmpCards;
	*p_card=shufCards;
	//cout<<shufCards[0].value<<endl;
	return 0;

}
void dispatchCards(Player *player,int number,Card* card)
{
	int numberCards = CARD_COUNT/number+1;
	for(int i=0;i<number;i++)
	{
		Card *tmp=new Card[numberCards];
		player[i].cards=tmp;
	}
	for(int i=0;i<CARD_COUNT;i++)
	{
		int cur=i%3;
		player[cur].cards[player[cur].cardsCount].value=card[i].value;
		player[cur].cards[player[cur].cardsCount].suit=card[i].suit;
		player[cur].cardsCount++;
	}
	return ;
}
void sort(Card** card,int count,COMPAER funp)
{
	for(int i=0;i<count;i++)
	{
		for(int j=i+1;j<count;j++)
		{
			if(funp(card[0]+i,card[0]+j)==1)
			{
				Card tmpcard=*(card[0]+i);
				*(card[0]+i)=*(card[0]+j);
				*(card[0]+j)=tmpcard;
			}
		}
	}
}
int compare1(Card* a,Card* b)
{
	if(a->value>b->value)
		return 1;
	else if(a->value<b->value)
		return 0;
	else
	{
		if(a->suit>b->suit)
			return 1;
		else 
			return 0;
	}
}
char* getCardName(const Card* card){
    //存放花色名字
    char suitStr[16]={0};//0=='\0'
    switch (card->suit) {
    case heart:
        strcpy(suitStr,"红桃");
        break;
    case spade:
        strcpy(suitStr,"黑桃");
        break;
    case diamond:
        strcpy(suitStr,"方块");
        break;
    case club:
        strcpy(suitStr,"梅花");
        break;
    }
    //存放点数名字
    char valueStr[16];
    switch(card->value){
    case 1:
        strcpy(valueStr,"A");
        break;
    case 11:
        strcpy(valueStr,"J");
        break;
    case 12:
        strcpy(valueStr,"Q");
        break;
    case 13:
        strcpy(valueStr,"K");
        break;
    case 14:
        strcpy(valueStr,"小王");
        break;
    case 15:
        strcpy(valueStr,"大王");
        break;
    default:
        sprintf(valueStr,"%d",card->value);
        break;
    }
    //动态分配足够的空间
    char * ret =(char*) malloc(16);
    //将两个名字合并到ret中
    sprintf(ret,"%s%s",suitStr,valueStr);
    return ret;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值