• 日常搜索
  • 端口查询
  • IP查询
  • 在线工具
  • 搜本站

房卡麻将游戏算法修改课程一

要修改一个麻将游戏源码,用其内核来做二次开发,首先必须了解该源码。所以 第一步从介绍整个源码框架开始。这个是基础,希望大家耐心的了解。

由于我们现在使用这几套源码均是出自于网狐 6603 的内核,所以其源码中 保留了很多网狐原来的东西,而这些东西大部分是有用的,但也有小部分是无用 的,这给我们分析源码带来了一定难度。当然,我这里不是想说难于不难的问题, 只是要提醒大家,这几套源码中有部分的代码是无用,大家在阅读代码,和分析 代码的时候不要太过于纠结。

网狐的东西我这里就不说,这里就针对性的说一下房卡麻将相关的东西,首 先让我们从服务器端开始介绍,然后是客户端的源码介绍;之后是服务器端的修 改,最后是客户端的修改。

服务器端源码介绍

首先我们用 VS 打开服务器端的源码看看:

房卡麻将游戏算法修改课程一  第1张

熟悉 C++的人应该知道什么是头文件和源文件(本课程不会讲编程基础,关于 C++的内容大家自己学习,如果这里来讲那这个课程就写不完了。),我这里就不多说了。这里顺带说一下上图中机器人服务:

房卡麻将游戏算法修改课程一  第2张

这些源码目前我们展示不去讨论,但是它并不是没有用的,我们现在的房卡 类游戏都没有使用机器人这个功能,但是并不代表这些功能我们不能用。在后期 的课程中,我们会讨论怎么创建金币房间和公共房间。到 时候就会用到机器人, 但是我这里需要说明的一个问题就是,麻将、斗地主等等这些技巧性比较强的游 戏,机器人的效果不一定很好,因为玩家的游戏水平不同,导致同样难度的机器 人设置对不同的玩家会起到不同作用,这些问题以后再说。这里提一下是希望大 家明白,网狐本身这些保留的源码,并非无用,而且很多时候你删除部分源码可 能导致意想不到的后果。如果不非常有把握的情况下建议保留。

好了言归正传,我们下面来看看游戏服务器的源文件:CMD_HNMJ.h 头文件:

房卡麻将游戏算法修改课程一  第3张

大家打开这个头文件会看到如上图的代码,其中很多地方都有注释。这里我 就不一一的介绍了,很多大家应该看名字就知道什么意思了。当然还有很多变量 或函数的虽然有了注释,大家看文字也大概知道其意思,但是却不知道它起的作 用,我这里主要就是介绍这些东西。以及我们之后修改游戏算法的时候可能会用 到的东西,比如游戏 ID 等等。

房卡麻将游戏算法修改课程一  第4张

上图的代码中,游戏 ID 变量:(以后我只说游戏 ID 就不加变量这个形容词),是网狐对子游戏的唯一标示,如果你修改了这里那么数据库里也要做相应的修改; 游戏人数:大家最好别动,之前有人说是不是这里改成 3 就可以是 3 人麻将了?这里的游戏人数修改了,相应还要修改的地方还有很多游戏才可以正常运行。 目前最好不要修改。

程序版本:这个很重要,这里修改过后如果客户端的版本和服务器端的版本 不一致,就会要求用户升级,我们可以在数据库中加入升级的网站地址或客户端 下载地址完成提醒用户升级的功能。游戏类型:这里的游戏类型就是我们在创建房间的时候看到的金币类型,练习类型等等。

游戏状态:

这里是只游戏房间的状态,其本身有 3 个状态包括:空闲、等待、 进行。

这三个状态 是网狐本身的基础状态 ,房卡增加了两个状态 :就是源码中

房卡麻将游戏算法修改课程一  第5张

我们来看代码段 2:

房卡麻将游戏算法修改课程一  第6张

上图中有几个地方没有注释,我这里给大家讲讲他们是什么东西。首先我们 看看下面的代码:

房卡麻将游戏算法修改课程一  第7张

这里初始化的函数,我们看到这里使用了上面没有注释两个变量对其中一个 变量赋值,然后用两个 IF 判断对不同的状态使用了不同的赋值语句。

房卡麻将游戏算法修改课程一  第8张

从这段代码我们可以知道上面的三个赋值语句赋值的变量是游戏桌子类中 的游戏类型。由此我们可以知道:

