标题:麻将胡牌算法
只看楼主
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
结帖率: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 std;
int main()
{
    cout<<"如果胡牌则显示,不胡牌则以下无输出"<<endl;
   
    int i,j,k,x,temp,flat=0;
    int a[15]={1,1,1,2,2,2,4,5,6,8,8,8,9,9};// 牌已排序。
   
   
    for (x=0; x<14; x++)  //在数组最后位置加一个数,便以下判断是否全部清0
    {
        if(a[x]==a[x+1])
        {
          temp=a[x];             
          a[14]=a[x];
        }
       else a[x]=temp;
       
        for(i=0; i<15; i++)                     //找出连续或相同的三个数,并标记为0
            for(j=0; j<15; j++)
                for(k=0; k<15; k++)   
                {
                    if(i==j||j==k||i==k) continue;
                    if(a[i]+1==a[j] && a[j]+1==a[k]&& a[i]!=0 || a[i]==a[j] && a[k]==a[j] )
                    {
                        a[i]=0; a[j]=0; a[k]=0;
                    }
                }               
                int    s=0;   
                for(i=0;i<15;i++)   
                  {  s+=a[i]; 

cout<<a[i];}
cout<<endl;
cout<<s<<"s    ";
               /* if(s!=0) //若加的将不胡,则下次试其他将时还回原值。
               {
                a[x]=temp;
                a[x+1]=temp;
                a[14]=flat;
                }*/
               if(s==0)
                {
                    cout<<"恭喜您!已胡牌!"<<endl;//如果数组里全部是0说明已胡牌,
                   
                   // break;
                }
               
    }
    getchar();
    return 0;
}



[ 本帖最后由 qunxingw 于 2013-1-16 19:48 编辑 ]
搜索更多相关主题的帖子: 麻将 
2013-01-14 22:34
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:20 
各地麻将规则都不一样

比如 缺少 “幺” 不能胡
     缺少  ”坎“ 不能胡
     断门  不能胡
     等等 很多

DO IT YOURSELF !
2013-01-14 22:41
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
得分:0 
那些暂不考虑,只是常规的,万(1--9)  条用11--19。如此==

www.qunxingw.wang
2013-01-14 22:45
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
得分:0 
另加1个判断条件 将不为0

www.qunxingw.wang
2013-01-15 08:08
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
没懂啥意思,15张?不是最多只能有14张或17张么?相公了吧


[fly]存在即是合理[/fly]
2013-01-15 09:03
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
得分:0 
加的那张相当于验证码,仅用于判断。是虚的,如
77778899 此时7作将,我仍可加7使之组成3个7

www.qunxingw.wang
2013-01-15 09:43
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
算法有漏洞,a[14]多次置 0了

int a[15]={1, 1,  2, 3, 3, 4, 4, 5,  6, 6, 8, 8, 9, 9};


[fly]存在即是合理[/fly]
2013-01-15 09:56
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
得分:0 
a14是我专门设计的,相当于存放第15牌作验证码,目的是循环判断将牌,并把以前作将牌而又不胡的牌覆盖掉,不干扰后面。加1使牌数为3的倍数。置0并没有关系,相当于不胡牌,因不是3的倍数。

www.qunxingw.wang
2013-01-15 10:19
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
版主木有试一下我给的数组么,想了很久的,笨来打算给出 7组将牌,但是这样也是一种胡法,所以给了 4组将牌,这样漏洞就很明显了

如上我举出的例子,明明没胡的



[fly]存在即是合理[/fly]
2013-01-15 10:26
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
得分:0 
回复 9楼 azzbcc
原语句if(a[x]==a[x+1]),有误,数组出界了。谢谢,你再帮帮测试下。

www.qunxingw.wang
2013-01-15 11:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-396597-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024544 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved