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.mzph.cn/news/708268.shtml

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

相关文章

k8s初始化报错 [ERROR CRI]: container runtime is not running: ......

一、环境参数 linux系统为centos7kubernetes版本为v1.28.2containerd版本为1.6.28 二、报错内容 执行初始化命令kubeadm init命令时报错&#xff0c;内容如下 error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR CRI]: container runtime is…

C++观察者模式代码实例

文章目录 C观察者模式代码实例一C观察者模式代码实例二 C观察者模式代码实例一 下面是一个简单的C观察者模式的实现示例&#xff0c;这里仅给出核心代码框架&#xff0c;完整的工程应包含对应的头文件声明及必要的#include指令等。 // 观察者接口&#xff08;Observer&#x…

【Unity实战】UGUI和Z轴排序那点事儿

如果读者是从Unity 4.x时代过来的&#xff0c;可能都用过NGUI这个插件&#xff08;后来也是土匪成了正规军&#xff09;&#xff0c;NGUI一大特点是可以靠transform位移的Z值进行遮挡排序&#xff0c;然而这个事情在UGUI成了难题&#xff08;Sorting Layer、Inspector顺序等因素…

品牌百度百科应该怎样创建?编辑品牌百度百科词条的秘籍!

在数字化时代&#xff0c;品牌的故事不仅仅存在于广告牌和电视屏幕上&#xff0c;它们还在互联网的每一个角落悄然讲述。百度百科词条作为中国最大的中文百科全书&#xff0c;成为了品牌展示自身故事的重要舞台。那么&#xff0c;如何在这个舞台上留下你的品牌印记呢&#xff1…

solidity编程

一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机&#xff08; EVM &#xff09;智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能&#xff1a;区块链项⽬⼤部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以 规避很多亏钱项⽬。…

RK3568 android11 调试陀螺仪模块 MPU-6500

一&#xff0c;MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器&#xff0c;属于惯性测量设备&#xff08;IMU&#xff09;的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器&#xff08;DMP&#xff09;&#xff0c;能够提供6轴的运动…

Outlook邮箱IMAP怎么开启?服务器怎么填?

Outlook邮箱IMAP服务器如何开启&#xff1f;Outlook设置IMAP的方法&#xff1f; Outlook邮箱作为其中的佼佼者&#xff0c;被广大用户所青睐。但在使用Outlook邮箱时&#xff0c;许多用户可能会碰到一个问题&#xff1a;如何开启IMAP服务&#xff1f;下面&#xff0c;蜂邮EDM就…

解决鸿蒙模拟器卡顿的问题

缘起 最近在学习鸿蒙的时候&#xff0c;发现模拟器非常卡&#xff0c;不要说体验到鸿蒙的丝滑&#xff0c;甚至到严重影响使用的程度。 根据我开发Android的经验和在论坛翻了一圈&#xff0c;最终总结出了以下几个方案。 创建模拟器 1、在DevEco Virtual Device Configurat…

【InternLM 实战营笔记】LMDeploy 的量化和部署

环境配置 vgpu-smi 查看显卡资源使用情况 新开一个终端执行下面的命令实时观察 GPU 资源的使用情况。 watch vgpu-smi复制环境到我们自己的 conda 环境 /root/share/install_conda_env_internlm_base.sh lmdeploy激活环境 conda activate lmdeploy安装依赖库 # 解决 Modu…

day04_拦截器Apifox角色管理(登录校验,API接口文档,权限管理说明,角色管理,添加角色,修改角色,删除角色)

文章目录 1. 登录校验1.1 需求说明1.2 实现思路1.3 ThreadLocal1.4 AuthContextUtil1.5 拦截器使用1.5.1 拦截器开发1.5.2 拦截器注册 1.6 代码优化1.6.1 配置优化1.6.2 代码优化1.6.3 前端修改 2. API接口文档2.1 Apifox接口管理平台2.1.1 接口管理平台简介2.1.2 Apifox简介2.…

