c++写一个斗地主得分结果

时间: 2023-08-04 20:32:26 浏览: 53
好的,斗地主的得分结果可以按照以下规则计算: 1. 炸弹:四张相同的牌被称为炸弹,炸弹的大小按照牌点数从大到小排列,如四个3比四个2大。 2. 单牌:一张单独的牌。 3. 对子:两张点数相同的牌,大小按照牌点数从大到小排列,如对A比对K大。 4. 三带一:三张点数相同的牌加一张单牌,大小按照三张牌的点数从大到小排列,如三个5带一个3比三个4带一个2大。 5. 顺子:五张或更多连续的单牌,大小按照最大的牌点数从大到小排列,如78910JQKA比34567大。 6. 连对:三对或更多连续的对子,大小按照最大的牌点数从大到小排列,如334455比223344大。 7. 三带二:三张点数相同的牌加一对点数相同的牌,大小按照三张牌的点数从大到小排列,如三个5带一对33比三个4带一对22大。 根据这些规则,我们可以编写如下的C++程序来计算斗地主的得分结果: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; const int CARD_NUM = 54; enum CardType { CT_SINGLE, // 单牌 CT_PAIR, // 对子 CT_THREE_TAKE_ONE, // 三带一 CT_THREE_TAKE_TWO, // 三带二 CT_STRAIGHT, // 顺子 CT_STRAIGHT_PAIR, // 连对 CT_BOMB, // 炸弹 CT_ERROR // 错误类型 }; int cardValue(int card) { return card % 13; } CardType getCardType(const vector<int>& cards) { int n = cards.size(); if (n == 1) { return CT_SINGLE; } else if (n == 2 && cardValue(cards[0]) == cardValue(cards[1])) { return CT_PAIR; } else if (n == 3 && cardValue(cards[0]) == cardValue(cards[1]) && cardValue(cards[1]) == cardValue(cards[2])) { return CT_THREE_TAKE_ONE; } else if (n == 4 && cardValue(cards[0]) == cardValue(cards[1]) && cardValue(cards[1]) == cardValue(cards[2]) && cardValue(cards[2]) == cardValue(cards[3])) { return CT_BOMB; } else if (n == 5) { if (cardValue(cards[0]) == cardValue(cards[1]) && cardValue(cards[1]) == cardValue(cards[2]) && cardValue(cards[3]) == cardValue(cards[4])) { return CT_THREE_TAKE_TWO; } else { bool isStraight = true; for (int i = 1; i < n; i++) { if (cardValue(cards[i]) != cardValue(cards[i-1]) + 1) { isStraight = false; break; } } if (isStraight) { return CT_STRAIGHT; } } } else if (n >= 6 && n % 2 == 0) { bool isPair = true; for (int i = 0; i < n; i += 2) { if (cardValue(cards[i]) != cardValue(cards[i+1])) { isPair = false; break; } } if (isPair) { bool isStraightPair = true; for (int i = 2; i < n; i += 2) { if (cardValue(cards[i]) != cardValue(cards[i-2]) + 1) { isStraightPair = false; break; } } if (isStraightPair) { return CT_STRAIGHT_PAIR; } } } return CT_ERROR; } int getCardScore(const vector<int>& cards) { int score = 0; switch (getCardType(cards)) { case CT_SINGLE: score = cardValue(cards[0]) == 0 ? 15 : cardValue(cards[0]) - 2; break; case CT_PAIR: score = cardValue(cards[0]) == 0 ? 15 : cardValue(cards[0]) - 2; break; case CT_THREE_TAKE_ONE: score = cardValue(cards[0]) == 0 ? 15 : cardValue(cards[0]) - 2; break; case CT_THREE_TAKE_TWO: score = cardValue(cards[0]) == 0 ? 15 : cardValue(cards[0]) - 2; break; case CT_STRAIGHT: score = cardValue(cards[0]) == 0 ? 15 : cardValue(cards[0]) - 2; break; case CT_STRAIGHT_PAIR: score = cardValue(cards[0]) == 0 ? 15 : cardValue(cards[0]) - 2; break; case CT_BOMB: score = cardValue(cards[0]) == 0 ? 15 : cardValue(cards[0]) - 2; score *= 2; break; case CT_ERROR: score = -1; break; } return score; } int getCardsScore(const vector<int>& cards) { int n = cards.size(); if (n == 0) { return 0; } else if (n == 1) { return getCardScore(cards); } else if (n == 2 && cardValue(cards[0]) == cardValue(cards[1])) { return getCardScore(cards); } else { int score = 0; vector<vector<int>> cardGroups; vector<int> group; for (int i = 0; i < n; i++) { if (group.empty() || cardValue(cards[i]) == cardValue(group[0])) { group.push_back(cards[i]); } else { cardGroups.push_back(group); group.clear(); group.push_back(cards[i]); } } cardGroups.push_back(group); sort(cardGroups.begin(), cardGroups.end(), [](const vector<int>& a, const vector<int>& b) { return getCardType(a) < getCardType(b) || (getCardType(a) == getCardType(b) && cardValue(a[0]) > cardValue(b[0])); }); for (int i = 0; i < cardGroups.size(); i++) { score += getCardScore(cardGroups[i]); } return score; } } int main() { vector<int> cards = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; random_shuffle(cards.begin(), cards.end()); vector<int> player1(cards.begin(), cards.begin()+17); vector<int> player2(cards.begin()+17, cards.begin()+34); vector<int> player3(cards.begin()+34, cards.end()-3); vector<int> lordCards(cards.end()-3, cards.end()); cout << "Player 1's cards: "; for (int i = 0; i < player1.size(); i++) { cout << player1[i] << " "; } cout << endl; cout << "Player 2's cards: "; for (int i = 0; i < player2.size(); i++) { cout << player2[i] << " "; } cout << endl; cout << "Player 3's cards: "; for (int i = 0; i < player3.size(); i++) { cout << player3[i] << " "; } cout << endl; cout << "Lord's cards: "; for (int i = 0; i < lordCards.size(); i++) { cout << lordCards[i] << " "; } cout << endl; int score1 = getCardsScore(player1); int score2 = getCardsScore(player2); int score3 = getCardsScore(player3); int lordScore = getCardsScore(lordCards); cout << "Player 1's score: " << score1 << endl; cout << "Player 2's score: " << score2 << endl; cout << "Player 3's score: " << score3 << endl; cout << "Lord's score: " << lordScore << endl; if (score1 + score3 < score2 + lordScore) { cout << "Player 2 and Lord win!" << endl; } else { cout << "Player 1 and 3 win!" << endl; } return 0; } ``` 上面的代码首先定义了牌的点数和花色,然后定义了不同的牌型和得分计算方法。其中,`getCardType`函数根据牌的数量和点数判断牌型,`getCardScore`函数根据牌型计算得分,`getCardsScore`函数根据牌的数量和牌型排序计算总得分。程序最后随机生成一副牌,并将牌分给三个玩家和地主,计算得分并输出结果。

相关推荐

最新推荐

recommend-type

linux系统中c++写日志文件功能分享

主要介绍了linux系统中c++写日志文件功能,简化了glog,只保留了写日志文件的功能,只是改写了linux版本,需要的朋友可以参考下
recommend-type

C++如何判断一个数字是否为质数

主要为大家详细介绍了C++如何判断一个数字是否为质数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C++实现两个有序数组的合并

主要为大家详细介绍了C++实现两个有序数组的合并,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C++面试八股文深度总结

根据自己备战22届秋招(斩获华为、荣耀、联发科、海康威视等offer)总结的相关知识,其中包括C++基础知识、操作系统、计算机网络、数据库等知识。希望对读者有帮助,助其在找工作的路上少走弯路,收获自己心仪的...
recommend-type

WX小程序源码小游戏类

WX小程序源码小游戏类提取方式是百度网盘分享地址
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。