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.单人-多电脑模式

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

结构体及一些数据:

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

随机生成牌:

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

点数计算:

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

发牌函数:

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

项目运行:

菜单:

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

项目地址:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498486.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】特征选择之包裹式特征选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

深入浅出HTML网页结构:构建您的第一个网页

深入浅出HTML网页结构&#xff1a;构建您的第一个网页 在之前的文章中&#xff0c;我们探索了HTML的奥秘&#xff0c;学习了基础标签的使用。本文将带您一步步构建自己的第一个网页&#xff0c;从零开始&#xff0c;让复杂的HTML结构变得简单易懂。 一、引言 HTML&#xff0c;…

【软件设计师】多元化多方面了解多媒体技术的内容

&#x1f413; 多媒体技术基本概念 多媒体主要是指文字、声音和图像等多种表达信息的形式和媒体&#xff0c;它强调多媒体信息的综合和集成处理。多媒体技术依赖于计算机的数字化和交互处理能力&#xff0c;它的关键是信息压缩技术和光盘存储技术。 亮度 亮度是光作用于人眼时所…

ISP代理是什么?跨境账号养号为什么要选择它?

在跨境出海业务中&#xff0c;代理IP对于您的在线任务至关重要&#xff0c;尤其是对于那些运行多个帐户的人来说。为您的帐户选择正确类型的代理对于确保帐户安全非常重要&#xff0c;劣质的IP容易使账号遭受封号风险。IPFoxy的多种代理IP类型应用范围各有侧重&#xff0c;其中…

飞天使-学以致用-devops知识点3-安装jenkins

文章目录 构建带maven环境的jenkins 镜像安装jenkinsjenkins yaml 文件安装插件jenkins 配置k8s创建用户凭证 构建带maven环境的jenkins 镜像 # 构建带 maven 环境的 jenkins 镜像 docker build -t 192.168.113.122:8858/library/jenkins-maven:jdk-11 .# 登录 harbor docker …

代码随想录刷题训练营day25:LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合

代码随想录刷题训练营day25&#xff1a;LeetCode(40)组合总和 II、LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合 LeetCode(40)组合总和 II 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util…

仿牛客网项目---用户注册登录功能的实现

从今天开始我们来写一个新项目&#xff0c;这个项目是一个完整的校园论坛的项目。主要功能模块&#xff1a;用户登录注册&#xff0c;帖子发布和热帖排行&#xff0c;点赞关注&#xff0c;发送私信&#xff0c;消息通知&#xff0c;社区搜索等。这篇文章我们先试着写一下用户的…

Unity(第十四部)光照

原始的有默认灯光、除了默认的你还可以创建 1、定向光源&#xff08;类似太阳、从无限远的地方射向地面的光&#xff0c;光源位置并不影响照射角度等&#xff0c;不同方向的旋转影响角度和明亮&#xff09; 1. 颜色&#xff1a;调整光的颜色2. 模式&#xff1a;混合是实时加烘…

kafka三节点集群平滑升级过程指导

一、前言 Apache Kafka作为常用的开源分布式流媒体平台&#xff0c;可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据&#xff0c;构建对数据流的变化进行实时反应的应用程序&#xff0c;已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…

实战Kafka的部署

目录 一、环境准备 二、安装配置jdk8 &#xff08;1&#xff09;Kafka、Zookeeper&#xff08;简称&#xff1a;ZK&#xff09;运行依赖jdk8 三、安装配置ZK &#xff08;1&#xff09;安装 &#xff08;2&#xff09;配置 四、配置Kafka &#xff08;1&#xff09;配置…

网络协议:DHCP协议工作原理,DHCP分配方式,DHCP租约,Wireshark抓包分析DHCP报文

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」&#xff1a;此文章已录入专栏《计算机网络零基础快速入门》 DHCP协议 一、简介二、分配方式1&#xff09;自动分配2&#xff0…

AI时代的产品文案秘籍:如何用AI提升效率

人工智能写作工具&#xff1a;解放双手&#xff0c;创作不停歇 在当前人工智能技术飞速发展的背景下&#xff0c;越来越多的个体已经开始利用这一AI写作工具&#xff0c;以显著提高自己的工作效率。这不仅标志着人工智能服务于人类的宏伟时代的到来&#xff0c;更是人人可用的创…