QT项目-欢乐斗地主游戏

QT项目-欢乐斗地主游戏

  • 游戏概述
  • 游戏规则
    • 牌型
    • 牌型的大小
    • 游戏角色
    • 游戏规则
    • 游戏的胜负
    • 游戏计分规则
  • 游戏相关的类介绍
    • 卡牌类
    • 玩家类
    • 窗口类
    • 游戏控制类
    • 游戏策略类
    • 线程类
    • 音频类
  • 游戏主要组件
    • 卡牌
    • 玩家
    • 窗口
  • 游戏控制
  • 源码

游戏概述

在这里插入图片描述

游戏规则

不同地域游戏规则可能有些许差异,游戏按照如下规则进行实现。

牌型

在这里插入图片描述

牌型的大小

  • 王炸最大,可以压任意其他的牌型。
  • 炸弹比王炸小,比其它牌型大。都是炸弹时按牌的点数比大小。
  • 除火箭和炸弹外,其它牌必须要牌型相同且总数量相同才能比大小。
  • 单牌按点数比大小(不分花色),依次是:
  • 大王 > 小王 > 2 > A > K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3
  • 对牌,三张点数相同的牌都按点数比大小。
  • 顺子按最大的一张牌的点数来比大小。
  • 飞机带翅膀和四带二按其中的三顺和四张部分来比,带的副牌不参与牌型大小的比较。

游戏角色

参与游戏的玩家一共需要三个人,这三个人有两种角色,分别是:

  • 地主:1人,三人下注抢地主,分数最高者可称为地主,地主自己一伙

  • 农民:2人,没有抢到地主的玩家为农民,此二人一伙。

游戏规则

  1. 发牌
    一副牌 54 张,一人 17 张,留 3 张做底牌,在确定地主之前玩家不能看到底牌。

  2. 叫地主 / 抢地主
    叫地主按出牌的顺序轮流进行,每人只能叫一次。
    叫地主时可以叫 “1 分 ” , “2 分 ” , “3 分 ” , “ 不叫 ” 。
    后抢地主者只能叫比前面玩家高的分或者不叫。
    抢地主结束后下注分值最大的玩家为地主;如果有玩家叫 “3 分 ” 则立即结束叫地主,该玩家为地主;如果都不叫,则重新发牌,重新叫地主。

  3. 第一轮叫地主的玩家
    由于是单机版斗地主,直接指定了用户玩家为第一个叫地主的玩家
    也可以由系统随机选定

  4. 出牌
    将三张底牌交给地主,并亮出底牌让所有人都能看到。
    地主首先出牌,然后按逆时针顺序依次出牌,轮到用户跟牌时,用户可以选择 “ 不出 ” 或出比上一个玩家大的牌。
    某一玩家出完牌时结束本局。

游戏的胜负

任意一家出完牌后结束游戏,先出完牌的玩家代表的角色获胜:

  • 地主先出完牌地主获胜
  • 任意一个农民先出完牌则农民获胜

游戏计分规则

  • 底分:叫地主时的下注分数,可下注分数分别为:1分、2分、3分。
  • 倍数:初始为 1 ,每出一个炸弹或王炸翻一倍(留在手上没出的不算)。

当一局游戏结束后,基于低分和倍数计算个玩家得分:

  • 地主胜:
    地主:2 * 底分 * 倍数
    农民:- 底分 * 倍数

  • 农民胜:
    地主:-2 * 底分 * 倍数
    农民:底分 * 倍数

游戏相关的类介绍

此单机版游戏共需要 7 种类型的类,依次为:卡牌类、玩家类、窗口类、游戏控制类、线程类、游戏策略类、音频类。
在这里插入图片描述

卡牌类

卡牌类有两个:单张卡牌类和多张卡牌类。

  • 单张卡牌类 Card

游戏中的每张扑克牌都有属于自己的数据属性:花色和点数,通过这个类我们就可以存储和读取每张扑克牌的数据了。

  • 多张卡牌类 Cards

在游戏的过程中,每个玩家手中都有多张牌,此类对各个玩家游戏过程中手中的牌进行了管理

玩家类