房卡麻将游戏算法修改课程一  第9张

这两个没有注释的变量,是游戏桌子中的游戏类型。那他们到底是什么类型, 我们还是不懂,所以我们继续分析:

房卡麻将游戏算法修改课程一  第10张

从上面的代码我们知道不同 IF 结果对赢了不同游戏桌子中的游戏类型,那 么关键其实就是这两个 IF 到底是什么了:

房卡麻将游戏算法修改课程一  第11张

现在我们知道了这两个 IF 判断的是自定义配置中的上庄信息;综合上面的 分析我们得到了一个结论,这两个没有注释的变量就是游戏桌子中根据上庄的用 户信息不同而定义了两个不同的游戏类型;如果大家了解过网狐的内核,就知道 有些游戏是可以上庄的,有的时候是电脑(包括机器人)上庄,有的时候是玩家 上庄。现在大家应该懂了吧。

通过上面的分析我们知道这两个变量其实对我们的麻将是没有用的,通过上 面的分析,我是想给大家提供一个分析代码思路以及方法。只要你有足够的耐心, 我们可以看到代码里的每一个地方,当然你要有一定的编程基础。

我们继续来看代码 2:

房卡麻将游戏算法修改课程一  第12张

上面的大部分大家应该都知道,就是游戏中的一些选项设置,包括智能自摸, 扎鸟等等。这里只讲一下这个剩余 4 张黄庄的问题,从名字上大家应该都知道什 么意思,就是说打的剩余 4 张的时候就黄庄了。我这里要讲一下他的实现:

房卡麻将游戏算法修改课程一  第13张

从这段代码我们可以看到如果我们启用了这功能,每次调用这个函数的时候 就会对剩余的牌数-4,这样就实现了剩余 4 张黄庄了。同样的道理我们可以-5,-6,-7 等等。

我们继续来看代码段 3

房卡麻将游戏算法修改课程一  第14张

上面这段代码我们主要讲一下出牌和小胡:因为我们这个课程主要是讲修改 算法,算法的修改最重要的就是出牌和胡牌。当然吃,碰后面也会讲到。

出牌命令:

这个两 个命令我们 都不需要解释,大家应该都知道他们 的意思, 不知道的后面就不用再看了!这里我们介绍一下他是怎么实现的:

房卡麻将游戏算法修改课程一  第15张

从上面的代码我们得知,用户发送了消息给服务器端,服务器端就会调用这 个函数然后用 switch 语句来实现了判断,如果用户发送的是用户出牌这个消息, 他就调用下面的一个函数来实现出牌的功能。至于他处理函数后面我们会仔细的 讲解这里就不讨论,大家现在只需要用户出牌这个变量是怎么使用的。

小胡:

小胡和上面的出牌命令其实是一样的我们来看一下代码:

房卡麻将游戏算法修改课程一  第16张

他们其实都在一个消息处理函数里面。

我们继续来看代码段 4

房卡麻将游戏算法修改课程一  第17张

上面的代码和我们修改算法关系不大,这里我们分析两个地方。

基础金币:

这个大家比较关心,以前有人问进入房间的金币在哪里修改,就 是这里了。我们来看看他是怎么赋值的:

房卡麻将游戏算法修改课程一  第18张

上面函数叫做发送场景,就是说讲游戏的场景信息发送给客户端,这里变量 定义哪里定义了我们基础金币的游戏状态变量,下面构造数据的时候给他赋值了。 当然这个赋值是用另一个变量赋值的,大家跟踪下去就能找到这个变量的值。

房卡麻将游戏算法修改课程一  第19张

从上面的代码我们可以看到给游戏基础金币赋值变量是在初始化的时候被 赋值的。

在代码段 4 中我们还要讲的一个地方就是:

房卡麻将游戏算法修改课程一  第20张

从上面两端代码我们可以看到这里没有注释的这个变量就是我们前面提到 的游戏人数了。这里提到他的意思是再次告诉大家,你修改了游戏人数,还很多 地方需要修改,至于这个问题我们会在另外的课程中讲解。

我们继续来看代码段 5:

房卡麻将游戏算法修改课程一  第21张

这段代码中和玩法有关的主要是发送卜克中的关于杠的两个地方:当前可以杠的牌集合和可以杠的数量:这两个地方我们合在一起讲,我们还是看代码吧:

房卡麻将游戏算法修改课程一  第22张

