QT項目-歡樂斗地主游戲
- 游戲概述
- 游戲規則
- 牌型
- 牌型的大小
- 游戲角色
- 游戲規則
- 游戲的勝負
- 游戲計分規則
- 游戲相關的類介紹
- 卡牌類
- 玩家類
- 窗口類
- 游戲控制類
- 游戲策略類
- 線程類
- 音頻類
- 游戲主要組件
- 卡牌
- 玩家
- 窗口
- 游戲控制
- 源碼
游戲概述
游戲規則
不同地域游戲規則可能有些許差異,游戲按照如下規則進行實現。
牌型
牌型的大小
- 王炸最大,可以壓任意其他的牌型。
- 炸彈比王炸小,比其它牌型大。都是炸彈時按牌的點數比大小。
- 除火箭和炸彈外,其它牌必須要牌型相同且總數量相同才能比大小。
- 單牌按點數比大小(不分花色),依次是:
- 大王 > 小王 > 2 > A > K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3
- 對牌,三張點數相同的牌都按點數比大小。
- 順子按最大的一張牌的點數來比大小。
- 飛機帶翅膀和四帶二按其中的三順和四張部分來比,帶的副牌不參與牌型大小的比較。
游戲角色
參與游戲的玩家一共需要三個人,這三個人有兩種角色,分別是:
-
地主:1人,三人下注搶地主,分數最高者可稱為地主,地主自己一伙
-
農民:2人,沒有搶到地主的玩家為農民,此二人一伙。
游戲規則
-
發牌
一副牌 54 張,一人 17 張,留 3 張做底牌,在確定地主之前玩家不能看到底牌。 -
叫地主 / 搶地主
叫地主按出牌的順序輪流進行,每人只能叫一次。
叫地主時可以叫 “1 分 ” , “2 分 ” , “3 分 ” , “ 不叫 ” 。
后搶地主者只能叫比前面玩家高的分或者不叫。
搶地主結束后下注分值最大的玩家為地主;如果有玩家叫 “3 分 ” 則立即結束叫地主,該玩家為地主;如果都不叫,則重新發牌,重新叫地主。 -
第一輪叫地主的玩家
由于是單機版斗地主,直接指定了用戶玩家為第一個叫地主的玩家
也可以由系統隨機選定 -
出牌
將三張底牌交給地主,并亮出底牌讓所有人都能看到。
地主首先出牌,然后按逆時針順序依次出牌,輪到用戶跟牌時,用戶可以選擇 “ 不出 ” 或出比上一個玩家大的牌。
某一玩家出完牌時結束本局。
游戲的勝負
任意一家出完牌后結束游戲,先出完牌的玩家代表的角色獲勝:
- 地主先出完牌地主獲勝
- 任意一個農民先出完牌則農民獲勝
游戲計分規則
- 底分:叫地主時的下注分數,可下注分數分別為: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 主要用于控制游戲中各種音樂的播放:
- 背景音樂
- 搶地主 / 叫地主 提示音樂
- 發牌音樂、選牌音樂
- 牌型、點數提示音樂
- 剩余牌量(只剩一張或兩張時)提示
游戲主要組件
要完成此游戲的開發需要開發出如下三大組件:卡牌、玩家、窗口。
卡牌
作為一款卡牌游戲,開發這塊游戲首先要準備的就是卡牌相關的信息,主要分為兩部分:
-
卡牌窗口
游戲中的每張撲克牌都是一個窗口對象,這樣才能實現在主窗口中的移動,以及相應鼠標事件,最終實現撲克牌的點選和框選功能。
每個撲克牌窗口都有屬于自己的屬性信息:
承載數據:花色、點數
展示:正面、背面
所有者
狀態:選中、未選中 -
卡牌數據
卡牌數據對應兩個類,基于面向對象的思想,按照最小的粒度對功能進行歸類,以降低代碼的耦合度,讓程序更容易維護。單張卡牌類:為每個撲克牌窗口對象存儲數據(花色、點數)
多張卡牌類:管理游戲過程中各個玩家手中的牌
游戲開始階段:發牌
游戲進行階段:出牌
多張撲克牌的點數管理
多張撲克牌的數量管理
多張撲克牌的排序
玩家
-
玩家屬性
玩家的名字、分數
游戲結果:贏了、輸了
游戲角色:地主、農民
玩家性別:男、女
玩家頭像的顯示方位:左、右
玩家的類型:機器人、非機器人 -
游戲控制
用戶玩家通過主窗口自主完成操作
叫地主 / 搶地主、出牌、不出牌機器人玩家通過啟動線程按照提供的算法完成操作
叫地主 / 搶地主、出牌、不出牌
窗口
在項目中,除了游戲主窗口,還有若干子窗口,有了多個子窗口的參與才能得到一個完整的主窗口:
- 按鈕組窗口(用戶玩家叫地主和出牌)
- 卡牌窗口(展示玩家的撲克牌信息)
- 分數面板窗口(展示各個玩家的當前得分)
- 成績面板窗口(游戲結束,展示三個玩家的成績)
- 游戲特效窗口(展示特殊牌型的特效動畫)
游戲控制
游戲控制類可以理解為程序的神經中樞,通過這類可以將項目中所有的類統籌協調起來實現類與類之間的聯動。
關于斗地主游戲的控制主要分為以下幾類:
- 游戲狀態控制
- 玩家狀態控制
- 玩家的創建和管理
- 叫地主/搶地主
- 發牌
- 出牌
- 玩家分數管理
- 游戲的重置
以上列舉的任何一種情況都會在游戲控制類的協調下完成類與類之間的數據傳遞或者事件傳遞。
源碼
添加鏈接描述