游戏中的玩家类有三个,分别是:玩家类,机器人类,用户玩家类。其中机器人类和用户玩家类是玩家类的子类。

  • 玩家类 Player
    此类中定义了所有玩家共通一些属性和方法,比如:
    属性:玩家的角色、玩家类型、玩家性别、玩家头像的位置等
    方法:设置/获取玩家的姓名、性别、得分、角色;出牌过程中的玩家切换;玩家抢地主;玩家出牌等。

  • 机器人玩家类 Robot:
    继承父类属性和方法并重写父类抢地主和出牌的虚函数。

  • 用户玩家类 UserPlayer:
    继承父类属性和方法并重写父类抢地主和出牌的虚函数。

窗口类

  • 游戏开始时加载动画窗口:Loading
  • 游戏主窗口类 GamePanel
  • 单张扑克牌窗口:CardPanel
    每张扑克牌都对应这样的一个窗口对象
  • 自定义按钮:MyButton
    按钮美化处理
  • 游戏主窗口中的按钮组窗口:ButtonGroup
    给用户玩家抢地主、出牌使用
  • 游戏分数面板窗口:ScorePanel
    窗口右上角展示个玩家的得分
  • 游戏结束玩家的成绩窗口:EndingPanel
    游戏结束后弹出,显示各玩家成绩
  • 出牌倒计时窗口:Countdown
    用户玩家出牌倒计时,超过20未出牌,系统默认不出,直接跳过
  • 特效动画窗口:AnimationWindow
    王炸、炸弹、飞机、顺子、连对等

在这里插入图片描述

游戏控制类

游戏控制类 GameControl 是游戏中比较重要的一个类,它管理控制着游戏中的很多核心数据:

  • 玩家对象的初始化
  • 所有扑克牌数据的初始化
  • 游戏状态:发牌、叫地主、出牌
  • 玩家状态:考虑叫地主、考虑出牌、某个玩家获胜
  • 游戏数据:玩家卡牌数据、玩家下注和分数翻倍数据、玩家的得分
  • 游戏重置和发牌

游戏策略类

游戏中的游戏策略类一共有两个:出牌类和出牌策略类

  • 出牌类 PlayHand
    针对于斗地主的游戏规则,可以对玩家手中的牌进行牌型以及点数信息的获取,并且可以基于斗地主的游戏规则对排序进行大小的比较。
  • 出牌策略类 Strategy
    此类用于制定出牌策略,是整个项目中逻辑最复杂,代码量最大的一个类,通过这个类实现的一系列算法可以根据实际情况实现机器人玩家的叫地主 / 抢地主功能、机器人玩家的出牌功能。

线程类

游戏中的线程类一共有两个,分别是抢地主线程类和出牌的线程类。

  • 抢地主的线程类 RobotGrapLord
    机器人玩家抢地主创建一个子线程,抢地主结束销毁这个子线程。
  • 出牌的线程类 RobotPlayHand
    机器人玩家出牌创建一个子线程,出牌结束销毁这个子线程。

音频类

游戏音频类 BGMControl 主要用于控制游戏中各种音乐的播放:

  • 背景音乐
  • 抢地主 / 叫地主 提示音乐
  • 发牌音乐、选牌音乐
  • 牌型、点数提示音乐
  • 剩余牌量(只剩一张或两张时)提示

游戏主要组件

要完成此游戏的开发需要开发出如下三大组件:卡牌、玩家、窗口。
在这里插入图片描述

卡牌

作为一款卡牌游戏,开发这块游戏首先要准备的就是卡牌相关的信息,主要分为两部分:

  1. 卡牌窗口
    游戏中的每张扑克牌都是一个窗口对象,这样才能实现在主窗口中的移动,以及相应鼠标事件,最终实现扑克牌的点选和框选功能。
    每个扑克牌窗口都有属于自己的属性信息:
    承载数据:花色、点数
    展示:正面、背面
    所有者
    状态:选中、未选中

  2. 卡牌数据
    卡牌数据对应两个类,基于面向对象的思想,按照最小的粒度对功能进行归类,以降低代码的耦合度,让程序更容易维护。

    单张卡牌类:为每个扑克牌窗口对象存储数据(花色、点数)
    多张卡牌类:管理游戏过程中各个玩家手中的牌
    游戏开始阶段:发牌
    游戏进行阶段:出牌
    多张扑克牌的点数管理
    多张扑克牌的数量管理
    多张扑克牌的排序

