1. 程式人生 > >21點遊戲C++模擬

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點的情況下誰的點數大誰算贏!