棋牌資訊
返回 >
【棋牌游戲開(kāi)發(fā)】45歲碼農如何用2年時(shí)間擼出100款撲克游戲
發(fā)布時(shí)間:2020-08-24 14:52編輯:網(wǎng)狐管理員來(lái)源:深圳市網(wǎng)狐科技
字號:
撲克的玩法非常多,常見(jiàn)的就有斗地主、跑得快、五十K、拖拉機、等等。在國內的不同地方,同類(lèi)游戲的玩法也有不同講究。粗略估計,國內的撲克玩法,超過(guò)上百種。

要短期內開(kāi)發(fā)出這么多款撲克游戲,需要先對大多數撲克游戲進(jìn)行系統的分析,歸納總結,然后打造一條流水線(xiàn),每一款游戲都使用相同的框架,使用通用的零組件,等等。本文主要內容就是講述這個(gè)設計過(guò)程。

1.算法庫 

撲克游戲的歷史很悠久,能夠廣為流行的一個(gè)原因就是上手比較容易。就算在今天,如果說(shuō)一個(gè)人沒(méi)讀過(guò)書(shū)就學(xué)不會(huì )打撲克,這沒(méi)人會(huì )相信。所以我估計撲克游戲的算法,都是比較簡(jiǎn)單的。歸納一下,一般包括:

-   牌的大?。ò〝底?、花色等);牌的數目和分數;判斷幾張牌相同或連續;

-   還需要一些對一組牌進(jìn)行操作的算法,比如取出、合并等等。 

基于以上的分析,我們估計可以完成一套通用的撲克的算法庫,能滿(mǎn)足所有撲克游戲。最后實(shí)踐證明,撲克算法庫比預期稍微復雜一點(diǎn),但仍在可接受范圍內。

此外,我們很容易發(fā)現,很多流行的手游的玩法、功能層出不窮,開(kāi)發(fā)團隊頻繁升級迭代。相反,撲克游戲的玩法相對固定,演化相對較慢。所以,在系統設計上,我們假定撲克游戲的數量有限,玩法有限,發(fā)展慢。這樣的好處是流水線(xiàn)設計好之后,以后改動(dòng)很小,維護工作量也比較小。 

2.交互UI庫

撲克游戲可以歸納出3個(gè)核心要素:牌、規則、人(玩家)。對撲克游戲的一種高度抽象的描述是:**按照一定的流程和規則,每個(gè)人通過(guò)選擇選項、選擇牌、選擇數值,來(lái)爭取獲勝的一種游戲。**

歸納了一下,玩家的行為包括以下3種:

-   對游戲流程中的選項,做出選擇

比如斗地主中的叫地主、不搶?zhuān)际峭婕易约阂龅囊环N選擇。出牌的時(shí)候選擇不出,也是一種選擇。后續會(huì )將“選項”稱(chēng)之為“命令”。

-   按照游戲規則,對牌進(jìn)行選擇。

-   比如選擇要出的牌,分組擺牌等。

-   對數值(分數)進(jìn)行選擇。

以上三種玩家的行為,決定了游戲客戶(hù)端需要提供哪些業(yè)務(wù)級UI庫,對應下面幾種: 

-   一組按鈕

由玩家選擇其中一個(gè)按鈕;在業(yè)務(wù)層,稱(chēng)為**命令選擇器**。

-   選牌或牌分組的UI 

>  允許玩家在一組牌中選出符合要求的牌。牌分組UI則允許玩家將牌放入不同分組或按不同順序排布。這2種在業(yè)務(wù)層都稱(chēng)為**牌選擇器**。 

-   選擇數值的UI

>  可以用滑動(dòng)條,也有用按鈕的。在業(yè)務(wù)層稱(chēng)為**值選擇器**。 

以上我們抽象出了撲克游戲的3個(gè)核心要素,以及玩家使用的3類(lèi)UI?,F在我們思考一下?lián)淇擞螒蜻€需要哪些UI。 

除了牌、規則、人,實(shí)際上我們還需要房間(桌子)、椅子(座位)。 

