You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现向扑克牌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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:20:38