您的位置:首页 > 编程语言 > C语言/C++

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

2017-04-28 08:19 330 查看
学习了博主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
.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 模拟发牌