21点又叫BlankJack是一种比较大众化的游戏,一直以来都在玩别人写的游戏,感觉可以自己写一个游戏,然后让别人去玩,就这样写了21点,写的不是很好,希望大家指正!
设计思路及实现:
1.扑克有54张,21点只用到了52张A-k,因此需要定义一个结构体去模拟扑克扑克,两个常量数组去模拟扑克的花色和数字,如下:
//! \brief 扑克结构体
struct Card
{
string strType;
string nNumber;
};
//! \brief 扑克四种花色
const string m_arrColor[4] = {"黑桃", "红桃", "方块", "梅花"};
//! \brief 扑克A-K数组
const string m_arrPick[13] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
2.初始化扑克结构,将每次初始化的一张扑克存到一个长度为52的数组中,这样就相当于,初始化了一幅除过大小王之外的A-k的52张扑克,代码如下:
//! \brief 52 张扑克牌数组
Card m_arrPoker[52];
void BlackJack::Init()
{
Card cards;
for (int i = 0; i < 52; ++i)
{
cards.strType = m_arrColor[i % 4];
cards.nNumber = m_arrPick [i / 4];
m_arrPoker[i] = cards;
}
}
3.洗牌,其原理就是用Rand()产生的随机数对52取余数,将产生的两个数字所对应的扑克交换位置,n次之后认为扑克已经洗好,本游戏设定n=1000,实现如下:
//=====================================================
//! \brief 交换扑克牌
//! \params
//! \remarks
//! \return
//! \attention
void BlackJack::Swap(int &nNum1, int &nNum2)
{
Card tempCard;
tempCard = m_arrPoker[nNum1];
m_arrPoker[nNum1] = m_arrPoker[nNum2];
m_arrPoker[nNum2] = tempCard;
}
//=====================================================
//! \brief 洗牌
//! \params
//! \remarks
//! \return
//! \attention
void BlackJack::Shuffle()
{
m_nCount = 0;
srand(static_cast<int>(time(NULL)));
int a = 0;
int b = 0;
for (int i = 0; i < 1000; ++i)
{
a = rand() % 52;
b = rand() % 52;
Swap(a, b);
}
}
4.抓牌,有个计数器,用于记录到第几张扑克,通过这个计数器,取出所对应的扑克即为抓牌。主要有玩家抓牌和庄家抓牌。
//=====================================================
//! \brief 给玩家发牌
//! \params
//! \remarks
//! \return
//! \attention
void BlackJack::PlayerDeal()
{
if (m_nCount >= 52)
{
m_nCount = 0;
m_arrBanker.clear();
m_arrPlayer.clear();
Init();
Shuffle();
m_arrPlayer.push_back(m_arrPoker[m_nCount]);
}
else
{
m_arrPlayer.push_back(m_arrPoker[m_nCount++]);
}
}
//=====================================================
//! \brief 给庄家发牌
//! \params
//! \remarks
//! \return
//! \attention
void BlackJack::BankerDeal()
{
if (m_nCount >= 52)
{
m_nCount = 0;
m_arrBanker.clear();
m_arrPlayer.clear();
Init();
Shuffle();
m_arrPlayer.push_back(m_arrPoker[m_nCount]);
}
else
{
m_arrBanker.push_back(m_arrPoker[m_nCount++]);
}
}
5.结果,比较庄家和玩家手中的扑克牌,如果在不超出21点的情况下谁的点数大谁算赢!