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

来源:互联网 发布:cab软件下载 编辑:程序博客网 时间:2024/06/04 22:40
学习了博主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 54typedef 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;}


0 0
原创粉丝点击