如何实现向扑克牌Deck插入Card并完成排序功能?
C++扑克牌程序insert函数实现方案
以下是完整的实现步骤,包含核心代码编写和逻辑说明:
1. 完善核心数据结构(Deck.h)
首先确保Card结构体具备排序所需的比较逻辑,Deck类包含必要的成员与接口:
#ifndef DECK_H #define DECK_H #include <vector> #include <string> // 定义花色与点数枚举 enum class Suit { HEARTS, DIAMONDS, CLUBS, SPADES }; enum class Rank { ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING }; struct Card { Suit suit; Rank rank; // 重载<运算符,用于牌组排序(先花色后点数) bool operator<(const Card& other) const { if (suit != other.suit) { return suit < other.suit; } return rank < other.rank; } // 转换为可读字符串用于输出 std::string toString() const; }; class Deck { private: std::vector<Card> cards; void initializeDeck(); // 初始化标准52张牌 public: Deck(); void shuffleDeck(); // 洗牌 void insert(const Card& newCard); // 插入新牌并排序 void printDeck() const; // 打印牌组 }; #endif
2. 实现各类方法(Deck.cpp)
重点完成insert函数的核心逻辑:插入新牌后调用排序接口,同时实现其他辅助方法:
#include "Deck.h" #include <algorithm> #include <random> #include <iostream> // 转换Card为可读字符串 std::string Card::toString() const { std::string rankStr; switch (rank) { case Rank::ACE: rankStr = "A"; break; case Rank::TWO: rankStr = "2"; break; case Rank::THREE: rankStr = "3"; break; case Rank::FOUR: rankStr = "4"; break; case Rank::FIVE: rankStr = "5"; break; case Rank::SIX: rankStr = "6"; break; case Rank::SEVEN: rankStr = "7"; break; case Rank::EIGHT: rankStr = "8"; break; case Rank::NINE: rankStr = "9"; break; case Rank::TEN: rankStr = "10"; break; case Rank::JACK: rankStr = "J"; break; case Rank::QUEEN: rankStr = "Q"; break; case Rank::KING: rankStr = "K"; break; } std::string suitStr; switch (suit) { case Suit::HEARTS: suitStr = "♥"; break; case Suit::DIAMONDS: suitStr = "♦"; break; case Suit::CLUBS: suitStr = "♣"; break; case Suit::SPADES: suitStr = "♠"; break; } return rankStr + suitStr; } // 构造函数:初始化标准牌组 Deck::Deck() { initializeDeck(); } // 生成52张标准扑克牌 void Deck::initializeDeck() { cards.clear(); for (int s = 0; s < 4; ++s) { Suit suit = static_cast<Suit>(s); for (int r = 1; r <= 13; ++r) { Rank rank = static_cast<Rank>(r); cards.push_back({suit, rank}); } } } // 洗牌:使用C++11标准的随机数引擎 void Deck::shuffleDeck() { std::random_device rd; std::mt19937 g(rd()); std::shuffle(cards.begin(), cards.end(), g); } // 核心insert函数:插入新牌后重新排序 void Deck::insert(const Card& newCard) { cards.push_back(newCard); // 利用Card重载的<运算符完成排序 std::sort(cards.begin(), cards.end()); } // 打印牌组,每13张换行 void Deck::printDeck() const { int count = 0; for (const auto& card : cards) { std::cout << card.toString() << " "; count++; if (count % 13 == 0) { std::cout << std::endl; } } if (count % 13 != 0) { std::cout << std::endl; } }
3. 主函数调用流程(main.cpp)
按照需求完成完整的流程测试:
#include "Deck.h" #include <iostream> int main() { Deck myDeck; // 输出初始有序牌组 std::cout << "=== 初始牌组 ===" << std::endl; myDeck.printDeck(); // 洗牌并输出 myDeck.shuffleDeck(); std::cout << "\n=== 洗牌后的牌组 ===" << std::endl; myDeck.printDeck(); // 插入一张新牌(示例:红桃A)并输出排序后的结果 Card newCard = {Suit::HEARTS, Rank::ACE}; myDeck.insert(newCard); std::cout << "\n=== 插入红桃A并排序后的牌组 ===" << std::endl; myDeck.printDeck(); return 0; }
关键注意点
- 排序逻辑自定义:如果需要修改排序规则,可修改
Card::operator<的实现,或在std::sort中传入lambda表达式作为比较器。 - 去重可选:若需要避免重复牌,可在
insert函数中先遍历牌组或用std::find_if检查是否存在相同牌,再决定是否插入。 - 洗牌可靠性:使用
std::shuffle配合std::mt19937比旧版random_shuffle的随机效果更稳定一致。
内容的提问来源于stack exchange,提问作者Galaxify
相关产品推荐
相关产品推荐

