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&lt;card&gt;(如std::vector&lt;card&gt; deck;)。

您几乎不需要在 C++ 中显式使用 new。对动态数组使用像 std::vector 这样的容器。在需要堆分配对象的地方使用std::unique_ptrstd::shared_ptr

【讨论】:

以上是关于C ++如何为纸牌游戏求和?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 C/C++ 编写二进制算法

如何为类的每个实例创建实例特定的方法?

如何用VB编程开发纸牌接龙游戏?

如何为Windows控制台选择光栅字体?

简单21点纸牌小游戏纸牌显示的修改

如何为非托管 c dll 创建 c++\cli 包装器