C++ 如何为一个纸牌游戏求和?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 如何为一个纸牌游戏求和?相关的知识,希望对你有一定的参考价值。
我正在创建一个非常类似于21点的游戏,但直到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
最简单的方法可能是将牌的值存储在牌本身--但在21点中,A牌可以是1或11,这取决于其他牌的值,所以你也需要考虑到这一点。
所以,在 card
你可以加一个 int value
其中A为1,皇牌为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;
. 你在这里管理自己的内存,你的实现违反了 三五之尊. 相反,使用 std::vector<card>
宛如 std::vector<card> deck;
).
您几乎不需要明确地使用 new
在C++中。使用一个像 std::vector
用于动态数组。使用 std::unique_ptr
或 std::shared_ptr
在那里你需要堆分配对象。
以上是关于C++ 如何为一个纸牌游戏求和?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?
android如何为片段按钮设置OnClickListener