用C++写一个21点游戏的完整代码
时间: 2024-05-07 11:22:06 浏览: 16
以下是一个简单的 21 点游戏的 C++ 代码,仅供参考:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
//卡牌结构体
struct Card {
string suit; //花色
string face; //面值
int value; //点数
};
//游戏状态枚举
enum GameState {
PLAYER_WON,
PLAYER_LOST,
PLAYER_TIED,
ONGOING
};
//获取一副新牌
vector<Card> getNewDeck() {
vector<Card> deck;
string suits[] = {"HEARTS", "DIAMONDS", "CLUBS", "SPADES"};
string faces[] = {"ACE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "JACK", "QUEEN", "KING"};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 13; j++) {
Card card;
card.suit = suits[i];
card.face = faces[j];
if (j <= 8) {
card.value = j + 1;
} else {
card.value = 10;
}
deck.push_back(card);
}
}
return deck;
}
//洗牌
void shuffleDeck(vector<Card>& deck) {
srand(time(0));
for (int i = 0; i < deck.size(); i++) {
int j = rand() % deck.size();
Card temp = deck[i];
deck[i] = deck[j];
deck[j] = temp;
}
}
//发牌
void dealCards(vector<Card>& deck, vector<Card>& playerCards, vector<Card>& dealerCards) {
playerCards.push_back(deck.back());
deck.pop_back();
dealerCards.push_back(deck.back());
deck.pop_back();
playerCards.push_back(deck.back());
deck.pop_back();
dealerCards.push_back(deck.back());
deck.pop_back();
}
//计算牌组点数
int calculatePoints(vector<Card>& cards) {
int points = 0;
int numOfAces = 0;
for (int i = 0; i < cards.size(); i++) {
if (cards[i].face == "ACE") {
numOfAces++;
}
points += cards[i].value;
}
while (numOfAces > 0 && points > 21) {
points -= 10;
numOfAces--;
}
return points;
}
//打印牌组
void printCards(vector<Card>& cards, bool showAllCards) {
for (int i = 0; i < cards.size(); i++) {
if (i > 0) {
cout << ", ";
}
if (showAllCards) {
cout << cards[i].face << " of " << cards[i].suit << " (" << cards[i].value << ")";
} else {
if (i == 0) {
cout << cards[i].face << " of " << cards[i].suit;
} else {
cout << "[HIDDEN]";
}
}
}
cout << endl;
}
//玩家回合
void playerTurn(vector<Card>& deck, vector<Card>& playerCards, vector<Card>& dealerCards) {
bool isDone = false;
while (!isDone) {
cout << "Your cards: ";
printCards(playerCards, true);
cout << "Dealer's cards: ";
printCards(dealerCards, false);
int points = calculatePoints(playerCards);
if (points > 21) {
cout << "You are busted! You lose." << endl;
isDone = true;
return;
}
cout << "Do you want to hit (h) or stand (s)? ";
char choice;
cin >> choice;
switch (choice) {
case 'h':
playerCards.push_back(deck.back());
deck.pop_back();
break;
case 's':
isDone = true;
break;
default:
cout << "Invalid choice. Please try again." << endl;
break;
}
}
}
//庄家回合
void dealerTurn(vector<Card>& deck, vector<Card>& dealerCards) {
while (calculatePoints(dealerCards) < 17) {
dealerCards.push_back(deck.back());
deck.pop_back();
}
cout << "Dealer's cards: ";
printCards(dealerCards, true);
}
//比较结果
GameState compareHands(vector<Card>& playerCards, vector<Card>& dealerCards) {
int playerPoints = calculatePoints(playerCards);
int dealerPoints = calculatePoints(dealerCards);
if (playerPoints > 21) {
return PLAYER_LOST;
}
if (dealerPoints > 21) {
return PLAYER_WON;
}
if (playerPoints > dealerPoints) {
return PLAYER_WON;
} else if (playerPoints < dealerPoints) {
return PLAYER_LOST;
} else {
return PLAYER_TIED;
}
}
int main() {
vector<Card> deck = getNewDeck();
shuffleDeck(deck);
vector<Card> playerCards;
vector<Card> dealerCards;
dealCards(deck, playerCards, dealerCards);
cout << "Welcome to the 21 point game!" << endl;
playerTurn(deck, playerCards, dealerCards);
if (calculatePoints(playerCards) <= 21) {
dealerTurn(deck, dealerCards);
}
GameState result = compareHands(playerCards, dealerCards);
if (result == PLAYER_WON) {
cout << "Congratulations! You won." << endl;
} else if (result == PLAYER_LOST) {
cout << "Sorry, you lost." << endl;
} else {
cout << "It's a tie!" << endl;
}
return 0;
}
```
这只是一个简单的示例,不包含任何错误处理。一些规则,如“分牌”和“保险”,也没有实现。你可以根据自己的需要进行修改和扩展。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)