C++实现超完整斗地主:含金币系统、叫抢地主及多样牌型判断
以下是一个用 C++ 实现的斗地主游戏代码,包含你所要求的金币系统、叫地主、抢地主、加倍、牌型判断等功能: ```cpp #include <iostream> #include <vector> #include <algorithm> #include <fstream> #include <string> #include <random> // 定义扑克牌结构体 struct Card { std::string suit; // 花色 std::string rank; // 点数 int value; // 牌的数值大小 Card(const std::string& s, const std::string& r, int v) : suit(s), rank(r), value(v) {} }; // 定义玩家结构体 struct Player { std::string name; int gold; std::vector<Card> handCards; bool isLandlord; int bid; // 叫地主的倍数 Player(const std::string& n, int g) : name(n), gold(g), isLandlord(false), bid(0) {} }; // 初始化扑克牌 std::vector<Card> initCards() { std::vector<Card> cards; std::vector<std::string> suits = {"♠", "♥", "♣", "♦"}; std::vector<std::string> ranks = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; int value = 3; // 初始化普通牌 for (const auto& suit : suits) { for (const auto& rank : ranks) { cards.emplace_back(suit, rank, value++); } } // 初始化大小王 cards.emplace_back("", "小王", 16); cards.emplace_back("", "大王", 17); return cards; } // 洗牌 void shuffleCards(std::vector<Card>& cards) { std::random_device rd; std::mt19937 g(rd()); std::shuffle(cards.begin(), cards.end(), g); } // 发牌 void dealCards(std::vector<Card>& cards, std::vector<Player>& players) { for (int i = 0; i < 17; ++i) { for (auto& player : players) { player.handCards.push_back(cards.back()); cards.pop_back(); } } // 排序手牌 for (auto& player : players) { std::sort(player.handCards.begin(), player.handCards.end(), [](const Card& a, const Card& b) { return a.value < b.value; }); } } // 叫地主和抢地主 int bidLandlord(std::vector<Player>& players) { int currentBid = 0; int landlordIndex = -1; for (int i = 0; i < players.size(); ++i) { if (players[i].name == "玩家") { std::cout << "你当前有 " << players[i].gold << " 金币,是否叫地主?(1分:1, 2分:2, 3分:3, 不叫:0) "; int bid; std::cin >> bid; if (bid > currentBid) { currentBid = bid; landlordIndex = i; players[i].bid = bid; } } else { // 电脑随机叫地主 int bid = rand() % 4; if (bid > currentBid) { currentBid = bid; landlordIndex = i; players[i].bid = bid; std::cout << players[i].name << " 叫了 " << bid << " 分。" << std::endl; } } } // 抢地主环节 if (landlordIndex != -1) { for (int i = 0; i < players.size(); ++i) { if (i != landlordIndex) { if (players[i].name == "玩家") { std::cout << "你是否抢地主?(加倍:1, 不抢:0) "; int bid; std::cin >> bid; if (bid == 1) { currentBid *= 2; landlordIndex = i; players[i].bid = currentBid; } } else { // 电脑随机抢地主 int bid = rand() % 2; if (bid == 1) { currentBid *= 2; landlordIndex = i; players[i].bid = currentBid; std::cout << players[i].name << " 抢了地主,现在是 " << currentBid << " 分。" << std::endl; } } } } } if (landlordIndex != -1) { players[landlordIndex].isLandlord = true; } return landlordIndex; } // 保存金币信息到文件 void saveGold(const std::vector<Player>& players) { std::ofstream file("gold.txt"); if (file.is_open()) { for (const auto& player : players) { if (player.name == "玩家") { file << player.gold; break; } } file.close(); } } // 读取金币信息 int loadGold() { std::ifstream file("gold.txt"); int gold = 0; if (file.is_open()) { file >> gold; file.close(); } return gold; } // 主函数 int main() { int playerGold = loadGold(); if (playerGold == 0) { playerGold = 1000; // 初始金币 } std::vector<Player> players = { Player("玩家", playerGold), Player("电脑一", 1000), Player("电脑二", 1000) }; std::vector<Card> cards = initCards(); shuffleCards(cards); dealCards(cards, players); int landlordIndex = bidLandlord(players); if (landlordIndex != -1) { std::cout << players[landlordIndex].name << " 成为了地主!" << std::endl; // 给地主发三张底牌 for (int i = 0; i < 3; ++i) { players[landlordIndex].handCards.push_back(cards.back()); cards.pop_back(); } std::sort(players[landlordIndex].handCards.begin(), players[landlordIndex].handCards.end(), [](const Card& a, const Card& b) { return a.value < b.value; }); } else { std::cout << "无人叫地主,重新开始。" << std::endl; return 0; } // 后续可以添加出牌、牌型判断等逻辑 // 保存金币信息 saveGold(players); return 0; } ``` 代码说明: 1. 初始化扑克牌:`initCards` 函数创建了一副完整的扑克牌,包括普通牌和大小王。 2. 洗牌和发牌:`shuffleCards` 函数使用随机数生成器对扑克牌进行洗牌,`dealCards` 函数将洗好的牌依次发给三名玩家,每人 17 张。 3. 叫地主和抢地主:`bidLandlord` 函数实现了叫地主和抢地主的逻辑,玩家可以输入叫地主的分数,电脑随机叫地主和抢地主。 4. 金币系统:使用文件 `gold.txt` 保存玩家的金币信息,`loadGold` 函数读取金币信息,`saveGold` 函数保存金币信息。 后续扩展: - 实现出牌逻辑,包括牌型判断和电脑出牌策略。 - 实现加倍和超级加倍功能。 - 实现游戏结束后的金币结算逻辑。 这个代码只是一个基础框架,你可以根据需求进一步完善和扩展。 ######[AI问答 | 1917点数解答 | 2026-01-01 08:40:20]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)352
- C++ 实现我的世界基岩版:从简单框架到开发要点揭秘(字节豆包 | 182点数解答 | 2025-02-22 15:53:11)202
- C++ 实现完整斗地主:含洗牌、发牌与手牌展示,可按需扩展!(字节豆包 | 1028点数解答 | 2026-01-10 08:02:37)40
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)323
- 深度剖析:黑盒、白盒、单元、集成、系统与验收测试的区别与联系 (百度文心 | 424点数解答 | 2023-11-09 18:24:11)306
- Spring Boot 打造 MallShop 购物商城:多角色权限、全业务功能的 Web 应用奇迹 (GPT | 1095点数解答 | 2024-12-09 14:06:47)372
- C++实现银行排队系统:从思路到代码的完整解析(讯飞星火 | 2048点数解答 | 2024-12-11 15:11:23)492
- Windows 10 下用按键精灵:鼠标左键一键绑定窗口及代码详解与注意要点(字节豆包 | 509点数解答 | 2025-08-24 23:34:49)240
- Windows 10 下按键精灵:鼠标左键一次点击绑定窗口代码详解及开发注意事项 (字节豆包 | 372点数解答 | 2025-08-24 23:43:42)163
- Windows 系统下按键精灵:绑定窗口实现鼠标左键点击及开发注意要点(DeepSeek | 126点数解答 | 2025-08-24 23:48:27)143
- JS 代码:判断“red”改值为“green”并弹窗显示结果( | 176点数解答 | 2024-05-20 21:33:04)420
- 用 JS 代码巧妙判断 a 与 b 关系:输出对应结果 ( | 47点数解答 | 2024-05-20 22:10:14)330