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
- c/c++实现模拟洗牌发牌
- 一个简单的C代码,模拟洗牌发牌
- 洗牌、发牌过程模拟
- 模拟洗牌、发牌
- java实现洗牌 发牌
- Java实现--模拟斗地主的洗牌和发牌
- 模拟斗地主洗牌和发牌(集合实现)
- 洗牌和发牌模拟程序
- 模拟扑克牌的洗牌发牌
- java实现发牌洗牌功能
- Java模拟玩家洗牌发牌小程序
- 模拟斗地主洗牌和发牌
- 洗牌,发牌
- 用 c 语言实现自动发牌
- C语言发牌系统
- C语言发牌程序
- C语言随机发牌
- 模拟斗地主的创牌洗牌发牌看牌
- 若干题目1
- SSM整合:A child container failed during start
- UML类图与类的关系详解
- PHP GD库笔记
- 使用php开发停车场系统,智能停车系统,php程序源码
- c/c++实现模拟洗牌发牌
- 二叉树的建立与遍历
- java集合系列09 Queue
- hdoj-Oil Deposits
- mui开发APP教程之使用选项卡跳转子页面
- TREAP 模板(新)
- Maven搭建SSM项目
- Keras中几个重要函数用法
- 转自一个安卓技术总监的思考问题高度