经典的扑克牌游戏
2025-07-30 09:57:22
发布于:广东
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <windows.h>
using namespace std;
// 卡牌结构体
struct Card {
string suit;   // 花色
string rank;   // 点数
int value;     // 数值
};
// 清屏函数
void clearScreen() {
system("cls");
}
// 延时函数
void delay(int milliseconds) {
Sleep(milliseconds);
}
// 创建一副扑克牌
vector<Card> createDeck() {
vector<Card> deck;
vector<string> suits = {"红桃", "方块", "黑桃", "梅花"};
vector<string> ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
for (const string& suit : suits) {
    for (int i = 0; i < ranks.size(); i++) {
        Card card;
        card.suit = suit;
        card.rank = ranks[i];
        
        // 设置牌的点数
        if (i == 0) {          // A可以算1或11
            card.value = 11;
        } else if (i >= 10) {  // J, Q, K都算10
            card.value = 10;
        } else {               // 2-10按实际点数
            card.value = i + 1;
        }
        
        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();
swap(deck[i], deck[j]);
}
}
// 计算手牌点数
int calculateHand(const vector<Card>& hand) {
int total = 0;
int aces = 0;
for (const Card& card : hand) {
    total += card.value;
    if (card.rank == "A") {
        aces++;
    }
}
// 处理A的情况,如果总点数超过21,A算1点
while (total > 21 && aces > 0) {
    total -= 10;
    aces--;
}
return total;
}
// 显示手牌
void displayHand(const vector<Card>& hand, bool showAll = true) {
for (size_t i = 0; i < hand.size(); i++) {
if (i == 0 && !showAll) {
// 庄家的第一张牌隐藏
cout << "【隐藏的牌】" << endl;
} else {
cout << hand[i].suit << hand[i].rank << " (" << hand[i].value << "点) " << endl;
}
}
}
// 游戏主函数
void playGame() {
vector<Card> deck = createDeck();
shuffleDeck(deck);
vector<Card> playerHand;
vector<Card> dealerHand;
int deckIndex = 0;
// 发初始牌
playerHand.push_back(deck[deckIndex++]);
dealerHand.push_back(deck[deckIndex++]);
playerHand.push_back(deck[deckIndex++]);
dealerHand.push_back(deck[deckIndex++]);
clearScreen();
cout << "=== 21点游戏 ===" << endl << endl;
// 显示玩家和庄家的手牌(庄家只显示一张)
cout << "庄家的手牌:" << endl;
displayHand(dealerHand, false);
cout << endl;
cout << "你的手牌 (" << calculateHand(playerHand) << "点):" << endl;
displayHand(playerHand);
cout << endl;
// 玩家回合
string choice;
while (true) {
    cout << "请选择: (H)要牌  (S)停牌: ";
    cin >> choice;
    
    if (choice == "H" || choice == "h") {
        // 要牌
        playerHand.push_back(deck[deckIndex++]);
        clearScreen();
        
        cout << "你拿到了一张新牌: " << playerHand.back().suit << playerHand.back().rank << endl;
        delay(1000);
        
        clearScreen();
        cout << "=== 21点游戏 ===" << endl << endl;
        
        cout << "庄家的手牌:" << endl;
        displayHand(dealerHand, false);
        cout << endl;
        
        cout << "你的手牌 (" << calculateHand(playerHand) << "点):" << endl;
        displayHand(playerHand);
        cout << endl;
        
        // 检查是否爆牌
        if (calculateHand(playerHand) > 21) {
            cout << "你爆牌了!" << endl;
            delay(2000);
            break;
        }
    } 
    else if (choice == "S" || choice == "s") {
        // 停牌
        break;
    }
    else {
        cout << "无效的选择,请重新输入!" << endl;
    }
}
// 检查玩家是否爆牌
if (calculateHand(playerHand) <= 21) {
    // 庄家回合
    clearScreen();
    cout << "庄家开始行动..." << endl;
    delay(1500);
    
    while (calculateHand(dealerHand) < 17) {
        // 庄家必须要牌直到至少17点
        dealerHand.push_back(deck[deckIndex++]);
        clearScreen();
        cout << "庄家拿到了一张新牌: " << dealerHand.back().suit << dealerHand.back().rank << endl;
        delay(1500);
    }
}
// 显示最终结果
clearScreen();
cout << "=== 最终结果 ===" << endl << endl;
cout << "庄家的手牌 (" << calculateHand(dealerHand) << "点):" << endl;
displayHand(dealerHand);
cout << endl;
cout << "你的手牌 (" << calculateHand(playerHand) << "点):" << endl;
displayHand(playerHand);
cout << endl;
// 判断胜负
int playerTotal = calculateHand(playerHand);
int dealerTotal = calculateHand(dealerHand);
if (playerTotal > 21) {
    cout << "你输了!你爆牌了。" << endl;
} 
else if (dealerTotal > 21) {
    cout << "你赢了!庄家爆牌了。" << endl;
} 
else if (playerTotal > dealerTotal) {
    cout << "你赢了!" << endl;
} 
else if (playerTotal < dealerTotal) {
    cout << "你输了!" << endl;
} 
else {
    cout << "平局!" << endl;
}
delay(3000);
}
int main() {
char playAgain;
do {
    playAgain = 'n';
    playGame();
    
    cout << "想再玩一次吗? (y/n): ";
    cin >> playAgain;
    
} while (playAgain == 'y' || playAgain == 'Y');
clearScreen();
cout << "感谢游玩!再见!" << endl;
delay(2000);
return 0;
}
全部评论 2





2025-07-30 来自 广东
0



2025-07-30 来自 广东
0











有帮助,赞一个