国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現洗牌發牌排序功能的示例代碼

2020-05-23 13:47:01
字體:
來源:轉載
供稿:網友

在內存中模擬出一副牌,然后模擬洗牌,發牌等動作。

流程是這樣的:構建一副牌保存到一個數組中—洗牌—創建玩家—向玩家發牌–輸出每個玩家的牌。

#include <stdio.h>#include <stdlib.h>#include <time.h>//定義撲克的花色enum Suit{  heart,  spade,  diamond,  club,  joker1,  joker2};//一副牌的數量#define CARD_COUNT 54//定義撲克typedef struct Card{  int value;//牌的點數從1開始  enum Suit suit;//花色}Card;//定義玩家typedef struct Player{  char name[64];//玩家的名字  Card ** cards;//玩家分到的牌。每項是一個指針,指向原始一副牌數組中的一項,這樣可以節省空間  int cardsCount;//玩家分到的牌的數量}Player;//分牌完成后調用的函數的類型typedef int (*COMPARE)(Card* ,Card*);//函數聲明們char* getCardName(const Card*);Card** shuffle(const Card*);void dispatchCards(Player** ,int ,const Card** );void sort(Card**,int,COMPARE);int compare1(Card* ,Card*);int compare2(Card* ,Card*);void initOnePack();//原始一副牌所在的數組Card pokers[CARD_COUNT];//入口函數int main(void){  //初始化一副牌  initOnePack();    //洗牌,shuffledPokers保存洗后的牌們  Card** shuffledPokers = shuffle(pokers);    //構建三個玩家  Player player1;  strcpy(player1.name,"隔壁老王");  player1.cards=NULL;  player1.cardsCount=0;  Player player2;  strcpy(player2.name,"小明");  player2.cards=NULL;  player2.cardsCount=0;  Player player3;  strcpy(player3.name,"田中龜孫");  player3.cards=NULL;  player3.cardsCount=0;  //把三放到一個數組中,以傳入發牌函數中  Player* players[]={&player1,&player2,&player3};    //發牌  dispatchCards(players,sizeof(players)/sizeof(Player*),shuffledPokers);    //洗后的牌用完了,釋放之  free(shuffledPokers);  int i;    //打印出每個玩家手中的牌  for(i=0;i<sizeof(players)/sizeof(Player*);i++){        //先打印玩家的名字    printf("%s/n",players[i]->name);        //需要對玩家手中的牌排序    sort(players[i]->cards,players[i]->cardsCount,compare1);        //打印玩家手中所有的牌    int j;    for(j=0;j<players[i]->cardsCount;j++){      char * name = getCardName(players[i]->cards[j]);      printf("%s ",name);      free(name);    }    //每個玩家都需要換一次行    printf("/n");  }    //釋放玩家手中牌的數組  for(i=0;i<sizeof(players)/sizeof(Player*);i++){    free(players[i]->cards);  }  return 0;}//構造一副牌void initOnePack(){  int i=0;  //前52張  for(;i<CARD_COUNT-2;i++){    pokers[i].value=i/4+1;    pokers[i].suit = i%4;  }  //剩下的兩張:大王和小王  //joker1  pokers[i].value=i/4+1;  pokers[i].suit=joker1;  //joker2  pokers[i+1].value=i/4+2;  pokers[i+1].suit=joker2;}//洗牌,參數是原始的一副牌,返回洗完后的牌Card** shuffle(const Card* pokers){  int i;    //分牌返回牌數組的內存空間  Card** retPokers = malloc(CARD_COUNT*sizeof(Card*));  //為了不改動原始的一副牌,另建一個數組,保存原始牌的指針(注意每項不是牌,而是牌的指針)  Card** pokers2 = malloc(CARD_COUNT*sizeof(Card*));  for(i=0;i<CARD_COUNT;i++){    pokers2[i] = &pokers[i];  }    //種下隨機種子。種子取的是當前時間,    //所以保證了每次運行程序時,產生的隨機數序列不同  srand(time(NULL));    //取得隨機序號,從pokers2取出序號所指的項,把它依次加到retPokers中。  for(i=0;i<CARD_COUNT;i++){    unsigned int index = rand()%CARD_COUNT;    if(pokers2[index] != NULL){      retPokers[i] = pokers2[index];      pokers2[index]=NULL;    }else{      i--;    }  }  free(pokers2);    //返回洗完后的數組  return retPokers;}//發牌//players是玩家數組//playerCount是玩家數量//shuffledCards是洗完后的一副牌void dispatchCards(Player** players,int playerCount,const Card** shuffledCards){  //計算每個玩家手中牌的數組的容量,如果每個玩家手中的牌不一樣,  //最多就差一張,加1是為了保證數組分配的空間足夠容納分到的牌。  int numberCards = CARD_COUNT/playerCount+1;  //為每個玩家的牌數組分配空間  int i;  for(i=0;i<playerCount;i++){    Card* cards = malloc(numberCards*sizeof(Card*));    players[i]->cards = cards;  }  //輪流向每個玩家發牌  for(i=0;i<CARD_COUNT;i++){    //取當前玩家    Player *curPlayer = players[i%playerCount];    //向玩家發牌    curPlayer->cards[curPlayer->cardsCount] = shuffledCards[i];    //玩家手中實際的牌數增加    curPlayer->cardsCount++;  }}//排序函數//cards是要排序的牌,每一項是牌的指針//cardsCount是牌的數量//compare_func是比較函數void sort(Card** cards,int cardsCount,COMPARE compare_func){  int i;  for(i=0;i<cardsCount-1;i++){    int j;    for(j=0;j<cardsCount-i-1;j++){        if(compare_func(cards[j],cards[j+1])){          int tmp=cards[j];          cards[j]=cards[j+1];          cards[j+1]=tmp;        }    }  }}//比較函數,先比較點數再比較花色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;  }}//比較函數,先比較點數再比較花色int compare2(Card* a,Card* b){  if(a->value > b->value){    return 0;  }else if(a->value < b->value){    return 1;  }else{    if(a->suit > b->suit)      return 0;    else      return 1;  }}//獲取牌的名字//返回牌的名字字符串,調用者用完后需要free()之。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 = malloc(16);  //將兩個名字合并到ret中  sprintf(ret,"%s%s",suitStr,valueStr);  return ret;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肥乡县| 福清市| 海伦市| 松江区| 万全县| 巨鹿县| 桐梓县| 西华县| 庄浪县| 青河县| 榆树市| 乌审旗| 文化| 阳原县| 盐源县| 师宗县| 郁南县| 扎鲁特旗| 湟中县| 郧西县| 鹤岗市| 安康市| 绍兴县| 禹城市| 宜州市| 施秉县| 松江区| 阿城市| 大丰市| 鞍山市| 青海省| 红河县| 商城县| 郯城县| 汤阴县| 宁陵县| 定陶县| 江口县| 黑水县| 康定县| 莱州市|