【kubernetes】关于云原生之k8s集群的pod理论详解

目录 一、pod的基础概念 什么是pod&#xff1f; k8s集群中pod的两种使用方式 pod中运行容器的原则&#xff1a; 创建pod的3种方式 第一种&#xff1a;自主式Pod 第二种&#xff1a;控制器管理的Pod 第三种&#xff1a;静态Pod 二、pod中容器的基础概念 pod容器的分类 …

记录工作中遇见问题、学习项

1、判空操作 Demo demo Optional .ofNullable(demoService.getById(id)) .orElseThrow(() -> new ServiceException("不存在id为" id "的数据")); 2、SQL方面 1、group by : GROUP BY 子句必须放在 WHERE 子句中的条件之后&#…

Apache SeaTunnel 及 Web 功能部署指南(小白版)

在大数据处理领域&#xff0c;Apache SeaTunnel 已成为一款备受青睐的开源数据集成平台&#xff0c;它不仅可以基于Apache Spark和Flink&#xff0c;而且还有社区单独开发专属数据集成的Zeta引擎&#xff0c;提供了强大的数据处理能力。随着SeaTunnel Web的推出&#xff0c;用户…

雾锁王国服务器要开服务器吗?

雾锁王国要开服务器吗&#xff1f;可以使用官方服务器&#xff0c;也可以自己搭建多人联机服务器&#xff0c;更稳定不卡&#xff0c;畅玩开黑。阿腾云分享atengyun.com给大家目前阿里云和腾讯云均提供雾锁王国服务器和一键搭建程序&#xff0c;成本26元即可搭建一台自己的雾锁…

Keepalived双机热备——Haproxy搭建web群集

一、认识keepalived keepalived是一个开源的软件&#xff0c;用于实现高可用性和负载均衡。它主要用于在多个服务器之间提供故障转移和负载均衡的功能。keepalived可以监控服务器的状态&#xff0c;并在主服务器发生故障时自动将备份服务器切换为主服务器&#xff0c;以确保服…

高压高能碳陶瓷无感电阻的制作以及应用?

由于现有需求&#xff0c;许多现代电子电路和设备都会经历瞬态脉冲和浪涌。这反过来又导致需要“设计”瞬态浪涌保护&#xff0c;尤其是在电机控制器等电路中。当电机启动时&#xff0c;此时消耗的电流过大&#xff0c;可能导致电阻器故障。同样&#xff0c;如果电容器用于电机…

揭示IP风险画像的作用与价值

在当今数字化时代&#xff0c;互联网的快速发展为企业和个人带来了巨大的机遇&#xff0c;同时也带来了各种安全风险和威胁。随着网络攻击手段的不断升级和演变&#xff0c;传统的安全防御手段已经无法满足对抗复杂多变的网络威胁的需求。IP风险画像作为一种新型的网络安全解决…

2024.2.28 网络

思维导图 整理面试题 1、什么是回调函数 答&#xff1a;将函数作为参数传到另一个函数里面&#xff0c;当那个函数执行完之后&#xff0c;再执行传进去的这个函数。这个过程就叫做回调。 2、结构体和共用体的区别 答&#xff1a;结构体的每个成员都会分配内存&#xff0c;…

加密与安全_深入了解哈希算法

文章目录 Pre概述哈希碰撞常用的哈希算法Codejava.security.MessageDigestMD5SHA-1SHA-256MessageDigest支持算法 哈希算法的用途彩虹表攻击基本原理攻击过程 防御彩虹表攻击基本原理用途 小结 Pre PKI - 01 散列(Hash)函数 概述 哈希算法&#xff08;Hash&#xff09;又称摘…

c# 异常处理

异常类 .NET Framework 类库中的所有异常都派生于 Exception 类&#xff0c;异常包括系统异常和应用异常。 默认所有系统异常派生于 System.SystemException&#xff0c;所有的应用程序异常派生于 System.ApplicationException。 系统异常一般不可预测&#xff0c;比如内存堆…