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++实现
- c++模拟动态语言中string类的实现
- 简单模拟实现c++智能指针-指针移交控制权
- C++实现模拟登录---发送post表单信息包
- C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现
- 模拟实现VC中的handle的c++方法,欢迎指正~~~
- C++实现BP 神经网络模拟二维机械臂运动_智能计算期末2
- ffmpeg代码分析之2——模拟C++多态之C实现篇章
- C++模拟反射实现工厂模式
- C++实现BP算法_单隐层_异或(可模拟各种函数并验证)_智能计算作业2.1
- FP编程实践:Haskell与F#的列表操作函数及其C++模拟实现
- 用C编写一个模拟实现C++多态应用的一个范例
- 面试一道题--C模拟实现C++的多态
- [置顶] 从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector
- C++通过操作内存模拟序列化---实现多种类型的序列化(2)
- 用C++和JAVA实现进程调度模拟
- C代码模拟实现C++的虚拟表
- 以C++为例子,通过操作内存模拟实现对象的持久化存储(一)
- c++ 简单模拟实现 游戏定时开启任务
- C++实现BP算法实现正弦函数模拟_智能计算作业2.2