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. 游戏控制
    用户玩家通过主窗口自主完成操作
    叫地主 / 抢地主、出牌、不出牌

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

窗口

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

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

游戏控制

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

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

源码

添加链接描述

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

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

相关文章

MySQL之Schema与数据类型优化(三)

Schema与数据类型优化 BLOB和TEXT类型 BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。 实际上它们分别属于两组不同的数据类型家族:字符类型是TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,LONG…

Spring Cloud整合Sentinel

1、引入依赖 链接: 点击查看依赖关系 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel应用直接引用starter <dependency><groupId&…

【UE5.1】* 动画重定向 (让你的角色可以使用小白人全部动画)

前言 这里以小白人动画重定向给商城资产“Adventure Character”中的角色为例&#xff0c;阐述如何使用UE5.1进行动画重定向。 步骤 1. 创建一个IK绑定 这里选择小白人的骨骼网格体 这里命名为“IKRig_Mannequin” 2. 再新建一个IK绑定&#xff0c;这里使用你要替换给的角色…

MyBatis入门——MyBatis XML配置文件(3)

目录 一、配置连接字符串和MyBatis 二、写持久层代码 1、添加 mapper 接口 2、添加 USerInfoXmlMapper.xml 3、测试类代码 三、增删改查操作 1、增&#xff08;Insert&#xff09; 返回自增 id 2、删&#xff08;Delete&#xff09; 3、改&#xff08;update&#xf…

软考--试题六--中介者模式(Mediator)

中介者模式(Meditor) 意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互 结构 适用性 1、一组对象以定义良好但是复杂的方式进行通信&#xff0c;产生的相互依赖关…

民国漫画杂志《时代漫画》第17期.PDF

时代漫画17.PDF: https://url03.ctfile.com/f/1779803-1248612629-85326d?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

力扣HOT100 - 1143. 最长公共子序列

解题思路&#xff1a; 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…

深度学习之基于YoloV5的动物识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在生态研究、动物保护、以及畜牧业等多个领域&#xff0c;对动物进行准确、高效的识别都具有重…

形态学操作:腐蚀、膨胀、开闭运算、顶帽底帽变换、形态学梯度区别与联系

一、总述相关概念 二、相关问题 1.形态学操作中的腐蚀和膨胀对图像有哪些影响&#xff1f; 形态学操作中的腐蚀和膨胀是两种常见的图像处理技术&#xff0c;它们通过对图像进行局部区域的像素值替换来实现对图像形状的修改。 腐蚀操作通常用于去除图像中的噪声和细小的细节&a…

单链表oj

练习 1. 删除val节点 oj链接 这道题最先想出来的方法肯定是在遍历链表的同时删除等于val的节点&#xff0c;我们用第二中思路:不等于val的节点尾插&#xff0c;让后返回新节点。代码如下&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {str…

软考高级-信息系统项目管理师案例题选择题做题总结

1.不应该只会建立变更和配置管理的规则&#xff0c;应该建立变更控制流程 2.变更的影响不应该只由工程师评估 3.没有对变更和修改进行记录 4.变更完成后&#xff0c;客户没有对变更进行验证 5.变更没有通知相关人员 6.变更没有和配置管理关联 7.项目变更管理的工作流程&#xf…

SOLIDWORKS科研版的介绍

SOLIDWORKS科研版的介绍 针对研究项目充分利用软件功能&#xff0c;无任何限制访问有关工程和科学的最新技术&#xff0c;并与世界各地的其他用户进行交流。 SOLIDWORKS科研版可为研究人员提供有关 SOLIDWORKS 设计和科学工程技术的最新知识&#xff0c;并使他们与世界范围内的…

08.CNN

文章目录 Observation 1Pooling - Max PoolingFlattenApplication&#xff1a;Playing Go使用验证集选择模型食物分类 Observation 1 Pooling - Max Pooling Pooling主要为了降低运算量&#xff0c;现在一般不用了&#xff0c;全convolution Flatten Application&#xff1a;P…

Linux|如何在 awk 中使用流控制语句

引言 当您从 Awk 系列一开始回顾我们迄今为止介绍的所有 Awk 示例时&#xff0c;您会注意到各个示例中的所有命令都是按顺序执行的&#xff0c;即一个接一个。但在某些情况下&#xff0c;我们可能希望根据某些条件运行一些文本过滤操作&#xff0c;这就是流程控制语句的方法。 …

鲸尾识别获奖方案总结

文章目录 1st solution(classification)2nd place code, end to end whale Identification model3rd place solution with code: ArcFace4th Place Solution: SIFT Siamese5th solution blog post code -Siamese7th place Pure Magic thanks Radek solution: classification9…

QGIS DEM数据快速获取

背景 Dem 是非常重要的数据&#xff0c;30 m 的精度也是最容易获取的&#xff0c;目前有很多种方式可以获取&#xff0c;比如地理空间数据云&#xff0c;今天介绍用 QGIS插件获取。 这种方式的最大优势是方便快捷。 插件下载与安装 插件-管理并安装插件-搜索下载 OpenTopogr…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

Python实现天气数据采集

Python实现天气数据采集 一、需求介绍二、完整代码一、需求介绍 本次天气数据采集的需求是获取每日的最高温、最低温、风力、风向、天气状况、AQI指数,如图所示,完整代码附后: 本次采集的目标网址是2345天气网: 上图的URL中,beijing是城市名称的缩写,54511即为城市代码…

科技引领未来:高速公路可视化

高速公路可视化监控系统利用实时视频、传感器数据和大数据分析&#xff0c;通过图扑 HT 可视化展示交通流量、车速、事故和路况信息。交通管理人员可以实时监控、快速响应突发事件&#xff0c;并优化交通信号和指挥方案。这一系统不仅提高了道路安全性和车辆通行效率&#xff0…

vue3结合element-plus之如何优雅的使用表格

背景 表格组件的使用在后台管理系统中是非常常见的,但是如果每次使用表格我们都去一次一次地从 element-plus 官网去 复制、粘贴和修改成自己想要的表格。 这样一来也说得过去,但是如果我们静下来细想不难发现,表格的使用都是大同小异的,每次都去复制粘贴,对于有很多表格…