用c++写一个淮安掼蛋游戏
时间: 2023-06-16 19:07:40 浏览: 149
淮安掼蛋是一种流行的扑克牌游戏,可以用C++语言编写。以下是一个简单的示例,仅供参考:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
// 定义牌的种类和值
const vector<string> card_types {"♠", "♥", "♦", "♣"};
const vector<string> card_values {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
// 定义牌的结构体
struct Card {
string type;
string value;
int point;
Card(string t, string v, int p) : type(t), value(v), point(p) {}
};
// 定义玩家结构体
struct Player {
string name;
vector<Card> cards;
int score;
Player(string n) : name(n), score(0) {}
};
// 创建一副牌
vector<Card> create_deck() {
vector<Card> deck;
for (auto t : card_types) {
for (int i = 0; i < card_values.size(); i++) {
int point = i < 9 ? i + 2 : 10;
deck.push_back(Card(t, card_values[i], point));
}
}
return deck;
}
// 洗牌
void shuffle_deck(vector<Card>& deck) {
srand(time(NULL)); // 以时间为种子生成随机数
random_shuffle(deck.begin(), deck.end());
}
// 发牌
void deal_cards(vector<Card>& deck, vector<Player>& players) {
for (int i = 0; i < players.size(); i++) {
for (int j = 0; j < 13; j++) {
players[i].cards.push_back(deck.back());
deck.pop_back();
}
}
}
// 排序函数
bool cmp(Card c1, Card c2) {
if (c1.type != c2.type) {
return c1.type < c2.type;
} else {
return c1.point < c2.point;
}
}
// 玩家出牌
Card play_card(Player& player, Card& card) {
auto it = find(player.cards.begin(), player.cards.end(), card);
if (it != player.cards.end()) {
player.cards.erase(it);
return card;
} else {
cout << "你没有这张牌!" << endl;
return Card("", "", 0);
}
}
// 计算得分
int calculate_score(vector<Card> cards) {
int score = 0;
for (auto c : cards) {
if (c.value == "10" || c.value == "K" || c.value == "A") {
score += 10;
} else if (c.value == "5") {
score += 5;
}
}
return score;
}
// 判断是否为炸弹
bool is_bomb(vector<Card> cards) {
if (cards.size() != 4) {
return false;
}
for (int i = 1; i < cards.size(); i++) {
if (cards[i].value != cards[0].value) {
return false;
}
}
return true;
}
// 判断胜负
bool is_win(vector<Card> cards1, vector<Card> cards2) {
int score1 = calculate_score(cards1);
int score2 = calculate_score(cards2);
if (is_bomb(cards1)) {
score1 *= 2;
}
if (is_bomb(cards2)) {
score2 *= 2;
}
return score1 > score2;
}
int main() {
vector<Player> players;
players.push_back(Player("玩家1"));
players.push_back(Player("玩家2"));
vector<Card> deck = create_deck();
shuffle_deck(deck);
deal_cards(deck, players);
sort(players[0].cards.begin(), players[0].cards.end(), cmp);
sort(players[1].cards.begin(), players[1].cards.end(), cmp);
while (players[0].cards.size() > 0 && players[1].cards.size() > 0) {
// 玩家1出牌
cout << players[0].name << "的手牌:";
for (auto c : players[0].cards) {
cout << c.type << c.value << " ";
}
cout << endl;
string type, value;
cout << "请" << players[0].name << "出牌(输入牌的花色和点数):";
cin >> type >> value;
Card card(type, value, 0);
Card played_card = play_card(players[0], card);
if (played_card.value != "") {
// 玩家2出牌
cout << players[1].name << "的手牌:";
for (auto c : players[1].cards) {
cout << c.type << c.value << " ";
}
cout << endl;
int index = rand() % players[1].cards.size();
played_card = play_card(players[1], players[1].cards[index]);
if (played_card.value != "") {
if (is_win({card}, {played_card})) {
cout << players[0].name << "赢了这一轮!" << endl;
players[0].score++;
} else {
cout << players[1].name << "赢了这一轮!" << endl;
players[1].score++;
}
}
}
}
if (players[0].score > players[1].score) {
cout << players[0].name << "赢了游戏!" << endl;
} else if (players[0].score < players[1].score) {
cout << players[1].name << "赢了游戏!" << endl;
} else {
cout << "平局!" << endl;
}
return 0;
}
```
这个示例程序只是一个简单的框架,还有很多地方需要完善。例如:
- 玩家出牌的逻辑需要更加灵活,可以考虑加入提示、判断牌是否符合规则等功能。
- 计分规则可以根据实际情况进行修改,比如加入对炸弹的特殊处理。
- 程序没有图形界面,需要在命令行中输入数据,可以考虑使用QT等GUI库进行开发。