• Bio

    #include #include #include #include #include #include #include

    using namespace std;

    // 卡牌类 class Card { private: char group; // 牌组:'a', 'b', 'c' int number; // 数字:1, 2, 3

    public: // 构造函数 Card(char g = 'a', int n = 1) : group(g), number(n) {}

    // 获取牌组
    char getGroup() const { return group; }
    
    // 获取数字
    int getNumber() const { return number; }
    
    // 比较两张牌的大小
    // 返回: 1表示this牌赢,-1表示this牌输,0表示平局
    int compare(const Card& other) const {
        // 如果两张牌完全相同
        if (group == other.group && number == other.number) {
            return 0;  // 平局,一起丢弃
        }
        
        // 检查循环克制关系
        // a > b, b > c, c > a
        if ((group == 'a' && other.group == 'b') ||
            (group == 'b' && other.group == 'c') ||
            (group == 'c' && other.group == 'a')) {
            return 1;  // this牌赢
        }
        
        if ((other.group == 'a' && group == 'b') ||
            (other.group == 'b' && group == 'c') ||
            (other.group == 'c' && group == 'a')) {
            return -1;  // this牌输
        }
        
        // 同一牌组,比较数字
        if (group == other.group) {
            if (number < other.number) {
                return -1;  // this牌数字小,输
            } else {
                return 1;   // this牌数字大,赢
            }
        }
        
        return 0; // 理论上不会到达这里
    }
    
    // 获取牌的名字
    string getName() const {
        return string(1, group) + to_string(number);
    }
    
    // 从字符串创建卡牌
    static Card fromString(const string& cardStr) {
        if (cardStr.length() < 2) {
            throw invalid_argument("无效的卡牌格式");
        }
        char g = tolower(cardStr[0]);
        int n = cardStr[1] - '0';
        if (g != 'a' && g != 'b' && g != 'c') {
            throw invalid_argument("无效的牌组");
        }
        if (n < 1 || n > 3) {
            throw invalid_argument("无效的数字");
        }
        return Card(g, n);
    }
    

    };

    // 玩家类 class Player { private: int id; // 玩家ID vector hand; // 手牌 vector lostPile; // 失去的牌堆 bool isHuman; // 是否为人类玩家

    public: // 构造函数 Player(int playerId = 1, bool human = false) : id(playerId), isHuman(human) {}

    // 初始化手牌
    void initializeHand() {
        hand.clear();
        // 添加9张牌:a1, a2, a3, b1, b2, b3, c1, c2, c3
        for (char group : {'a', 'b', 'c'}) {
            for (int num = 1; num <= 3; num++) {
                hand.push_back(Card(group, num));
            }
        }
    }
    
    // 打印手牌
    void printHand() const {
        cout << "玩家" << id << "手牌(" << hand.size() << "张): ";
        for (size_t i = 0; i < hand.size(); i++) {
            cout << hand[i].getName();
            if (i < hand.size() - 1) cout << " ";
        }
        cout << endl;
    }
    
    // 获取手牌数量
    int getHandSize() const {
        return hand.size();
    }
    
    // 检查手牌是否为空
    bool hasCards() const {
        return !hand.empty();
    }
    
    // 检查手牌中是否有某张牌
    bool hasCard(const Card& card) const {
        for (const auto& c : hand) {
            if (c.getGroup() == card.getGroup() && c.getNumber() == card.getNumber()) {
                return true;
            }
        }
        return false;
    }
    
    // 检查手牌中是否有某张牌(按名字)
    bool hasCard(const string& cardName) const {
        try {
            Card targetCard = Card::fromString(cardName);
            return hasCard(targetCard);
        } catch (const invalid_argument&) {
            return false;
        }
    }
    
    // 从手牌中移除一张牌
    bool removeCard(const Card& card) {
        for (auto it = hand.begin(); it != hand.end(); ++it) {
            if (it->getGroup() == card.getGroup() && it->getNumber() == card.getNumber()) {
                hand.erase(it);
                return true;
            }
        }
        return false;
    }
    
    // 添加一张牌到手牌
    void addToHand(const Card& card) {
        hand.push_back(card);
    }
    
    // 添加一张牌到失去的牌堆
    void addToLostPile(const Card& card) {
        lostPile.push_back(card);
    }
    
    // 获取玩家ID
    int getID() const {
        return id;
    }
    
    // 检查是否为人类玩家
    bool isHumanPlayer() const {
        return isHuman;
    }
    
    // 人类玩家选择出牌
    Card playHumanCard() {
        if (hand.empty()) {
            throw runtime_error("玩家" + to_string(id) + "没有手牌可以出!");
        }
        
        cout << "你的手牌: ";
        for (size_t i = 0; i < hand.size(); i++) {
            cout << hand[i].getName();
            if (i < hand.size() - 1) cout << " ";
        }
        cout << endl;
        
        string choice;
        while (true) {
            cout << "请选择要出的牌 (例如: a1, b2, c3): ";
            cin >> choice;
            
            // 转换为小写
            transform(choice.begin(), choice.end(), choice.begin(), ::tolower);
            
            // 检查输入是否有效
            if (choice.length() != 2) {
                cout << "输入格式错误!请使用字母+数字格式,如 a1" << endl;
                continue;
            }
            
            // 检查手牌中是否有这张牌
            if (hasCard(choice)) {
                Card card = Card::fromString(choice);
                removeCard(card);
                return card;
            } else {
                cout << "你没有这张牌!请重新选择。" << endl;
            }
        }
    }
    
    // 电脑玩家选择出牌
    Card playComputerCard() {
        if (hand.empty()) {
            throw runtime_error("玩家" + to_string(id) + "没有手牌可以出!");
        }
        
        // 随机选择一张牌
        int index = rand() % hand.size();
        Card card = hand[index];
        
        // 从手牌中移除
        hand.erase(hand.begin() + index);
        
        return card;
    }
    
    // 打印失去的牌
    void printLostPile() const {
        if (lostPile.empty()) {
            cout << "玩家" << id << "失去的牌堆: 空" << endl;
            return;
        }
        
        cout << "玩家" << id << "失去的牌堆: ";
        for (size_t i = 0; i < lostPile.size(); i++) {
            cout << lostPile[i].getName();
            if (i < lostPile.size() - 1) cout << " ";
        }
        cout << endl;
    }
    

    };

    // 游戏类 class Game { private: Player player1; // 玩家1(用户) Player player2; // 玩家2(电脑) int roundNumber; // 当前轮数

    public: // 构造函数 Game() : player1(1, true), player2(2, false), roundNumber(0) { srand(time(0)); // 初始化随机数种子 }

    // 显示游戏规则
    void displayRules() {
        cout << "================================================================" << endl;
        cout << "                        卡牌对战游戏规则                         " << endl;
        cout << "================================================================" << endl;
        cout << "1. 两个玩家,初始各有9张牌: a1 a2 a3 b1 b2 b3 c1 c2 c3" << endl;
        cout << "2. 牌组克制关系: a > b, b > c, c > a" << endl;
        cout << "3. 同组牌按数字比较: 数字小的牌输" << endl;
        cout << "4. 每轮双方各出一张牌:" << endl;
        cout << "   - 如果牌不同: 牌小的玩家将这张牌给对方" << endl;
        cout << "   - 如果牌完全相同: 两张牌一起丢弃" << endl;
        cout << "5. 当一方手牌为空时游戏结束" << endl;
        cout << "================================================================" << endl;
        cout << endl;
        cout << "克制关系详解:" << endl;
        cout << "  a组牌 > b组牌  (例如: a1赢b1, a2赢b2, a3赢b3)" << endl;
        cout << "  b组牌 > c组牌  (例如: b1赢c1, b2赢c2, b3赢c3)" << endl;
        cout << "  c组牌 > a组牌  (例如: c1赢a1, c2赢a2, c3赢a3)" << endl;
        cout << "  同组内比较: 数字小的输 (例如: a1 < a2 < a3)" << endl;
        cout << "================================================================" << endl;
    }
    
    // 初始化游戏
    void initialize() {
        cout << "\n================================================================" << endl;
        cout << "                          游戏开始                              " << endl;
        cout << "================================================================" << endl;
        cout << "玩家1: 你" << endl;
        cout << "玩家2: 电脑" << endl;
        cout << "================================================================\n" << endl;
        
        player1.initializeHand();
        player2.initializeHand();
        
        roundNumber = 0;
        
        cout << "游戏初始化完成!" << endl;
    }
    
    // 执行一轮游戏
    bool playRound() {
        roundNumber++;
        cout << "\n================================================================" << endl;
        cout << "                           第 " << roundNumber << " 轮                           " << endl;
        cout << "================================================================" << endl;
        
        // 检查双方是否有手牌
        if (!player1.hasCards() || !player2.hasCards()) {
            cout << "有玩家没有手牌,游戏结束!" << endl;
            return false;
        }
        
        Card card1, card2;
        
        // 玩家1(用户)先出牌(不能看到电脑的牌)
        cout << "\n--- 你的回合 ---" << endl;
        card1 = player1.playHumanCard();
        
        // 玩家2(电脑)出牌
        cout << "\n--- 电脑出牌 ---" << endl;
        card2 = player2.playComputerCard();
        cout << "电脑出了: " << card2.getName() << endl;
        
        // 显示对战结果
        cout << "\n--- 对战结果 ---" << endl;
        cout << "你: " << card1.getName() << "  vs  电脑: " << card2.getName() << endl;
        
        // 比较两张牌
        int result = card1.compare(card2);
        
        // 处理比较结果
        if (result == 0) {
            // 平局:两张牌完全相同,一起丢弃
            cout << "平局!两张牌 " << card1.getName() << " 一起丢弃" << endl;
            
            // 将牌添加到失去的牌堆
            player1.addToLostPile(card1);
            player2.addToLostPile(card2);
            
        } else if (result == 1) {
            // 玩家1赢,玩家2输
            cout << "你赢了!电脑的 " << card2.getName() << " 给你" << endl;
            
            // 玩家1获得玩家2的牌
            player1.addToHand(card2);
            // 玩家2失去自己的牌
            player2.addToLostPile(card2);
            // 玩家1保留自己的牌
            player1.addToHand(card1);
            
        } else {
            // 玩家2赢,玩家1输
            cout << "电脑赢!你的 " << card1.getName() << " 给电脑" << endl;
            
            // 玩家2获得玩家1的牌
            player2.addToHand(card1);
            // 玩家1失去自己的牌
            player1.addToLostPile(card1);
            // 玩家2保留自己的牌
            player2.addToHand(card2);
        }
        
        // 显示当前状态
        cout << "\n--- 当前状态 ---" << endl;
        player1.printHand();
        player2.printHand();
        
        return true;
    }
    
    // 判断游戏是否结束
    bool isGameOver() const {
        return !player1.hasCards() || !player2.hasCards();
    }
    
    // 显示最终结果
    void displayResults() {
        cout << "\n================================================================" << endl;
        cout << "                          游戏结束                              " << endl;
        cout << "================================================================" << endl;
        cout << "总回合数: " << roundNumber << endl;
        
        cout << "\n--- 失去的牌堆 ---" << endl;
        player1.printLostPile();
        player2.printLostPile();
        
        cout << "\n--- 最终手牌 ---" << endl;
        cout << "你: ";
        if (player1.hasCards()) {
            player1.printHand();
        } else {
            cout << "无手牌" << endl;
        }
        
        cout << "电脑: ";
        if (player2.hasCards()) {
            player2.printHand();
        } else {
            cout << "无手牌" << endl;
        }
        
        // 判断胜负
        cout << "\n--- 游戏结果 ---" << endl;
        int player1Cards = player1.getHandSize();
        int player2Cards = player2.getHandSize();
        
        if (player1Cards > player2Cards) {
            cout << "恭喜你获胜!剩余手牌: " << player1Cards << "张" << endl;
        } else if (player2Cards > player1Cards) {
            cout << "电脑获胜!你的剩余手牌: " << player1Cards << "张" << endl;
        } else {
            cout << "平局!双方剩余手牌都是 " << player1Cards << "张" << endl;
        }
        
        cout << "================================================================" << endl;
    }
    
    // 运行完整游戏
    void run() {
        displayRules();
        
        char ready;
        cout << "按回车键开始游戏...";
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.get();
        
        initialize();
        
        // 进行多轮游戏直到一方手牌为空
        while (!isGameOver() && roundNumber < 100) {
            if (!playRound()) {
                break;
            }
            
            // 如果不是游戏结束,暂停并继续
            if (!isGameOver()) {
                cout << "\n按回车键继续下一轮...";
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cin.get();
            }
        }
        
        displayResults();
    }
    

    };

    // 主函数 int main() { cout << "" << endl; cout << " 卡牌对战游戏 v1.0 " << endl; cout << "" << endl;

    char playAgain;
    do {
        Game game;
        game.run();
        
        cout << "\n想再玩一次吗?(y/n): ";
        cin >> playAgain;
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        
        playAgain = tolower(playAgain);
    } while (playAgain == 'y');
    
    cout << "\n感谢游玩!再见!" << endl;
    cout << "================================================================" << endl;
    
    return 0;
    

    }

    huanglexi1314520

  • Recent Activities