麻将算法

麻将胡牌算法(不带赖子)(2天)

编码:(假设一副牌只有筒子 1表示1筒   2表示2筒。。。。 9表示9筒)

要求:

1)七对算法(判断14张牌是否是7对)

2)碰碰胡算法(判断14张牌是否是碰碰胡)

3)屁胡算法(判断14张牌是否是屁胡)

用户输入14张牌值,要求判断出这14张牌是否满足上述3种牌型(可能同时满足上述3种牌型)

解答:  单纯的模拟题 简单的搜索(0(2^log2(n)))

  1 #define Local
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<time.h>
  6
  7
  8 int arg [14]= {0};
  9
 10
 11 int cmp(const void * arg ,const  void *brg){
 12
 13   int * ar = (int *)arg;
 14   int * br = (int *)brg;
 15   return *ar - *br ;
 16 }
 17
 18 //初始化
 19 void init( int A[] ){
 20  int i;
 21  srand( time(NULL) );
 22  for(i=0 ; i<14 ; i++)
 23     i[arg] = rand();
 24 }
 25
 26 //七对胡牌
 27 bool  AlgSevenHu(int tmp[]){
 28      int i;
 29     for(i=1 ; i<10 ;i++)
 30       if(tmp[i]&1) return false ;     //不是七对
 31       return true;
 32 }
 33
 34 //碰碰胡
 35 bool  AlgPengpHu(int tmp[]){
 36
 37    int i=0 , cnt=0;
 38    //判断门将
 39     for( i=1 ; i<10 ; i++ ){
 40
 41         if(tmp[i]==0||tmp[i]==3);
 42         else  if(tmp[i]==2)  cnt++;
 43         else return false ;
 44     }
 45       if(cnt==1)
 46          return true;
 47    return true;
 48 }
 49
 50 //平胡
 51 bool AlgPinghHu(int tmp [] , int len){
 52
 53   //qsort(A , 14 ,sizeof(A[0]) , cmp);   //升序
 54   //return dfs(A, 14);
 55    bool tag = false;
 56    int i;
 57      for(i=1 ; i<10 ; i++){
 58
 59            if(tmp[i]>2){
 60               tmp[i]-=3;     //AAA组合
 61               len-=3;
 62              tag = AlgPinghHu(tmp , len);
 63               tmp[i]+=3;
 64               len+=3;
 65               if(tag) return true;
 66               //或者这样的组合
 67               if(tmp[i+1]>0&&tmp[i+2]>0){
 68                        tmp[i]--;
 69                        tmp[i+1]--;
 70                        tmp[i+2]--;
 71                        len-=3;
 72                 tag =  AlgPinghHu(tmp , len);
 73                        tmp[i]++;
 74                        tmp[i+1]++;
 75                        tmp[i+2]++;
 76                        len+=3;
 77                 if(tag) return true;
 78                 }
 79           }
 80          if(tmp[i]>0){
 81                 //ABC组合
 82                 if(len>2&&tmp[i+1]>0&&tmp[i+2]>0){
 83                        tmp[i]--;
 84                        tmp[i+1]--;
 85                        tmp[i+2]--;
 86                        len-=3;
 87                     tag= AlgPinghHu(tmp , len);
 88                        tmp[i]++;
 89                        tmp[i+1]++;
 90                        tmp[i+2]++;
 91                        len+=3;
 92                   if(tag) return true;
 93                 }
 94
 95           if(len==2){
 96              if(tmp[i]==2)
 97                 return true ;
 98               return false;
 99              }
100           }
101    }
102    return false ;
103 }
104
105 void print(int A[]){
106    int i=0;
107     for(i=0 ; i<13 ;i++ )
108         printf("%d ",A[i]);
109     printf("%d\n",A[13]);
110 }
111 int main(int argv  , char * args [] ){
112
113   char hopg[2];
114  //init(arg);
115    bool pi=0 ,pe=0 ,qi=0;
116    int i=0,tmp[10]={0};
117 #ifdef Local
118   freopen("data.in","r",stdin);
119 #endif // Local
120
121  while(1){
122
123    printf("输入14张牌号:\n");
124    for( i=0;i<14 ;i++)
125       scanf("%d",arg+i);
126       print(arg);
127     memset(tmp , 0, sizeof(tmp));
128
129    for( i=0;i<14;i++)  tmp[arg[i]]++;
130       pi =AlgPinghHu(tmp ,14);
131       pe =AlgPengpHu(tmp);
132       qi = AlgSevenHu(tmp);
133
134     if(pi)
135       printf("祝贺 ,屁胡!\n");
136     if(pe)
137          printf("祝贺 , 碰碰胡!\n");
138     if(qi)
139         printf("祝贺,七对胡\n");
140     if(!pi&&!pe&&!qi)
141         printf("未能胡牌!\n");
142
143      puts("继续游戏 y/n ?");
144      scanf("%s",hopg);
145
146     if(hopg[0]==‘n‘||hopg[0]==‘N‘)
147         break;
148  }
149   return 0;
150 }

时间: 2024-11-09 03:15:49

麻将算法的相关文章

自己写的带混牌麻将算法

