麻将,假如我放炮了,是不是要一个人和三个人称给三个人的钱,给胡牌的一方??

5048人阅读
java算法,麻将
最近一个棋牌游戏项目中涉及对麻将胡牌的判定,网上搜了搜虽然看到一些算法,但是感觉都不尽如人意,一般麻将的胡牌为1对和4组三张牌的连牌,所以在网上搜到的算法往往都死死的为了这个目的来实现,而且多数没有考虑到对百塔牌的支持,下面贴上代码:
这是对单张麻将牌进行的一个简单封装,比较简单硬性的将麻将对象设为两个主要属性,一个是类型,一个是类型编号,比如万,比如桶就属于不同的类型,而1万,3万这样的同属于万类型下的不同类型编号,同时给了一个&STANDARD_MAHJONG_NAMES 三维数组常量,用来封装不同格式的麻将名称,比如有些地方二桶就二饼,再比如中文,英文的区别等等,就不多说了,这个类主要提供的核心功能为isCanTwo(MahjongTile mahjongTile),isCanThree(MahjongTile mahjongTileOne,
MahjongTile mahjongTileTwo),isCanAny() 三个方法,顾名思义isCanTwo用来判断是否可以跟另外一张麻将牌结成对子,isCanThree 用来判断是否可以跟另外两张麻将结成趟,至于isCanAny()是用来判断该麻将是否具备百搭属性,我的代码中对于isCanAny() 的实现是随便写的,只是假设9万为百搭,至于为什么&type == 1 && typeId == 9 代表的是9万,自己看代码。
下面再贴两个无关紧要的异常类:
这两个类很简单,主要是当MahjongTile对象初始化的时候参数是否正确的判断,比如用十万初始化肯定要抛异常的.在这里就不多说了。
下面贴上核心工具类:
这个类是用来判断胡牌的核心类,它用来判断胡牌的方法为&public static MahjongTile[][] tryCombination(MahjongTile[] mahjongTiles, int twoNum, int threeNum) 这个,
我们看这个方法的内部其实是对另外一个同名方法的 调用,我们来看这个方法的参数,mahjongTiles 这个不用说是带进去判断的麻将对象的数组,twoNum和threeNum的意思分别是需要判断参数mahjongTiles中是否有且仅有twoNum个对子和threeNum个趟,那么一般胡牌判断的话,这两个参数自然一个是1,一个是4了,就是判断麻将是否是1对+4趟,那么为什么这里要这么写呢,主要为了方便扩展,比如很多地方有7小对可以胡牌的,再比如打牌过程中,碰了,杠了的牌,可以直接不去考虑,只要考虑出去碰,杠外还缺几对和几趟就可以胡牌,这样一来,这个方法就显得很灵活,不拘泥于1对+4趟,那么这个方法返回的是一个MahjongTile对象的二维数组是什么意思呢,意思就是当返回为空时,说明判断不成立,当返回的是实打实的数组的时候就说明一定满足你带进去的参数twoNum个对子和threeNum个趟,同时这个实打实的数组就是按照参数要求的组合,比如您带进去twoNum为1threeNum为4的话,那么如果能胡牌,返回的一定是一个第一维长度为5的二维数组,同时第一个元素的长度又为2,对应的是对子,下面的4个元素的长度为3对应的是4趟。
这个方法的核心思想就是递归,每一次执行就找出来一个对子,或者一组三张联牌,然后把还需要的组合递归下去,具体算法可以仔细看代码,本人写代码不太喜欢写太多注释,好在代码比较短,容易懂。
在该类的public static void main(String[] args)方法下有判断胡牌的实例代码。
原创文章,转载请注明原地址
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5101次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
请选择打赏金额:
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
, 可在设置中重新打开噢!
30秒后自动关闭
哥哥游戏:血流麻将你们是不是把我要胡的牌都拿走了">哥哥游戏:血流麻将你们是不是把我要胡的牌都拿走了
播放量数据:快去看看谁在和你一起看视频吧~
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
本奖品由提供
红包雨下完了,下次早点来噢~欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 28597 人关注过本帖
标题:麻将胡牌算法
等 级:贵宾
威 望:24
帖 子:1663
专家分:7259
结帖率:100%
&&已结贴√
&&问题点数:99&&回复次数:31&&&
麻将胡牌算法
对于此游戏的基本算法本人独自想了好久,用了一个很笨的方法,总算有了一个结果,但对此算法没有严谨的证明,只是感觉上好象是这么回事。基本思想是,(麻将最多手上14只,)在第15张位置加上一个将牌,那么再让这个数组不相同的三个数 组合 若是一句话,或是相同的三个数就让这三个数置0。如果胡牌的话,则此数组应该全部为0了。 这种方法不严谨 。如2 2 3 3 4 4 5 5 6 6 7 7 8 9这样的数7已先和前面的组合了,最后改变以除掉将的方式 见19楼。
希望有兴趣的朋友再帮我测试最后的程序,谢谢。程序代码:
#include&iostream&
using namespace
int main()
&&& cout&&&如果胡牌则显示,不胡牌则以下无输出&&&
&&& int i,j,k,x,temp,flat=<font color=#;
&&& int a[<font color=#]={<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#,<font color=#};// 牌已排序。
&&& for (x=<font color=#; x&<font color=#; x++)&&//在数组最后位置加一个数,便以下判断是否全部清0
&&&&&&&&if(a[x]==a[x+<font color=#])
&&&&&&&&& temp=a[x];&&&&&&&&&&&&
&&&&&&&&& a[<font color=#]=a[x];
&&&&&& else a[x]=
&&&&&&&&for(i=<font color=#; i&<font color=#; i++)&&&&&&&&&&&&&&&&&&&&&//找出连续或相同的三个数,并标记为0
&&&&&&&&&&&&for(j=<font color=#; j&<font color=#; j++)
&&&&&&&&&&&&&&& for(k=<font color=#; k&<font color=#; k++)&&&
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&if(i==j||j==k||i==k) continue;
&&&&&&&&&&&&&&&&&&&&if(a[i]+<font color=#==a[j] && a[j]+<font color=#==a[k]&& a[i]!=<font color=# || a[i]==a[j] && a[k]==a[j] )
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&a[i]=<font color=#; a[j]=<font color=#; a[k]=<font color=#;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& int&&& s=<font color=#;&&&
&&&&&&&&&&&&&&& for(i=<font color=#;i&<font color=#;i++)&&&
&&&&&&&&&&&&&&&&&&{&&s+=a[i];
cout&&a[i];}
cout&&s&&&s&&& &;
&&&&&&&&&&&&&&&/* if(s!=0) //若加的将不胡,则下次试其他将时还回原值。
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&& a[x]=
&&&&&&&&&&&&&&& a[x+1]=
&&&&&&&&&&&&&&& a[14]=
&&&&&&&&&&&&&&& }*/
&&&&&&&&&&&&&&&if(s==<font color=#)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&cout&&&恭喜您!已胡牌!&&&//如果数组里全部是0说明已胡牌,
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& //
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&
&&& getchar();
&&& return <font color=#;
[ 本帖最后由 qunxingw 于
19:48 编辑 ]
搜索更多相关主题的帖子:
来 自:神界
等 级:版主
威 望:360
帖 子:12274
专家分:48571
&&得分:20&
各地麻将规则都不一样
比如 缺少 “幺” 不能胡
&&&&&缺少&&”坎“ 不能胡
&&&&&断门&&不能胡
&&&&&等等 很多
DO IT YOURSELF !
等 级:贵宾
威 望:24
帖 子:1663
专家分:7259
那些暂不考虑,只是常规的,万(1--9)&&条用11--19。如此==
兴趣+信心+耐心
等 级:贵宾
威 望:24
帖 子:1663
专家分:7259
另加1个判断条件 将不为0
兴趣+信心+耐心
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3292
专家分:12819
没懂啥意思,15张?不是最多只能有14张或17张么?相公了吧
[fly]存在即是合理[/fly]
等 级:贵宾
威 望:24
帖 子:1663
专家分:7259
加的那张相当于验证码,仅用于判断。是虚的,如
此时7作将,我仍可加7使之组成3个7
兴趣+信心+耐心
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3292
专家分:12819
算法有漏洞,a[14]多次置 0了
int a[15]={1, 1,&&2, 3, 3, 4, 4, 5,&&6, 6, 8, 8, 9, 9};
[fly]存在即是合理[/fly]
等 级:贵宾
威 望:24
帖 子:1663
专家分:7259
a14是我专门设计的,相当于存放第15牌作验证码,目的是循环判断将牌,并把以前作将牌而又不胡的牌覆盖掉,不干扰后面。加1使牌数为3的倍数。置0并没有关系,相当于不胡牌,因不是3的倍数。
兴趣+信心+耐心
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3292
专家分:12819
版主木有试一下我给的数组么,想了很久的,笨来打算给出 7组将牌,但是这样也是一种胡法,所以给了 4组将牌,这样漏洞就很明显了
如上我举出的例子,明明没胡的
[fly]存在即是合理[/fly]
等 级:贵宾
威 望:24
帖 子:1663
专家分:7259
回复 9楼 azzbcc
原语句if(a[x]==a[x+1]),有误,数组出界了。谢谢,你再帮帮测试下。
兴趣+信心+耐心
版权所有,并保留所有权利。
Powered by , Processed in 0.058477 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved}

我要回帖

更多关于 麻将放炮 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信