C++ 扑克牌类设计与实现:洗牌、抽牌、游戏模拟
以下是使用 C++ 实现的扑克牌类 Card,并编写了测试程序来模拟两个玩家抽取牌并判断输赢的示例代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
enum class Suit {
Spades,
Hearts,
Diamonds,
Clubs
};
enum class Rank {
Ace = 1,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King
};
class Card {
public:
Card(Suit s, Rank r) : suit(s), rank(r) {}
Suit getSuit() const { return suit; }
Rank getRank() const { return rank; }
void displayCard() const {
switch (suit) {
case Suit::Spades:
std::cout << 'Spades '; // 双引号改为单引号
break;
case Suit::Hearts:
std::cout << 'Hearts '; // 双引号改为单引号
break;
case Suit::Diamonds:
std::cout << 'Diamonds '; // 双引号改为单引号
break;
case Suit::Clubs:
std::cout << 'Clubs '; // 双引号改为单引号
break;
}
switch (rank) {
case Rank::Ace:
std::cout << 'Ace'; // 双引号改为单引号
break;
case Rank::Two:
std::cout << 'Two'; // 双引号改为单引号
break;
case Rank::Three:
std::cout << 'Three'; // 双引号改为单引号
break;
case Rank::Four:
std::cout << 'Four'; // 双引号改为单引号
break;
case Rank::Five:
std::cout << 'Five'; // 双引号改为单引号
break;
case Rank::Six:
std::cout << 'Six'; // 双引号改为单引号
break;
case Rank::Seven:
std::cout << 'Seven'; // 双引号改为单引号
break;
case Rank::Eight:
std::cout << 'Eight'; // 双引号改为单引号
break;
case Rank::Nine:
std::cout << 'Nine'; // 双引号改为单引号
break;
case Rank::Ten:
std::cout << 'Ten'; // 双引号改为单引号
break;
case Rank::Jack:
std::cout << 'Jack'; // 双引号改为单引号
break;
case Rank::Queen:
std::cout << 'Queen'; // 双引号改为单引号
break;
case Rank::King:
std::cout << 'King'; // 双引号改为单引号
break;
}
std::cout << std::endl;
}
private:
Suit suit;
Rank rank;
};
class DeckOfCards {
public:
DeckOfCards() {
int card = 0;
for (int i = 0; i < static_cast<int>(Suit::Clubs) + 1; i++) {
for (int j = 1; j < static_cast<int>(Rank::King) + 1; j++) {
cards[card++] = Card(static_cast<Suit>(i), static_cast<Rank>(j));
}
}
}
void shuffle() {
std::srand(static_cast<unsigned int>(std::time(nullptr)));
for (int i = 0; i < 52; i++) {
int j = std::rand() % 52;
std::swap(cards[i], cards[j]);
}
}
Card pick() {
return cards[nextCard++];
}
private:
Card cards[52];
int nextCard = 0;
};
int main() {
DeckOfCards deck;
deck.shuffle();
Card player1Cards[3];
Card player2Cards[3];
for (int i = 0; i < 3; i++) {
player1Cards[i] = deck.pick();
player2Cards[i] = deck.pick();
}
std::cout << 'Player 1 cards:' << std::endl; // 双引号改为单引号
for (const auto& card : player1Cards) {
card.displayCard();
}
std::cout << std::endl;
std::cout << 'Player 2 cards:' << std::endl; // 双引号改为单引号
for (const auto& card : player2Cards) {
card.displayCard();
}
std::cout << std::endl;
int player1Points = 0;
int player2Points = 0;
for (const auto& card : player1Cards) {
player1Points += static_cast<int>(card.getRank());
}
for (const auto& card : player2Cards) {
player2Points += static_cast<int>(card.getRank());
}
std::cout << 'Player 1 total points: ' << player1Points << std::endl; // 双引号改为单引号
std::cout << 'Player 2 total points: ' << player2Points << std::endl; // 双引号改为单引号
if (player1Points > player2Points) {
std::cout << 'Player 1 wins!' << std::endl; // 双引号改为单引号
} else if (player1Points < player2Points) {
std::cout << 'Player 2 wins!' << std::endl; // 双引号改为单引号
} else {
std::cout << 'It's a tie!' << std::endl; // 双引号改为单引号
}
return 0;
}
这段代码首先定义了一个Card类来表示一张牌,包含花色和点数属性以及显示牌面的方法。然后定义了一个DeckOfCards类来表示一副牌,包含洗牌和抽牌的操作。在main函数中,首先创建了一副牌,并进行洗牌操作。然后模拟两个玩家各抽取3张牌,并显示双方牌面。接着根据牌面的点数计算双方总点数,并判断输赢。
请注意,这只是一个简单的示例代码,仅用于演示如何实现并使用扑克牌类。在实际的扑克游戏中,可能需要更复杂的逻辑和规则。
原文地址: https://www.cveoy.top/t/topic/bC6d 著作权归作者所有。请勿转载和采集!