// MJdaihun.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include <iostream>#include <windows.h> int iAllPai[4][10] = { {6,3,0,1,1,1,0,0,0,0}, {3,3,0,0,0,0,0,0,0,0}, {3,0,0,0,1,0,1,1,0,0}, {3,0,1,1,1,0,0,0,0,0}};int iImagicPai[2] = { 0

麻将胡牌,听牌算法

算法分析参照下面的blog麻将胡牌算法 我用lua写了一个简化的麻将算法,只考虑麻将字牌和万 牌编号1~9对应1-9万,10-16是字牌 下面是lua代码 local print = print local tconcat = table.concat local tinsert = table.insert local srep = string.rep local type = type local pairs = pairs local tostring = tostring local

癞子麻将胡牌算法实现

最先实现的就是算法的实现. 需求:碰杠胡  ,不能吃 ,不能听 ,仅仅能自摸胡,当中癞子能够做随意牌可是不能碰和杠. 写的时候还不会玩麻将,还是老板教的.^_^ 最麻烦的是胡牌算法.之前搜到的都是不包括癞子正常的胡牌,用的是%3余2,当中余数2就是余的将的意思. 可是有癞子就不能这么用了.仅仅好自己写一个了. 一个有136张牌,万,饼,条,东西南北中发白34种牌. 有四个癞子是直接就胡牌的,最坏的情况是有3个癞子,可是假设遍历一遍不用逻辑推断就有34X34X34接近4万次. 想一下假设能胡牌,最

麻将胡牌算法研究

麻将通常有13张牌,在打的时候随着吃,碰越来越少.总数应该维持在3*n + 1,n=0~4,比如1张,4张,7张或10张.胡牌时,加一张(可能是自摸或吃碰来的一张)组成n个顺子或暗刻,外加一个麻将对. 这里要研究的要点是: 1. 给出3n + 2张牌如何判断是否已经胡牌,所有的胡牌可能组合: 2. 如果给出3n+1张牌如何判断是否已经挺牌,挺哪些牌. 这两个问题其实主要是第一个问题,也就是如何判断3n +2 张牌是否胡牌的问题.后者可以简单地通过实验加34种麻将牌之一看是否胡牌来判断是否挺牌,以

房卡麻将分析系列之&quot;发牌器&quot;算法设计

大家好,经过一段时间的努力,在填平了大部分源码框架中的坑后,我们的"大赢家"红中麻将总算完成了1.0版本,虽然仍然有诸多问题,但总归算是有一个好的开始,希望后续诸事顺利,能够早日跑出流水,也欢迎各位合作商积极与我联系. 回顾开发过程,我深深的体会到,一个有多年摸牌经验的服务器主程是有多么重要!记得年前帮一家公司做房卡麻将项目,对方从上到下,基本没人会玩麻将,诸事都需要请教麻友,这样的情况我觉得上线的产品应该也不太会好吧,没爱的设计~!不过我可是8岁就上牌桌,八十年代家里就有了一幅竹制麻

源码架设教程之麻将AI算法与数据结构棋牌

麻将ID构架 用一维数组PAICAPTION(143)来记录每张牌的ID和文字信息,数组内容为文字描述,下标用作ID(0-143,共144张牌) 1.胡牌判断基本构架 用一维数组来记录各个牌型的数量,例如 int PAI[38] = { 0, 1,1,1,0,1,1,1,0,0,    // PAI[ 1- 9]  壹万-玖万的个数 0, 0,0,0,0,0,3,0,0,0,    // PAI[11-19]  壹铜-玖铜的个数 0, 0,0,0,0,0,0,0,0,0,    // PAI[2

成都麻将胡牌问题算法

题设: * 成都麻将只能包括3种类型:筒(D),万(W),条(T).没有“门.东南西北.红中”. * 每种牌都是数字从1到9,每个数字有4张,共36张.筒(D),万(W),条(T)均一样. *  * 胡牌规则如下:  * 1.手里面的牌最多只有两种类型,即必须打缺一种,不能出现:条,筒,万都存在的情况. * 2.必须有一个对子,即两张相同的牌,比如:两个2筒,两个4条等.  * 3.剩余的牌,每3张需要凑成一个有效牌,比如:3个一样的牌(3个2筒), * 或者3个顺子(1条2条3条),如果所有的

(算法)成都麻将

题目: 说起麻将,那可是川渝市民的最爱,无论亲朋好友聚会,还是业务谈判,总是少不了麻将的声音.成都麻将只能包括3种类型:条,筒,万.没有“门.东南西北.红中”.每种牌都是数字从1到9,每个数字有4张,共36张.筒,万,条均一样.胡牌简化规则如下: 1.必须有一个对子,即两张相同的牌,比如:两个2筒,两个4条等.2.剩余的牌,每3张需要凑成一个有效牌,比如:3个一样的牌(3个2筒),或者3个顺子(1条2条3条),如果所有的牌都能够凑好,再满足规则2和1,有一个对子,并且所有的牌只有两种类型,那么就

麻将回溯算法(无癞子)

1 #include <stdio.h> 2 #include <iostream> 3 #include <sstream> 4 #include <cstring> 5 #include <vector> 6 7 using namespace std; 8 typedef unsigned char byte; 9 #define Arrlen(arr) sizeof(arr)/sizeof(arr[0]) 10 11 byte arr[1