玩家

  1. 玩家属性
    玩家的名字、分数
    游戏结果:赢了、输了
    游戏角色:地主、农民
    玩家性别:男、女
    玩家头像的显示方位:左、右
    玩家的类型:机器人、非机器人

  2. 游戏控制
    用户玩家通过主窗口自主完成操作
    叫地主 / 抢地主、出牌、不出牌

    机器人玩家通过启动线程按照提供的算法完成操作
    叫地主 / 抢地主、出牌、不出牌

窗口

在项目中,除了游戏主窗口,还有若干子窗口,有了多个子窗口的参与才能得到一个完整的主窗口:

  • 按钮组窗口(用户玩家叫地主和出牌)
  • 卡牌窗口(展示玩家的扑克牌信息)
  • 分数面板窗口(展示各个玩家的当前得分)
  • 成绩面板窗口(游戏结束,展示三个玩家的成绩)
  • 游戏特效窗口(展示特殊牌型的特效动画)

游戏控制

游戏控制类可以理解为程序的神经中枢,通过这类可以将项目中所有的类统筹协调起来实现类与类之间的联动。
在这里插入图片描述
关于斗地主游戏的控制主要分为以下几类:

  • 游戏状态控制
  • 玩家状态控制
  • 玩家的创建和管理
  • 叫地主/抢地主
  • 发牌
  • 出牌
  • 玩家分数管理
  • 游戏的重置
    以上列举的任何一种情况都会在游戏控制类的协调下完成类与类之间的数据传递或者事件传递。

源码

添加链接描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CCF20220601——归一化处理

CCF20220601——归一化处理 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…

vue3使用mitt.js进行各种组件间通信

我们在vue工程中&#xff0c;除开vue自带的什么父子间&#xff0c;祖孙间通信&#xff0c;还有一个非常方便的通信方式&#xff0c;类似Vue2.x 使用 EventBus 进行组件通信&#xff0c;而 Vue3.x 推荐使用 mitt.js。可以实现各个组件间的通信 优点&#xff1a;首先它足够小&…

0406 组合放大电路

组合放大电路 共射-共基放大电路共集-共集放大电路 4.6.1 共射—共基放大电路 4.6.2 共集—共集放大电路 共射-共基放大电路 共集-共集放大电路 (a) 原理图 (b)交流通路 T1、T2构成复合管&#xff0c;可等效为一个NPN管

c#点击listview控件获取内容

构造函数添加&#xff1a; 点击事件&#xff1a; &#xff08;listview控件确保有内容&#xff0c;比如已查询到数据添加到了listview&#xff09; if (listView_data_base.Items.Count > 0){listView_data_base.FullRowSelect true;listView_data_base.Items[listView_da…

【C语言】VS编译器的scanf

我们在写代码的时候通常需要用到输入函数&#xff1a;scanf&#xff0c;但在vs编译环境下却必须写为&#xff1a;scanf_s&#xff0c;这是为什么呢&#xff1f;这里就是vs规定的了&#xff0c;VS认为这样写更安全&#xff0c;但如果我们非要写成scanf形式也是有办法的。 # 看我…

服务器c盘爆满了,这几种方法可以帮助C盘“瘦身”

我们在使用服务器的时候基本不会在C盘安装软件&#xff0c;那么用久了发现C盘满了&#xff0c;提示空间不足&#xff1f;那么这是怎么回事&#xff0c;为什么空间会占用这么快呢&#xff1f; 原因一&#xff1a; C盘满了&#xff0c;很可能是因为电脑里的垃圾文件过多。操作系…

从业务角度来看,DevOps 是什么?

如果您在我们的应用程序名称中看到“DevOps”&#xff0c;这意味着我们必须正确解释该术语&#xff0c;我们会这样做&#xff0c;但角度会有所不同。让我们从业务角度看看 DevOps 是什么。 通用名称 首先你应该知道&#xff0c;DevOps 没有明确的定义。是的。 大多数情况下&a…

TypeScript-类型断言

类型断言 当开发者比TS本身更清楚当前的类型是什么&#xff0c;可以使用断言(as)让类型更加精确和具体 const _link document.getElementById(link) console.log(_link.href) // 出错了&#xff0c;如下图 const _link document.getElementById(link) as HTMLAnchorElement…

K8S认证|CKA题库+答案| 14. 排查故障节点

14、排查集群中的故障节点 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node wk8s master …

