当前位置:   article > 正文

C语言实现21点游戏【单人模式,双人模式,单-多电脑模式】,21点又名黑杰克(英文:Blackjack)

C语言实现21点游戏【单人模式,双人模式,单-多电脑模式】,21点又名黑杰克(英文:Blackjack)

项目背景:

21点又名黑杰克(英文:Blackjack) ,起源于法国,已流传到世界各地。21点,是一种使用扑克牌玩的赌博游戏。亦是唯一一种在赌场中可以在概率中战胜庄家的一种赌博游戏。

现在在世界各地的赌场中都可以看到二十一点,随着互联网的发展,二十一点开始走向网络时代。该游戏由 2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大。有着悠久的历史。

项目功能:

简易21点游戏:
21点又名黑杰克( Blackjack )起源于法国,已流传到世界各地,有着悠久的历史。该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。21点一般用到1 -8副牌。大家手中扑克点数的计算是: 2至9牌,按其原点数计算; K、Q、J和
10牌都算作10点(一般记作T,即ten之意) ; A牌(ace)既可算作1点也可算作11点,由玩家自己
决定( 当玩家停牌时,点数-律视为最大而尽量不爆,如A+9为20,A+4+8为13, A+3+A视为15)。
简易规则:玩家电脑各发2张牌,玩家两张牌均为明牌,电脑一明一暗;玩家电脑轮流要牌(都为明牌),也可以选择停牌,当某一方点数为21点时则直接获胜,超过21点则直接淘汰;当各方都选择停牌时,则计算各方点数,点数大者获胜。

我这里实现的有:

1.单人模式

2.单人-电脑模式

3.单人-多电脑模式

项目部分代码展示【完整源码在最后】:

结构体及一些数据:

  1. typedef struct
  2. {
  3. char name[4]; // 牌的名称
  4. int point; // 牌的点值
  5. int take; // 初始为0,拿过这张牌了,就设置成1
  6. } Card;
  7. typedef struct
  8. {
  9. char name[4];//牌的名称
  10. int point;//牌的点值
  11. } Hand;//手牌
  12. Card deck[NUM_DECKS][52];//总共不同花色,A-K 52张牌,最多8副牌
  13. int n;//多少副牌
  14. int m;//电脑玩家有多少个

随机生成牌:

  1. void randPutCard(int nums[]) //随机生成2个数,第一个代表是哪副牌,第二个代表那副牌里的哪张牌
  2. {
  3. int i;
  4. // 生成2个随机数字
  5. nums[0] = rand() % n;//n副牌
  6. nums[1] = rand() % 52;//一副里有52张牌
  7. if (deck[nums[0]][nums[1]].take == 1) {//这张牌已经拿过了,重新生成随机数
  8. randPutCard(nums);
  9. }
  10. else {
  11. deck[nums[0]][nums[1]].take == 1;//没拿过,拿这张牌,现在设为1代表现在拿了
  12. return;
  13. }
  14. }

点数计算:

  1. int CalcPoints(Hand hand[], int handNum) //点数计算
  2. {
  3. int i;
  4. int points = 0;//记录计算的点数
  5. int num_aces = 0;//记录A的数量
  6. for (i = 0; i < handNum; i++) {
  7. if (hand[i].point >= 2 && hand[i].point <= 10) {//2-k加对应点数
  8. points += hand[i].point;
  9. }
  10. else if (hand[i].point == 1) {//如果是1的话,也就是A
  11. num_aces++;//A的数量+1
  12. points += 1;//点数先+1
  13. }
  14. }
  15. for (i = 0; i < num_aces; i++) {//循环A的数量
  16. if (points + 10 <= 21) {//如果让当前的A等于11,还没爆,就让这个A等于11
  17. points += 10;//因为前面A已经让点数先+1了,所以这里只需要再+10
  18. }
  19. }
  20. return points;//返回点数
  21. }

发牌函数:

  1. int takeCard(Hand hand[], int handNum, int flag) {//发牌函数,暂时这里只用在了玩家多电脑模式,函数返回的是手牌数量
  2. int nums[2];
  3. int iRand, jRand;
  4. if (flag == 0) {
  5. printf("正在为玩家发牌...\n");
  6. randPutCard(nums);//生成2个随机数
  7. iRand = nums[0], jRand = nums[1];//iRand决定是哪副牌,jRand决定拿哪张牌
  8. strcpy(hand[handNum].name, deck[nums[0]][nums[1]].name);//名称
  9. hand[handNum].point = deck[nums[0]][nums[1]].point;//点数
  10. handNum++;//玩家手牌数量+1
  11. printf("发牌完毕!新的纸牌为【%s】\n\n", hand[handNum - 1].name);
  12. }
  13. else {
  14. printf("正在为【电脑%d】发牌...\n", flag);
  15. randPutCard(nums);//生成2个随机数
  16. iRand = nums[0], jRand = nums[1];//iRand决定是哪副牌,jRand决定拿哪张牌
  17. //因为电脑有一张暗牌,我这里把暗牌一直放在最后
  18. //先把暗牌放最后
  19. strcpy(hand[handNum].name, hand[handNum - 1].name);
  20. hand[handNum].point = hand[handNum - 1].point;
  21. //再把刚要的牌放在暗牌前面
  22. strcpy(hand[handNum - 1].name, deck[nums[0]][nums[1]].name);//名称
  23. hand[handNum - 1].point = deck[nums[0]][nums[1]].point;//点数
  24. handNum++;//手牌的数量+1
  25. printf("发牌完毕!新的纸牌为【%s】\n\n", hand[handNum - 2].name);//handNum-1的索引是暗牌,所以打印handNum-2索引下的纸牌,为新发的牌
  26. }
  27. return handNum;//将手牌数量返回
  28. }

项目运行:

菜单:

玩家电脑模式【其他就不展示了】:

项目地址:

code: 平时写的一些c/c++项目【开源】 - Gitee.comicon-default.png?t=N7T8https://gitee.com/yq-leisure/code/blob/master/Joker.cpp

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/165231
推荐阅读
相关标签
  

闽ICP备14008679号