-
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