iptablese防火墙【SNAT和DNAT】

目录 1.SNAT策略及应用 1.1SNAT原理与应用 1.2 SNAT策略的工作原理 1.3 实验操练 2.DNAT策略 2.1 DNAT策略的概述 2.2 DNAT原理与应用 2.3 实验操练 1.SNAT策略及应用 1.1SNAT原理与应用 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xf…

AJAX、

文章目录 AJAX1. AJAX简介AJAX特点 2. XML简介3. AJAX发送get请求4. post请求设置体参数5. 设置请求头信息6. AJAX请求服务端响应json数据7. ie缓存问题8. 请求超时问题和网络异常9. 取消请求10. 请求重复取消11. jQuery中的AJAX请求12. axios函数发送AJAX使用fetch函数发送AJA…

PostgreSQL学习:关于PostgreSQL以及认证

1、关于PostgreSQL PostgreSQL&#xff08;简称PG&#xff09;是强大的企业级开源关系数据库&#xff0c;世界排名第四&#xff0c;前三位Oracle 、SQLServer、MySQL都是商业数据库或受商业主体的控制&#xff0c;PG是学术社区开源数据库&#xff0c;开源协议自由度非常高&…

【oracle的安装记录】

oracle安装记录 一、下载以后&#xff0c;解压到同一路径下面 二、双击可执行安装文件&#xff0c;等待文件加载 三、双击以后&#xff0c;弹出信息 四、提示该窗口&#xff0c;点击【是】即可 五、未填写配置安全更新信息 六、弹出小窗口&#xff0c;选择【是】 七、安装选项…

机器学习之决策树算法

使用决策树训练红酒数据集 完整代码&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn import tree, datasets from sklearn.model_selection import train_test_split# 准备数据&#xff0c;这里…

一个通过ADC采集NTC热敏电阻的温度传感器

前言: 如何设计一个电路,使用具有逐次逼近寄存器(SAR)模数转换器(ADC)的热敏电阻直接监测温度呢?温度传感电路需要使用负温度系数(NTC)热敏电阻与电阻器串联形成分压器,监测-25C至100C的温度范围。分压器具有产生与监测的温度成反比的输出电压的效果。电阻器分压器的…

面试准备-项目【面试准备】

面试准备-项目【面试准备】 前言面试准备自我介绍&#xff1a;项目介绍&#xff1a; 论坛项目功能总结简介数据库表设计注册功能登录功能显示登录信息功能发布帖子评论私信点赞功能关注功能通知搜索网站数据统计热帖排行缓存 论坛项目技术总结Http的无状态cookie和session的区别…

程序语言基础知识

文章目录 1.程序设计语言2. 程序设计语言的特点和分类3. 编译程序&#xff08;编译器&#xff09;的工作原理4. 程序语言的数据成分4.1 数据成分4.2 运算成分4.3 控制成分4.4 传输成分 1.程序设计语言 低级语言&#xff1a;机器语言和汇编语言。 机器语言&#xff1a;二进制代…

解决脚本刷服务器导致卡顿宕机的问题

在互联网服务领域&#xff0c;自动化脚本的不当使用或恶意攻击可能会导致服务器资源被过度消耗&#xff0c;从而引发服务响应缓慢甚至系统崩溃。特别是在电商、游戏、社交平台等领域&#xff0c;这种现象尤为常见。本文将深入探讨脚本刷服的常见形式、其对服务器性能的影响&…

Sentinel的隔离和降级

文章目录 1、概念简介2、FeignClient整合Sentinel2.1、修改配置&#xff0c;开启sentinel功能2.2、编写失败降级逻辑2.3、总结 3、线程隔离&#xff08;舱壁模式&#xff09;3.1、线程隔离的实现方式3.2、sentinel的线程隔离1&#xff09;配置隔离规则2&#xff09;Jmeter测试 …

蓉耀·时尚双子星------Yestar艺星首家星美学概念院璀璨启航

在医美行业的璀璨星空中&#xff0c;一颗新星于蓉城冉冉升起&#xff0c;点亮了求美者的道路。5月21日&#xff0c;蓉耀•时尚双⼦星--Yestar艺星首家星美学概念院在成都复城国际璀璨启幕&#xff0c;标志着Yestar艺星全球战略布局在蓉城迈出了重要一步&#xff0c;也意味着其在…