C ++如何为纸牌游戏求和?
Posted
技术标签:
【中文标题】C ++如何为纸牌游戏求和?【英文标题】:C++ How to sum cards for a card game? 【发布时间】:2020-04-22 16:39:07 【问题描述】:所以,我正在创建一个与二十一点非常相似的游戏,但直到 31 而不是 21。这段代码几乎打印了牌组,然后再洗牌。我应该如何使卡片具有 int 值以便我可以添加它们?例如,我会给用户 2 张卡片,然后显示这 2 张卡片的总和并询问他是否还想要一张卡片。如果用户停止,则轮到庄家。
#include <iostream>
#include <ctime>
#include<string>
#include<cstdlib>
#include "card.h"
#include<iomanip>
using namespace std;
const int CARDS_PER_DECK = 52;
class deckOfCards
public:
deckOfCards();
void shuffle();
card dealCard();
void printDeck() const;
private:
card* deck;
int currentCard;
;
//prints the deck
void deckOfCards::printDeck() const
cout << left;
for (int i = 0; i < CARDS_PER_DECK; i++)
cout << setw(19) << deck[i].print();
if ((i + 1) % 4 == 0)
cout << endl;
//the deck
deckOfCards::deckOfCards()
string faces[] = "A","2","3","4","5","6","7","8","9","10","J","Q","K" ;
string suits[] = "H","D","C","S" ;
deck = new card[CARDS_PER_DECK];
currentCard = 0;
for (int count = 0; count < CARDS_PER_DECK; count++) //populate the deck in order
deck[count] = card(faces[count % 13], suits[count / 13]);
//shuffles the cards
void deckOfCards::shuffle()
currentCard = 0;
for (int first = 0; first < CARDS_PER_DECK; first++)
int second = (rand() + time(0)) % CARDS_PER_DECK;
card temp = deck[first];
deck[first] = deck[second];
deck[second] = temp;
card deckOfCards::dealCard()
if (currentCard > CARDS_PER_DECK)
shuffle();
if (currentCard < CARDS_PER_DECK)
return(deck[currentCard++]);
return(deck[0]);
int main()
deckOfCards deck;
card currentCard;
deck.printDeck();
deck.shuffle();
cout << endl << endl;
deck.printDeck();
deck.shuffle();
cout << endl << endl;
for (int i = 0; i < 2; i++)
int sum;
currentCard = deck.dealCard();
cout << currentCard.print() << endl;
return 0;
卡.h
#ifndef H_card
#define H_card
#include <string>
#include <iostream>
using namespace std;
class card
public:
card(string cardFace, string cardSuit);
string print() const;
card();
private:
string face;
string suit;
;
card::card()
card::card(string cardFace, string cardSuit)
face = cardFace;
suit = cardSuit;
string card::print() const
return (face + " " + suit);
#endif
【问题讨论】:
能看到card
类型的定义吗?
【参考方案1】:
解决此问题的最简单方法可能是将值存储在卡本身上 - 但在二十一点中,A 可以是 1 或 11,具体取决于其余卡的值,因此您需要也能够解释这一点。
因此,在 card
上,您可以添加 int value
,即 1 代表 Ace,10 代表版税,以及其他卡片的面值。
int values[] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 ;
(创建卡片时,您也可以将值计算为std::max(count + 1, 10)
,而不是使用数组。)
现在您需要一种方法来对当前手牌中的牌进行评分。这是一个可以与任何卡片容器一起使用的通用函数:
template <typename T>
int score_hand(T const & cards)
int score = 0;
bool ace = false;
for (card const & c : cards)
if (c.value == 1 && !ace)
ace = true;
score += 11;
else
score += c.value;
if (ace && score > 31)
score -= 10;
return score;
作为旁注,套牌不应声明为card* deck;
。你在这里管理自己的内存,你的实现违反了rule of three/five。而是使用std::vector<card>
(如std::vector<card> deck;
)。
您几乎不需要在 C++ 中显式使用 new
。对动态数组使用像 std::vector
这样的容器。在需要堆分配对象的地方使用std::unique_ptr
或std::shared_ptr
。
【讨论】:
以上是关于C ++如何为纸牌游戏求和?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 C++0x/11 和非 C++0x/11 制作标头? [复制]