21點遊戲C++模擬
阿新 • • 發佈:2019-02-18
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點的情況下誰的點數大誰算贏!