21点游戏C++模拟

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点的情况下谁的点数大谁算赢!


代码具体实现见:http://download.csdn.net/detail/haoswich/6461061

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值