1611:

判断牌的数量是否大于 0,如果等于或小于 0 那么 else 里面吧可以杠 的集合设置成 0;

如果牌的数量大于 0,那么执行 IF 语句内的代码:1613:将牌的数量赋值给可以杠的数量;

1614:

用 FOR 语句做了一个循环,循环的最大值就是就牌的数量,也就是可以杠的数量;

1616:

将 GangCardResult.cbCardData 变量(卜克数据)对应数组变量的值付给可以杠的集合数组。
通过上面的代码我们可以知道什么牌可以杠其实和 cbCardData(卜克数据)相同的;

房卡麻将游戏算法修改课程一  第23张

上面的代码告诉我们 GangCardResult 的类型是杠牌结果类型。

房卡麻将游戏算法修改课程一  第24张

上面的代码告诉我们这个变量用发牌卜克赋值。我们只要查找发牌卜克这个 变量的引用就能找到他的赋值地方。至于怎么修改杠牌集合,后面我们还会讲到。

继续看代码段 6:

房卡麻将游戏算法修改课程一  第25张

这个代码段我们比较关心的地方有:

胡牌类型、起手胡牌类型、起手胡牌分数三个地方,我们这里再次说一下GAME_PLAYER 游戏人数,在这三个地方都用到了。我再说一次不要轻易修改游戏 人数的重要性。

胡牌类型和起手胡牌类型:

房卡麻将游戏算法修改课程一  第26张

我们看到这两个东西都是在这个 FOR 语句中分配的值,其中循环的判断是用 游戏人数来实现的,就是说有 4 个玩家我们就循环四次,3 个玩家就循环 3 次。 然后通过 m_ChiHuRight[i].GetRightData 函数来实现对胡牌类型和起手胡牌类型的实 现。这个实现我们以后再讲。

起手胡牌分数:

房卡麻将游戏算法修改课程一  第27张

在写入积分的时候完成对起手胡牌分数的写入。

代码段 7:

房卡麻将游戏算法修改课程一  第28张

在一段代码中我们只顺带说一句代码段中最后的用户托管,虽然我们这个课 程不会讲到,但是这个用户托管以后我们讲金币房间的时候要用到,这里带一句, 有兴趣的朋友可以自己先研究一下。其他的东西因为与我们要讲的玩法修改无关, 这里就不提了,以后的代码段我们也只会提到与本次课程主题有关的地方,其他 地方会在其他的课程中讲解,大家有兴趣的可以自己先研究一下。

代码段 8:

房卡麻将游戏算法修改课程一  第29张

上面的代码我们要说的是客户端命令结构,这里的命令解释服务器端接收到 客户端发送的命令格式,服务器端接收到这些命令后会做出相应的反应,我相信 这个原理大家应该都明白,我在这里要提出的是,之前有朋友说到长沙麻将的杠 牌不能杠上炮,我们从上面的代码可以看出长沙麻将的杠牌后打出的命令代码是9,之后怎么处理我们这里不谈论,我这里想说的是这里 如果要改成普通形式的 出牌就可以。这里主要是提供一个修改的思路,仅供大家思考。

代码段 9:

房卡麻将游戏算法修改课程一  第30张

这段代码是这个头文件中最后的一段了。这里我们只看看起手小胡。

起手小胡:

房卡麻将游戏算法修改课程一  第31张

这段代码是起手小胡的调用,它来源于游戏消息处理函数,从这段代码以及它的上下代码中我们可以知道通过消息验证,创建了一个起手小胡的变量,并在 后面的处理函数中吧这个变量用作参数传递给了处理函数。后面的课程我们会讲 这个处理函数。

到这里 CMD_HNMJ.h 头文件里的与玩法有关的内容我们就讲完了,后面我们 会一次对每一个头文件和源文件进行讲解。

相关课程:

1、房卡麻将游戏算法修改课程一;

2、房卡麻将游戏算法修改课程二

3、房卡麻将游戏算法修改课程三

4、房卡麻将游戏算法修改课程四

5、房卡麻将游戏逻辑玩法修改教程

文章目录
  • 服务器端源码介绍
    • 游戏状态:
    • 出牌命令:
    • 小胡:
    • 基础金币:
    • 胡牌类型和起手胡牌类型:
    • 起手胡牌分数:
    • 起手小胡:
  • 相关课程:
  • 发表评论