一款撲克游戲有很多界面、子界面;我們大體將其分為:房間內,房間外。房間內就是一個(gè)桌面,UI都顯示到桌面上。房間外包括一些撲克游戲的常用界面和功能:注冊、登錄、用戶(hù)信息;房間列表;查詢(xún)(分數記錄、排名等);其他比如:公告、幫助、設置。這些都可以做成通用的幾套,不同游戲選擇其中的一套即可。房間內除了3類(lèi)選擇器,還需要下面一些界面UI:座位、牌(比如公共牌、出牌)、定時(shí)器、圖片、文本(用于顯示數值或文字)。這里除了一些業(yè)務(wù)級別的UI對象,也包含一些基礎的UI對象。 

3.管理員與通訊庫

現實(shí)中,幾個(gè)朋友坐一桌打撲克的時(shí)候,每個(gè)人都按照流程和規則來(lái),大家共同監督。而對于線(xiàn)上的撲克游戲,其實(shí)有一個(gè)規則執行者,不妨稱(chēng)之為**管理員**(我們前面將選項稱(chēng)之為“命令”,可以理解為:管理員下達出牌的命令,由玩家選擇出牌還是不出。所以,“選項”是站在玩家角度,“命令”是站在管理員角度)。那么前文的說(shuō)法,可以進(jìn)一步升級為:**撲克游戲就是由管理員控制一套流程規則,特定的時(shí)候交由玩家來(lái)選擇選項、選擇牌、選擇值,這樣一種競賽游戲。**這里我們引入了管理員的概念。 

下面說(shuō)通訊庫: 

幾個(gè)朋友坐一桌打撲克的時(shí)候,比如發(fā)牌,每個(gè)人收到的牌,其他人不能看到;再比如一個(gè)人出牌,是要給其他人看到?,F實(shí)中打牌,我們是靠視覺(jué)來(lái)看,相當于靠光線(xiàn)傳播數據(圖像),而對于網(wǎng)絡(luò )游戲,則需要的是一個(gè)通訊庫通過(guò)網(wǎng)絡(luò )傳輸數據。我們不能僅僅提供一個(gè)簡(jiǎn)單的基于socket、websocket、http封裝(比如常見(jiàn)的封裝接口有

read_cmd,read_version,read_int,read_string....),這太底層了,我們需要的是一個(gè)業(yè)務(wù)級別的通訊庫。 

比如你跟你老婆說(shuō):晚上加班要11點(diǎn)回去,你老婆說(shuō)“好的”。通訊庫應該是這樣的: 

創(chuàng )建一問(wèn)一答的異步請求,發(fā)給老婆;

請求分類(lèi)是告假(晚上晚回);參數是11點(diǎn);

答復選項是3種:好的;不行;超時(shí);(如果你老婆不是話(huà)癆的話(huà))

再比如人事部給每個(gè)員工發(fā)短信,內容是本月工資明細。通訊庫就是群發(fā)短信,格式相同,但內容不同。

通過(guò)分析一些撲克游戲,我們從這樣幾個(gè)層面進(jìn)行設計抽象:通訊方向、是否應答、發(fā)送目標、單發(fā)還是群發(fā)。其中:不需要答復的,我們叫通知;需要答復的,我們叫“命令”或“請求”。從客戶(hù)端發(fā)向管理員,稱(chēng)之為“客戶(hù)端請求”;從管理員向客戶(hù)端發(fā)送,稱(chēng)之為“服務(wù)端命令”;最終,我們把通訊歸納成5種模板:**客戶(hù)端請求;服務(wù)端命令;服務(wù)端廣播;服務(wù)端私有通知;服務(wù)端公開(kāi)通知;**

有了通訊庫,我們需要往里面塞數據,數據包括:通訊類(lèi)型名稱(chēng)、命令選項、數值、牌。實(shí)際上數據內容也正是對應了**選擇選項、選擇牌、選擇數值**。

舉個(gè)例子:比如輪到一個(gè)玩家出牌了,我們使用**服務(wù)端命令**定義了一個(gè)出牌命令,這是一問(wèn)一答的通訊,管理員發(fā)送時(shí),不攜帶數據??蛻?hù)端答復時(shí),選項包括:出、不出;如果出牌,則需要攜帶出的牌。

再舉一個(gè)例子:游戲結束時(shí)需要通知輸贏(yíng),這時(shí)可以使用**服務(wù)端公開(kāi)通知**,就是服務(wù)端給每一個(gè)玩家發(fā)送通知,通知內容是這一局輸了還是贏(yíng)了,贏(yíng)了多少金幣。那么,這個(gè)通訊中,攜帶的就是贏(yíng)的金幣(如果為負值,則表明是輸)

