亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区视频观看| 国产精品热视频| 日韩中文娱乐网| 亚洲欧美国产精品va在线观看| 日韩国产欧美精品一区二区三区| 中文字幕亚洲综合久久筱田步美| 亚洲第一区在线观看| 亚洲欧美在线一区| 亚洲第一区中文字幕| 久久久久女教师免费一区| 国产999精品久久久| 亚洲视频在线播放| 亚洲精品美女视频| 中文字幕一区日韩电影| 性亚洲最疯狂xxxx高清| 日韩禁在线播放| 久久视频在线免费观看| 亚洲精选在线观看| 岛国精品视频在线播放| 亚洲欧美中文日韩v在线观看| 久久精品国产成人精品| 大胆人体色综合| 日韩国产中文字幕| 欧美性xxxxx极品娇小| 中文字幕九色91在线| 51精品国产黑色丝袜高跟鞋| 精品国内产的精品视频在线观看| 国产精品96久久久久久又黄又硬| 久久久日本电影| 国产日韩欧美视频在线| 国产精品极品尤物在线观看| 日本一本a高清免费不卡| 成人欧美在线观看| 国产ts一区二区| 久久国产精品久久久久久久久久| 日韩久久精品成人| 精品无人国产偷自产在线| 欧美一区二区三区精品电影| 欧美激情视频在线观看| 国外成人免费在线播放| 中文字幕少妇一区二区三区| 国产成人一区二区三区小说| 国语对白做受69| 亚洲一区久久久| 91精品久久久久久| 中文字幕日韩精品在线观看| www.色综合| 国产偷国产偷亚洲清高网站| 国产成人精品一区| 懂色aⅴ精品一区二区三区蜜月| 在线精品91av| 欧美巨乳美女视频| 久久久国产精品免费| 中文字幕在线看视频国产欧美| 91网在线免费观看| 色哟哟入口国产精品| 亚洲女人天堂网| 国产精品久久久久久久久男| 国产一区二区黄| 92看片淫黄大片欧美看国产片| 日韩av手机在线观看| 国产99视频精品免视看7| 国产精品久久色| 97不卡在线视频| 国产脚交av在线一区二区| 国产欧美日韩精品丝袜高跟鞋| 国产日韩专区在线| 久久香蕉精品香蕉| 欧美日韩国产黄| 久久久久久国产精品三级玉女聊斋| 亚洲国产欧美精品| 国产成人高潮免费观看精品| 中文字幕精品视频| 日韩精品亚洲元码| 亚洲精品456在线播放狼人| 亚洲精品456在线播放狼人| 国产一区二区日韩精品欧美精品| 欧美亚洲免费电影| 中文字幕在线看视频国产欧美在线看完整| 自拍偷拍亚洲在线| 亚洲精品短视频| 国产精品999| 高跟丝袜一区二区三区| 亚洲一区二区三区xxx视频| 欧美xxxx18性欧美| 国内免费久久久久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 欧美精品www在线观看| 777午夜精品福利在线观看| 亚洲免费视频观看| 日韩av片永久免费网站| 国产亚洲一区二区在线| 成人欧美一区二区三区黑人孕妇| 亚洲大胆人体视频| 国产精品偷伦视频免费观看国产| 一区三区二区视频| 成人两性免费视频| 国产亚洲成av人片在线观看桃| 亚洲夜晚福利在线观看| 国产精品久久激情| 国产视频精品xxxx| 欧美色视频日本高清在线观看| 大量国产精品视频| 中文字幕国产亚洲2019| 精品国内亚洲在观看18黄| 欧美精品免费播放| 日韩视频一区在线| 国产欧洲精品视频| 欧美乱妇40p| 欧美日韩国产精品一区二区三区四区| 成人夜晚看av| 91精品国产亚洲| 久久成人一区二区| 欧美日韩激情视频8区| 91精品啪在线观看麻豆免费| 伊是香蕉大人久久| 亚洲网址你懂得| 亚洲aⅴ日韩av电影在线观看| 精品视频在线播放免| 日韩av电影院| 久久视频在线播放| 亚洲欧美制服第一页| 欧美巨大黑人极品精男| 91精品成人久久| 亚洲欧美日韩久久久久久| 国产欧美日韩精品专区| 亚洲情综合五月天| 97成人精品区在线播放| 97涩涩爰在线观看亚洲| 国产精品电影观看| 亚洲国产成人一区| 亚洲男女性事视频| 国模精品视频一区二区| 久久夜色精品国产欧美乱| 亚洲免费一级电影| 日韩hd视频在线观看| 法国裸体一区二区| 欧美在线一级视频| 日本精品中文字幕| 97视频在线播放| 久久精品免费播放| 久久97久久97精品免视看| 国产视频精品一区二区三区| 成人做爰www免费看视频网站| 91精品视频在线播放| 国产精品久久久久久中文字| 成人免费淫片视频软件| 亚洲最大的免费| 国产精品视频地址| 亚洲性线免费观看视频成熟| 亚洲黄色av网站| 亚洲一区二区三| 日韩国产欧美精品一区二区三区| 欧美日韩在线观看视频小说| 日韩一区二区久久久| 国产欧美一区二区三区视频| 国产在线精品成人一区二区三区| 欧美亚洲免费电影| 美女啪啪无遮挡免费久久网站| 91av视频在线观看| 欧美成人在线网站| 91久久精品一区| 国产精品天天狠天天看| 久久伊人精品一区二区三区|