经典的扑克牌游戏
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
20小时前 来自 广东
020小时前 来自 广东
0
有帮助,赞一个