總結一下:套用這5種模板,通過(guò)定義名稱(chēng)、攜帶的數據,來(lái)定義游戲中特定的通訊過(guò)程。比如拖拉機游戲中有以下幾種通訊的定義:發(fā)牌公開(kāi)通知、亮主請求、亮主結果廣播、扣底牌命令、扣底牌通知、出牌命令、出牌結果廣播、結算通知。此外所有游戲都會(huì )用到一些公共的通訊定義:坐下請求、站起請求、一局開(kāi)始廣播、一局結束廣播、聊天等。

在通訊中,還涉及到數據對不同客戶(hù)端的可見(jiàn)性的問(wèn)題,這里就不再深入介紹了。

4.流程

通過(guò)分析數十款不同特點(diǎn)的撲克游戲,整理了下面一種思路:

所有撲克游戲,在概念上,可以這樣劃分:

-   **一局**

比如斗地主,從發(fā)牌,到出牌,到結束,這是一局。一局結束后,開(kāi)始下一局。

-   **階段**

一局游戲可以劃分成幾個(gè)階段,比如發(fā)牌階段,出牌階段,結算階段;

-   **一輪**

大多數撲克游戲都是每個(gè)人輪著(zhù)來(lái)的。還有一些游戲(或者游戲中的某個(gè)環(huán)節)是允許搶先的(比如拖拉機的亮主)。在技術(shù)上,一輪就是一個(gè)異步循環(huán),提供很多參數和控制。

以上是為了方便而從概念上劃分的,并不絕對,使用這樣一種套路,開(kāi)發(fā)不同撲克游戲時(shí),可以更加統一了。

5.組裝

到目前為止,我們已經(jīng)完成了下面的成品模塊、框架、零組件。

-   一套撲克算法庫

-   房間內的UI庫

命令選擇器;牌選擇器;值選擇器;頭像、牌、圖片、文本;

-   房間外的幾套成品模塊

注冊、登錄、用戶(hù)信息;房間列表;查詢(xún)(分數記錄、排名等);其他比如:公告、幫助、設置。

-   5種通訊類(lèi)模板

客戶(hù)端請求;服務(wù)端命令;服務(wù)端廣播;服務(wù)端私有通知;服務(wù)端公開(kāi)通知;

-   流程庫

提供一局、階段、一輪等控制;

對于不同撲克游戲,我們首先要把游戲玩法弄清楚,然后用這些成品模塊、框架、零組件,通過(guò)配置,通過(guò)編寫(xiě)一些代碼來(lái)進(jìn)行粘合,從而實(shí)現一個(gè)完整的游戲。 

在實(shí)際的開(kāi)發(fā)過(guò)程中我們驗證了:對于簡(jiǎn)單的游戲,三五天就可以完成,對于極其復雜的游戲,一般在1\~2周(比如拖拉機這類(lèi)游戲)。這里說(shuō)的是一個(gè)人,同時(shí)也包含自測時(shí)間。

為了提升粘合的效率,開(kāi)發(fā)一個(gè)圖形化編程工具,這里附上一些截圖供參考: 

-   主界面 

-   函數庫

除了算法庫、UI庫以外,還包含了編程語(yǔ)言級別的函數、流程控制函數等。

-   牌型算法的例子

>  有了這個(gè)工具,寫(xiě)牌型算法就快多了。

-   流程控制

這個(gè)圖中的例子,包括了對一副牌進(jìn)行洗牌,每次取出17張牌,在一個(gè)循環(huán)中,給每一個(gè)玩家發(fā)牌。下面是用英文顯示函數的樣子:

實(shí)際使用過(guò)程中,還是習慣英文編程。切換到中文相當于看看文檔。

-   調試

調試的時(shí)候,可以隨時(shí)看一組牌是什么牌,這樣很方便,對開(kāi)發(fā)效率的提升很明顯。

以上介紹的圖形化開(kāi)發(fā)工具,已經(jīng)具備的工程管理、圖形化編程(編輯)、調試、發(fā)布、以及界面設置等輔助功能為一體的集成化開(kāi)發(fā)環(huán)境。是圖形化編程的一次有益的嘗試。

