#include <string.h>
#include <time.h>
#include <iostream>
using namespace std;

#define POKER_MAX 54 //54張撲克
#define POKER_COLOR_MAX 4 //四種主花色
#define POKER_POINT_MAX 13 //每種花色13張牌,J=11,Q=12,K=13
#define POKER_COLOR_KING 4 //王的花色
#define POKER_COLOR_0 0 //黑桃花色
#define POKER_COLOR_1 1 //紅桃花色
#define POKER_COLOR_2 2 //櫻花花色
#define POKER_COLOR_3 3 //方塊花色
#define POKER_KING_POINT_BIG 1 //大王的點數
#define POKER_KING_POINT_LITTLE 0 //小王的點數
typedef struct _POKER_CARD_
  {
short m_sID; //全序列排列時的ID(0~53)
char m_cColor; //撲克花色
char m_cPoint; //撲克點數
}SCard;
const unsigned long SCardSize=sizeof(SCard);
class CPoker
  {
public:
CPoker()
 {
//先整齊排列54張牌,按黑紅櫻方順序,每種花色按0~12順序
int i=0;
int j=0;
int nIndex=0;
for(i=0;i<POKER_COLOR_MAX;i++)
 {
for(j=0;j<POKER_POINT_MAX;j++)
 {
SetPokerInfo(i,j,nIndex);
nIndex++;
}
}
//王放在最后兩張
SetPokerInfo(POKER_COLOR_KING,POKER_KING_POINT_LITTLE,nIndex); //小王
nIndex++;
SetPokerInfo(POKER_COLOR_KING,POKER_KING_POINT_BIG,nIndex); //大王
}
 ~CPoker() {}
//一般說來,按牌總數決定洗牌次數,已經洗得很爛了
void Wash(int nTime=POKER_MAX)
 {
int i=0;
randIndex = 0;
for(i=0;i<nTime;i++)
Random();
}
//實際的游戲,從此處取洗好的牌張數據
bool Get(unsigned int nIndex,SCard* pCard)
 {
if(POKER_MAX<=nIndex) return false;
memcpy((char*)pCard,(char*)&m_Poker[nIndex],SCardSize);
return true;
}
void PrintInfo(void)
 {
int i=0;
SCard Card;
for(i=0;i<POKER_MAX;i++)
 {
if(Get(i,&Card))
 {
printf("%02d - ID=%02d, Color=%d, Point=%02d\n",
i,Card.m_sID,Card.m_cColor,Card.m_cPoint);
}
}
printf("===============\n");
}
private:
//給sID指定的牌張賦值
void SetPokerInfo(char cColor,char cPoint,short sID)
 {
m_Poker[sID].m_cColor=cColor;
m_Poker[sID].m_cPoint=cPoint;
m_Poker[sID].m_sID=sID;
}
//交換兩張牌
void Exchange(int a,int b)
 {
char szTemp[SCardSize];
memcpy(szTemp,(char*)&m_Poker[a],SCardSize);
memcpy((char*)&m_Poker[a],(char*)&m_Poker[b],SCardSize);
memcpy((char*)&m_Poker[b],szTemp,SCardSize);
}
int GetRandomBetween()
 {
int retVal = 0;
time_t t;
srand((unsigned) time(&t));
for(int i=0; i<54; i++)
 {
randData[i] = rand() % 54;
}
++randIndex;
if(randIndex > 53)
 {
randIndex = 0;
}
return randData[randIndex];
}
//隨機選取兩張牌張交換洗牌
//如果隨機數相等,發生碰撞,則b=a+1,總之不一樣就可以了。
void Random(void)
 {
int a=0;
int b=0;
a = GetRandomBetween();
b = GetRandomBetween();
//printf("%d---%d\n",a,b);
if(a==b)
 {
b=a+1;
if(POKER_MAX<=b) b=0;
}
Exchange(a,b);
}
private:
SCard m_Poker[POKER_MAX];
int randData[54];
int randIndex;
};

執行主函數
#include "stdafx.h"
#include "CPoker.h"

int main(int argc, char* argv[])
  {
CPoker Poker;
srand((unsigned int)time(NULL));
Poker.PrintInfo();
Poker.Wash();
Poker.PrintInfo();
Poker.Wash();
Poker.PrintInfo();

return 0;
}


|