c++写一个斗地主得分结果
时间: 2024-03-19 17:45:44 浏览: 84
好的,以下是一个简单的斗地主得分计算程序,可以在控制台中运行:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义扑克牌点数的枚举类型
enum Rank {
TWO = 2, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
};
// 定义扑克牌花色的枚举类型
enum Suit {
SPADES, HEARTS, CLUBS, DIAMONDS
};
// 定义扑克牌的结构体
struct Card {
Rank rank;
Suit suit;
};
// 定义斗地主牌的结构体
struct Landlord {
vector<Card> cards;
int score;
};
// 用于比较扑克牌大小的函数
bool cmp(Card a, Card b) {
return a.rank < b.rank || (a.rank == b.rank && a.suit < b.suit);
}
// 计算扑克牌的分数
int getScore(vector<Card> cards) {
int score = 0;
sort(cards.begin(), cards.end(), cmp);
int size = cards.size();
// 炸弹
if (size == 4 && cards[0].rank == cards[3].rank) {
score += 4;
}
// 单张、对子、三张
if (size == 1 || (size == 2 && cards[0].rank == cards[1].rank) ||
(size == 3 && cards[0].rank == cards[2].rank)) {
score += 1;
}
// 顺子
if (size >= 5) {
bool isStraight = true;
for (int i = 1; i < size; i++) {
if (cards[i].rank != cards[i - 1].rank + 1) {
isStraight = false;
break;
}
}
if (isStraight) {
score += 5;
}
}
// 连对
if (size >= 6 && size % 2 == 0) {
bool isStraightPairs = true;
for (int i = 0; i < size; i += 2) {
if (cards[i].rank != cards[i + 1].rank ||
(i + 2 < size && cards[i + 2].rank != cards[i].rank + 1)) {
isStraightPairs = false;
break;
}
}
if (isStraightPairs) {
score += 6;
}
}
// 三带一
if (size == 4 && (cards[0].rank == cards[2].rank || cards[1].rank == cards[3].rank)) {
score += 3;
}
// 三带二
if (size == 5 && ((cards[0].rank == cards[2].rank && cards[3].rank == cards[4].rank) ||
(cards[0].rank == cards[1].rank && cards[2].rank == cards[4].rank))) {
score += 4;
}
return score;
}
int main() {
// 初始化斗地主牌
vector<Card> deck;
for (int i = 2; i <= 14; i++) {
deck.push_back({ static_cast<Rank>(i), SPADES });
deck.push_back({ static_cast<Rank>(i), HEARTS });
deck.push_back({ static_cast<Rank>(i), CLUBS });
deck.push_back({ static_cast<Rank>(i), DIAMONDS });
}
deck.push_back({ Rank::SMALL_JOKER, SPADES });
deck.push_back({ Rank::BIG_JOKER, SPADES });
// 洗牌
random_shuffle(deck.begin(), deck.end());
// 发牌
vector<Landlord> players(3);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 17; j++) {
players[i].cards.push_back(deck[i * 17 + j]);
}
players[i].score = getScore(players[i].cards);
}
// 输出结果
for (int i = 0; i < 3; i++) {
cout << "Player " << i + 1 << ":\n";
for (Card card : players[i].cards) {
cout << card.rank << " " << card.suit << endl;
}
cout << "Score: " << players[i].score << "\n\n";
}
return 0;
}
```
这个程序可以生成一副斗地主牌,洗牌后发给三位玩家,计算每个玩家的得分并输出结果。得分规则如下:
- 单张、对子、三张:每张牌算1分。
- 顺子:5张或5张以上连续的牌,算5分。
- 连对:3对或3对以上连续的对子,算6分。
- 三带一:3张牌带1张单牌,算3分。
- 三带二:3张牌带1对牌,算4分。
- 炸弹:4张牌同点数,算4分。