6.測試

技術(shù)人員自己可以搞定的測試是:?jiǎn)卧獪y試;功能測試;性能測試(壓力測試);我們還請了專(zhuān)業(yè)的測試團隊進(jìn)行了游戲內測。

簡(jiǎn)單的公測:找老家親戚朋友拉微信群,有些朋友人脈廣,可以拉很多人。然后每天集中半小時(shí)搞一次測試,玩5局發(fā)10元紅包,連續測試一周就差不多了。這種測試還挺有效,而且投入不大。

7.進(jìn)展

目前,項目已經(jīng)基本達成了技術(shù)目標,所有撲克游戲使用了同一套算法庫(C++代碼使用emscripten轉為javascript)、同一套UI庫(html5/pixi.js)、兩套標準的大廳,同一個(gè)服務(wù)器程序(C++),同一套通訊庫(javascript)。另外還有:管理和監控后臺;服務(wù)器更新;客戶(hù)端更新;html5錯誤上報;C++錯誤上報等等。 

除C++代碼未開(kāi)源,其他代碼都開(kāi)源了,文檔齊全,放在gitee上了,歡迎大家下載使用,歡迎提意見(jiàn)和交流。

(在html5瀏覽器兼容性方面有一些問(wèn)題,比如UC瀏覽器、搜狗瀏覽器,特別需要熟悉這塊的同學(xué)能給與一些幫助.)

[gitee.com/szcuipeng/public](https://gitee.com/szcuipeng/public)

8.作者的話(huà)

作者風(fēng)馬9年前進(jìn)入到游戲行業(yè),也有幸在一家上市游戲公司擔任技術(shù)副總監,并承擔過(guò)游戲引擎主程的工作。如果有機會(huì ),我很想去加入古劍或河洛的團隊中去學(xué)習。我大學(xué)出來(lái)后大部分時(shí)間里,從事的是GIS(地圖編輯、空間分析、圖形)開(kāi)發(fā),也有一部分跟AutoCAD有關(guān),都是windows客戶(hù)端。一個(gè)團隊40多號人,開(kāi)發(fā)企業(yè)用大型客戶(hù)端,當時(shí)在國內也頗為壯觀(guān)?,F在看到米國禁止咱們大學(xué)用MATLAB,我也很想投入到這些領(lǐng)域中。

自己一直喜歡干技術(shù),雖然早已是大齡,但也一直堅持干技術(shù),是因為從大學(xué)時(shí)候起,就想在技術(shù)上干出一點(diǎn)名堂來(lái)。那時(shí)自己仰望一些技術(shù)大牛,就像小蝦米仰望14本天書(shū)中的大俠一樣,希望有一天像他們一樣,成為技術(shù)界的俠之大者,成為對社會(huì )對行業(yè)有用的人。

注:本文為行業(yè)人士技術(shù)分享,不代表網(wǎng)狐觀(guān)點(diǎn),如果對文中提到的技術(shù)感興趣想認識本文作者,有其他行業(yè)干貨投稿分享,請掃描二維碼,聯(lián)系我司商務(wù)進(jìn)行對接。

掃碼對接商務(wù)認識本文作者

本文版權歸網(wǎng)狐所有,如若轉載請注明出處

( 全文完 )

游戲定制

掃碼聯(lián)絡(luò )游戲定制顧問(wèn)

游戲聯(lián)運

掃碼聯(lián)絡(luò )游戲聯(lián)運專(zhuān)員

服務(wù)熱線(xiàn)

返回頂部

官方公眾號

微信

微信號: 網(wǎng)狐棋牌開(kāi)發(fā)公眾號

掃一掃,關(guān)注網(wǎng)狐

發(fā)現更多精彩

微信在線(xiàn)

微信

微信號: 在線(xiàn)微信客服

游戲定制

游戲聯(lián)運

官方熱線(xiàn)

服務(wù)熱線(xiàn)

企業(yè)QQ

客服熱線(xiàn)

分享

QQ空間

騰訊微博

QQ 好友

新浪微博

開(kāi)心網(wǎng)

貼吧

微信

人人網(wǎng)

97av在线视频_免费无码不卡av一区二区_蜜柚在线观看免费高清官网视频_国产综合精品91久久久