21点,简单的纸牌游戏——C++编写

本文描述了一个基于C++编写的简化版21点游戏流程,涉及玩家和AI庄家的牌面操作,以及随机发牌和决策机制。程序模拟了玩家选择要牌或停牌,直到庄家爆牌或达到21点结束游戏。
摘要由CSDN通过智能技术生成

游戏流程

  1. 游戏开始:玩家(你)和庄家(我,AI)各自发两张牌,玩家的牌面向上,庄家只有一张牌面向上。
  2. 玩家决策:玩家可以选择“要牌”(Hit)或“停牌”(Stand)。
    • 要牌:玩家要求额外的牌,尝试接近21点但不超过。
    • 停牌:玩家停止要牌,结束自己的回合。
  3. 庄家回合:玩家停牌后,庄家公开第二张牌,并根据规则决定是否要牌。庄家通常会在16点或以下要牌,在17点或以上停牌。
  4. 判定胜负
    • 如果玩家超过21点,庄家赢。
    • 如果庄家超过21点,玩家赢。
    • 如果双方都未超过21点,点数更高的一方获胜。
    • 如果双方点数相同,结果为平局。

简化的牌面值

  • 数字牌:面值即点数(2-10)。
  • 人物牌(J、Q、K):每张为10点。
  • A:可算作1点或11点,取决于哪个值对玩家更有利。

开始游戏

我将“发牌”,你首先告诉我你的选择:要牌或停牌。为了简化,我们将假设每次发牌都是随机从52张牌中抽取,不考虑已经发出的牌。

你的起始牌:8和5(总共13点) 庄家的公开牌:K

请问你选择要牌(Hit)还是停牌(Stand)?

____________________________我和chatgpt的一次玩耍—————————————————

我:要牌

ai:你选择要牌。让我们“随机”给你发一张牌。

新发的牌:7

现在你的牌面总点数为20点(8 + 5 + 7)。

当前状态

  • 你的牌:8, 5, 7(总共20点)
  • 庄家的公开牌:K

由于你现在总点数为20点,这是一个相当接近21点的很好的分数。现在你可以再次选择要牌(Hit)或停牌(Stand)。请告诉我你的决定。

你:停牌

ai:你选择停牌。现在轮到庄家(我,AI)的回合。

庄家的起始牌是K和一张隐藏牌。为了简化,我们假设庄家的隐藏牌是4,总点数为14点(K为10点,4为4点)。

庄家的行动

根据规则,庄家在16点或以下会要牌,在17点或以上会停牌。所以,庄家选择要牌。

庄家要牌:得到一张9。

现在庄家的总点数为23点(K + 4 + 9),超过了21点。

结果

  • 你的牌:8, 5, 7(总共20点)
  • 庄家的牌:K, 4, 9(总共23点,超过21点)

庄家爆牌,你赢了!

这只是一个简化的游戏流程示例,实际游戏中会有更多的策略和决策。如果你想要玩更复杂的纸牌游戏,或者有任何其他游戏相关的问题,随时告诉我!

————————————————真正的结束——————————————————————

  好的,其实前面呢我已经就说了这个规则。然后呢现在就编写程序。

  • 使用rand()函数生成随机数来模拟抽牌过程。
  • 玩家可以选择要牌(hit)或停牌(stand)。
  • 庄家(dealer)在点数小于17时会自动要牌。
  • 游戏在玩家停牌或爆牌(点数超过21)后结束。

 

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;


int getCard();
void playDealer(int& dealerTotal);
char getPlayerChoice();
void playGame();

int main() {
	system("chcp 65001");
    srand(static_cast<unsigned int>(time(0))); 
    char playAgain;

    do {
        playGame();

        cout << "想再玩一次吗? (Y/N): ";
        cin >> playAgain;
    } while (playAgain == 'Y' || playAgain == 'y');

    return 0;
}

void playGame() {
    int playerTotal = 0, dealerTotal = 0;
    char choice;
    playerTotal += getCard();
    playerTotal += getCard();
    dealerTotal += getCard();

    cout << "你的总分是: " << playerTotal << endl;
    cout << "庄家的一张公开牌是: " << dealerTotal << endl;
    do {
        choice = getPlayerChoice();
        if (choice == 'h') {
            playerTotal += getCard();
            cout << "你现在的总分是: " << playerTotal << endl;
        }
    } while (choice != 's' && playerTotal <= 21);

    if (playerTotal > 21) {
        cout << "爆牌了!你输了。" << endl;
    } else {
        playDealer(dealerTotal);

        cout << "庄家的总分是: " << dealerTotal << endl;
        if (dealerTotal > 21 || dealerTotal < playerTotal) {
            cout << "你赢了!" << endl;
        } else {
            cout << "你输了。" << endl;
        }
    }
}

int getCard() {
    return rand() % 10 + 1; 
}

char getPlayerChoice() {
    char choice;
    cout << "要牌(h)还是停牌(s)?: ";
    cin >> choice;
    return choice;
}

void playDealer(int& dealerTotal) {
    while (dealerTotal < 17) { 
        dealerTotal += getCard();
    }
}

 

 

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值