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.pswp.cn/web/13484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13484.shtml
英文地址,請注明出處:http://en.pswp.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…

XML基礎知識

1. 常見配置文件類型 properties文件,例如druid連接池就是使用properties文件作為配置文件 XML文件,例如Tomcat就是使用XML文件作為配置文件 YAML文件,例如SpringBoot就是使用YAML作為配置文件 json文件,通常用來做文件傳輸&#xff0c;也可以用來做前端或者移動端的配置文件…

軟考高級-信息系統項目管理師案例題選擇題做題總結

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…

學校上課,是耽誤我學習了。。

>>上一篇&#xff08;文科生在三本院校&#xff0c;讀計算機專業&#xff09; 2015年9月&#xff0c;我入學了。 我期待的大學生活是多姿多彩的&#xff0c;我會參加各種社團&#xff0c;參與各種有意思的活動。 但我是個社恐&#xff0c;有過嘗試&#xff0c;但還是難…

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 信號的…

C# Winform實現五子棋游戲(代完善)

實現了基本的玩法。 BoardController.cs using System;namespace GomokuGame {public class BoardController{private static BoardController instance;private readonly int[,] board;private const int boardSize 15;private BoardController(){board new int[boardSize…