欧陆娱乐-专注卓越服务_注册登录首页





    棋牌资讯
    返回 >
    【棋牌游戏开发】45岁码农如何用2年时间撸出100款扑(pū)克游戏
    发布时间:2020-08-24 14:52编辑:欧陆娱乐管理员来源:深(shēn)圳市欧陆娱乐科技
    字号:
    扑克的(de)玩(wán)法非常(cháng)多,常见的就有斗(dòu)地主、跑得快、五十K、拖拉机、等等(děng)。在国内的不(bú)同地(dì)方,同类游戏(xì)的玩法也有不同讲究(jiū)。粗(cū)略估计,国内的扑(pū)克玩(wán)法,超过上百种(zhǒng)。

    要短期内开发出这(zhè)么多款扑克游戏,需要先(xiān)对大多数扑(pū)克游戏进(jìn)行系统的分析,归纳总结,然后打造一条流(liú)水线,每(měi)一款游戏都使(shǐ)用(yòng)相(xiàng)同的(de)框架,使用通用的(de)零组(zǔ)件,等等。本文主要(yào)内容就是讲述这个设计过程。

    1.算法库 

    扑克游戏的历(lì)史很悠(yōu)久,能够(gòu)广为(wéi)流行(háng)的一个原因就是上(shàng)手比较容(róng)易。就算(suàn)在今天,如果说一(yī)个人(rén)没读过书就学不(bú)会打(dǎ)扑克,这没人会相信。所以我(wǒ)估计扑克游戏的算法,都是(shì)比较(jiào)简单的。归纳一下,一般(bān)包括:

    -   牌的(de)大小(包括数字(zì)、花色(sè)等(děng));牌的数目和分数;判(pàn)断几张牌相同或连续;

    -   还需要(yào)一些对一组牌进行操作的算(suàn)法(fǎ),比如取(qǔ)出、合并等等。 

    基于以上的分析,我们估计可以(yǐ)完成(chéng)一套通(tōng)用的扑克的算(suàn)法库,能满足所有(yǒu)扑克(kè)游戏。最后实践证明,扑克算法库(kù)比(bǐ)预期稍微复杂一点,但仍(réng)在(zài)可(kě)接受范围内。

    此外,我们(men)很容易发现,很多流行(háng)的手游(yóu)的玩法、功(gōng)能层出不(bú)穷,开发团队频(pín)繁升级迭代。相反(fǎn),扑克游戏的玩法相对固定(dìng),演化相对较慢。所以,在系(xì)统设(shè)计上,我们假定扑(pū)克游戏的数量有限,玩法有限,发展(zhǎn)慢(màn)。这(zhè)样的好处(chù)是流水线设计好之后,以后改动很小,维护工作(zuò)量也比较小。 

    2.交(jiāo)互UI库(kù)

    扑克(kè)游戏可以归纳出3个核心要素:牌、规则、人(玩(wán)家)。对扑克游戏的一(yī)种(zhǒng)高度抽象的描(miáo)述是:**按照一定的流(liú)程和(hé)规(guī)则(zé),每(měi)个人(rén)通过选择选(xuǎn)项、选择牌、选(xuǎn)择(zé)数值,来争(zhēng)取获胜的一种游戏。**

    归纳了一下,玩(wán)家的行(háng)为包(bāo)括以下3种:

    -   对(duì)游(yóu)戏(xì)流程中的选项(xiàng),做出选择

    比如斗地主中的(de)叫地主(zhǔ)、不(bú)抢,都是玩家自己要做(zuò)的一种选择。出牌的(de)时候选择(zé)不出,也(yě)是(shì)一种选择。后续会将“选项”称之为“命令”。

    -   按照游(yóu)戏规则,对牌进行选择。

    -   比如选择要(yào)出的牌,分组(zǔ)摆牌等。

    -   对(duì)数值(分数)进行选择。

    以上三(sān)种玩家的行为,决定(dìng)了游戏(xì)客户端(duān)需要提供哪些(xiē)业务(wù)级UI库,对应下面几(jǐ)种: 

    -   一组按钮(niǔ)

    由玩家选择(zé)其中一个按钮(niǔ);在业(yè)务层,称为(wéi)**命令选择(zé)器**

    -   选(xuǎn)牌或牌分组的UI 

    >  允许(xǔ)玩家在(zài)一组牌中选出(chū)符合要求的牌。牌分组(zǔ)UI则允许(xǔ)玩家将(jiāng)牌放入不同分组或(huò)按不同顺序(xù)排布。这(zhè)2种在业务层都称为**牌选择器** 

    -   选择(zé)数值的UI

    >  可以用滑(huá)动(dòng)条,也有用按钮(niǔ)的。在业务(wù)层称为**值选择器** 

    以上我们抽象出了扑克游(yóu)戏的3个核心要(yào)素,以及(jí)玩家使用的3类UI。现在我们思(sī)考一下扑克游戏还需要哪些(xiē)UI。 

    除(chú)了牌、规则(zé)、人,实际上(shàng)我们还需(xū)要房间(桌子(zǐ))、椅子(座位)。 

    一(yī)款扑克(kè)游戏有很多界面、子界面;我们大体将(jiāng)其分(fèn)为:房(fáng)间内,房间外。房间内就是一个桌面(miàn),UI都显示(shì)到桌面上。房间外(wài)包括一(yī)些扑克游戏(xì)的常用(yòng)界面和功(gōng)能:注(zhù)册、登录、用户(hù)信息;房(fáng)间列表(biǎo);查询(xún)(分数记录、排名等);其他比如:公告、帮(bāng)助、设置。这些都可以做成(chéng)通用的几(jǐ)套,不同游戏选择其中的一套即可。房(fáng)间(jiān)内除(chú)了3类选择器,还需(xū)要下(xià)面一些界面(miàn)UI:座(zuò)位、牌(比(bǐ)如公(gōng)共牌、出牌)、定时器、图片、文本(用于显示(shì)数值或(huò)文字)。这(zhè)里除了一(yī)些业务级别的UI对(duì)象,也包含(hán)一些基础的UI对象。 

    3.管(guǎn)理员与通讯库(kù)

    现实中,几个朋友坐一桌打扑(pū)克的时候,每(měi)个人都按照流程和(hé)规则来,大家共同监督。而对于线(xiàn)上的扑克游戏,其实有一个规则执(zhí)行(háng)者,不妨(fáng)称之为**管理员**(我们前面将选(xuǎn)项称之为“命令”,可以理解为:管(guǎn)理员下(xià)达出牌的命令,由玩(wán)家(jiā)选择(zé)出牌还(hái)是不出。所以,“选(xuǎn)项”是站在玩家角度,“命令”是站在管理员角度)。那么(me)前文的(de)说法,可以进一步(bù)升级为(wéi):**扑克游戏就是(shì)由管理员控制(zhì)一(yī)套流程规则,特定的时(shí)候交由玩家来选择选项、选择牌(pái)、选(xuǎn)择值,这样一种竞赛游戏。**这里我们引入了(le)管(guǎn)理(lǐ)员的(de)概念(niàn)。 

    下面说通讯库(kù): 

    几(jǐ)个(gè)朋友坐一桌打扑克的时(shí)候,比如(rú)发(fā)牌(pái),每个(gè)人收到的牌,其他人不(bú)能看到;再比如一个人出牌,是要(yào)给(gěi)其他(tā)人看到。现(xiàn)实中打牌,我们是(shì)靠视觉(jiào)来(lái)看,相当于靠光线传播数据(图(tú)像),而对于(yú)网络(luò)游戏,则需要的是一个(gè)通讯(xùn)库通(tōng)过(guò)网络传(chuán)输数据(jù)。我们不能仅仅提供一个(gè)简单的(de)基于socket、websocket、http封装(比(bǐ)如常见的封装接口(kǒu)有

    read_cmd,read_version,read_int,read_string....),这太底层了,我们(men)需要的是一个业务级别的通讯库。 

    比如(rú)你跟(gēn)你老婆说:晚上加班(bān)要11点回去,你老婆说(shuō)“好的”。通讯库应该是这样(yàng)的: 

    创建一问一答的异步请(qǐng)求,发给老婆;

    请求分类是告假(晚上晚回);参(cān)数是11点;

    答复选项是3种:好的(de);不(bú)行;超时;(如果你老婆不是话(huà)痨的话)

    再(zài)比如(rú)人事部给每(měi)个员工发短信,内容(róng)是本月工资明(míng)细。通讯库就是(shì)群(qún)发短信,格式相同(tóng),但内容(róng)不同。

    通过分析一(yī)些扑(pū)克游戏,我(wǒ)们(men)从这样几个层面进行设计抽象:通讯方(fāng)向(xiàng)、是否应答、发送目(mù)标、单发还(hái)是群发。其中:不需要答复的,我(wǒ)们(men)叫通(tōng)知;需要答(dá)复的(de),我们叫“命令”或“请求”。从客户端发(fā)向管理员,称之为“客户端请(qǐng)求”;从管(guǎn)理(lǐ)员向(xiàng)客户端发(fā)送,称之为“服务端命令”;最(zuì)终(zhōng),我(wǒ)们把(bǎ)通讯归纳成(chéng)5种模板:**客户端请(qǐng)求;服务端命令;服(fú)务(wù)端广播;服务端私有通知;服(fú)务端(duān)公开通知;**

    有了通讯库,我们(men)需(xū)要往里面塞数据,数据包括:通(tōng)讯类型名(míng)称、命令选项(xiàng)、数值、牌。实际上数据(jù)内容也正是对应(yīng)了**选择选项(xiàng)、选择(zé)牌、选择数值(zhí)**

    举(jǔ)个例子:比如轮到(dào)一个玩家出(chū)牌了(le),我们使(shǐ)用**服务端命令**定义了(le)一(yī)个出牌命令,这是一问一答(dá)的通(tōng)讯,管理员发送时,不(bú)携带数据。客户端答复时,选项包括:出(chū)、不出;如(rú)果出牌(pái),则需要携带出的(de)牌(pái)。

    再举一个例子:游戏结束时需要通知输(shū)赢,这时可以使(shǐ)用**服(fú)务端公开通(tōng)知**,就(jiù)是服务端给每(měi)一个玩家发送通知,通知内容是这一局输了还是赢(yíng)了,赢了多少(shǎo)金币。那么,这个通讯中,携带的就(jiù)是赢的金币(如果为负值,则表(biǎo)明是(shì)输)

    总结一下:套用(yòng)这5种(zhǒng)模板,通过(guò)定义名(míng)称、携带的数据(jù),来定义游戏中特定的通讯过程。比如拖拉机游戏中有以下几种通讯的定义:发牌公开通知、亮主请求、亮主结果广播、扣底(dǐ)牌命令、扣底牌通知、出牌命令、出牌结果广播、结(jié)算通知。此外所有游戏(xì)都会(huì)用到一(yī)些公共的通讯(xùn)定义(yì):坐下请求、站起请求、一局开始(shǐ)广播、一局结束广播、聊(liáo)天(tiān)等(děng)。

    在通(tōng)讯中,还涉(shè)及到数据对不(bú)同客户端的(de)可见性(xìng)的问题,这(zhè)里就(jiù)不再深入介绍了。

    4.流程

    通过分析数十款不同特(tè)点的扑克游戏,整理了下面一(yī)种(zhǒng)思路:

    所有(yǒu)扑克游戏,在概念上,可以(yǐ)这(zhè)样(yàng)划分:

    -   **一局(jú)**

    比如(rú)斗地主,从发牌,到出牌,到结束,这是(shì)一局。一局结束后,开始下一局。

    -   **阶段(duàn)**

    一局游(yóu)戏可以划分成几(jǐ)个阶段,比如发牌阶段,出牌阶段,结算阶段(duàn);

    -   **一轮**

    大(dà)多数(shù)扑(pū)克游戏都是每(měi)个(gè)人轮着来的。还有一些游戏(或(huò)者游戏中的某个环节)是允许抢(qiǎng)先的(比如拖拉(lā)机的亮主(zhǔ))。在(zài)技术上(shàng),一轮就是一个异步循环,提供很(hěn)多参数(shù)和控(kòng)制。

    以上是为了方(fāng)便而从概(gài)念上划分的,并(bìng)不绝对,使用这(zhè)样一种套路,开(kāi)发不同扑克游戏(xì)时(shí),可以(yǐ)更加(jiā)统一了。

    5.组装

    到目(mù)前(qián)为止,我们已经完成了下(xià)面的成品模块、框(kuàng)架、零组件。

    -   一套扑克算法库

    -   房间内(nèi)的(de)UI库

    命令选择器;牌选(xuǎn)择器;值(zhí)选择器;头像、牌、图片、文本;

    -   房(fáng)间外的几套成品模块

    注册、登录、用户信息;房间列表;查询(分(fèn)数记录、排名等);其他(tā)比如:公告、帮助、设置。

    -   5种通讯类模板

    客户(hù)端(duān)请求(qiú);服(fú)务端(duān)命令;服务(wù)端广(guǎng)播;服务端私有通知;服务端公开通(tōng)知;

    -   流(liú)程库

    提供(gòng)一局、阶段、一轮等控(kòng)制;

    对于不(bú)同扑克游戏,我们首先要把游戏玩法弄清楚,然(rán)后用这些成品(pǐn)模块、框架、零组件,通过配置,通过编写一些代码来进(jìn)行粘合,从(cóng)而实现一个完整的(de)游戏。 

    在实际(jì)的开发(fā)过程中我们验(yàn)证了(le):对于(yú)简(jiǎn)单的(de)游(yóu)戏,三五天就可以完成(chéng),对于极其复杂的游戏,一般在1\~2周(比如拖拉机这类游戏)。这里(lǐ)说的(de)是一个人,同时也(yě)包含自(zì)测时间。

    为了提升粘(zhān)合的(de)效率,开发一个图形化(huà)编程工具,这(zhè)里(lǐ)附上一些截(jié)图供参考: 

    -   主界面 

    -   函数库

    除了(le)算法(fǎ)库、UI库(kù)以外,还包含了编程(chéng)语言级(jí)别(bié)的函数、流程控制函(hán)数等。

    -   牌型算法的例(lì)子

    >  有(yǒu)了这个工具,写牌型算法就快多(duō)了。

    -   流程控制

    这个图中的例子,包括了对(duì)一副牌进行洗牌,每次取出17张牌(pái),在一(yī)个循(xún)环中,给(gěi)每一个玩家发牌。下面是用英文显(xiǎn)示函数的样子:

    实际使(shǐ)用过(guò)程中,还是习(xí)惯(guàn)英文编(biān)程。切换到(dào)中文相当于看看(kàn)文档。

    -   调试

    调试(shì)的时候(hòu),可以(yǐ)随时看一组牌是什么牌,这(zhè)样很方便,对开发(fā)效率的提升很明显(xiǎn)。

    以上(shàng)介绍的(de)图形(xíng)化开(kāi)发(fā)工(gōng)具,已经具备的工程(chéng)管理(lǐ)、图(tú)形(xíng)化(huà)编程(编辑)、调试、发布(bù)、以(yǐ)及界(jiè)面设置等辅助功能为一体的集成化开发环境。是图形化编程的一次(cì)有益的尝试。

    6.测试

    技术人(rén)员自己可以搞定的测试是:单元测试;功(gōng)能测试;性能测试(压(yā)力测(cè)试);我们还请了专业(yè)的测试团(tuán)队进行了(le)游戏内测。

    简单(dān)的公测:找老家亲戚朋友拉(lā)微信群(qún),有些朋友人脉(mò)广,可以(yǐ)拉很多人。然后每天集中半小时搞一次测试,玩5局发(fā)10元红包,连续测试一周就差不多了。这种测试还挺有效,而且投入(rù)不大。

    7.进展

    目(mù)前(qián),项目已经基本达成了(le)技术目标,所有扑克游戏使用了(le)同一(yī)套算法库(C++代码(mǎ)使用emscripten转为javascript)、同一套UI库(html5/pixi.js)、两套标准(zhǔn)的大厅,同一个(gè)服务器程(chéng)序(C++),同一套通讯库(kù)(javascript)。另外还有:管理和监控后台;服(fú)务器更新;客户(hù)端更新;html5错误上报(bào);C++错误(wù)上报等等。 

    除C++代(dài)码未开源,其(qí)他代码都开源了,文档齐全,放(fàng)在gitee上了,欢(huān)迎大家下载(zǎi)使用,欢迎提意见和交流。

    (在(zài)html5浏览器兼容性方面有一些问题,比如UC浏览器、搜狗浏览器,特别需要熟悉这块的同学能给与一些帮(bāng)助(zhù).)

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

    8.作者的(de)话

    作者风(fēng)马9年前进(jìn)入到(dào)游戏行(háng)业,也有幸在一家上市游戏公司担任技术(shù)副总监(jiān),并承担过游戏引擎主(zhǔ)程的工作。如果(guǒ)有(yǒu)机会,我很想去加入古(gǔ)剑或河洛的团队中去学(xué)习。我大学出来后大部(bù)分时(shí)间里(lǐ),从事(shì)的是GIS(地图(tú)编辑、空(kōng)间分析、图形)开发,也有(yǒu)一部分跟(gēn)AutoCAD有(yǒu)关(guān),都是windows客户端。一个团队40多(duō)号人,开发企业用大(dà)型客户端(duān),当时在国内也颇为壮观。现(xiàn)在看到米国禁止咱(zán)们大学用MATLAB,我也很(hěn)想(xiǎng)投入到这些领域中。

    自己一直喜欢(huān)干技(jì)术,虽然早已是(shì)大龄,但(dàn)也一直坚持干技术,是因为(wéi)从大学时候起,就想在(zài)技术上干出一点名堂来。那时自己仰望一些技术大牛(niú),就像小虾米仰望14本天书中(zhōng)的大侠(xiá)一样,希望有一天像他们一样,成为技(jì)术(shù)界(jiè)的(de)侠之大者,成为对社会对行业有用的人。

    注(zhù):本文为行业人士技术分享,不代(dài)表(biǎo)欧陆娱乐观点(diǎn),如果对文中(zhōng)提到的技术感兴趣想认识本文作者有其他行业(yè)干货投(tóu)稿分享,请扫描二维码,联系(xì)我司商务进行对(duì)接。

    扫码对接商务认识本文作者(zhě)

    本文(wén)版权归欧陆娱乐(hú)所有,如若转载请注明出处

    ( 全文完 )

    游戏定制

    扫码联络(luò)游戏定制(zhì)顾问

    游(yóu)戏联运(yùn)

    扫码联络游戏联运专员(yuán)

    服务热线

    返回(huí)顶(dǐng)部

    官方公众(zhòng)号

    微信

    微信号(hào): 欧陆娱乐棋牌开发公众号

    扫一扫,关注网(wǎng)狐

    发(fā)现更多精彩

    微信在线

    微信

    微信号: 在线微(wēi)信客(kè)服

    游戏定(dìng)制

    游戏联运

    官方热(rè)线

    服务热线

    企业QQ

    客服热线

    分(fèn)享(xiǎng)

    QQ空(kōng)间

    腾讯微博

    QQ 好友

    新浪微博

    开心网

    贴(tiē)吧(ba)

    微信

    人人网

    欧陆娱乐-专注卓越服务_注册登录首页

    欧陆娱乐-专注卓越服务_注册登录首页