#include"a.h"

int main()
{

int pai[14] = { 0, };
    int i = 0;
    int sum = 0;    //总的分这里默认为三家
    int num = 0;    //应该所得到得分数
    printf("请选择底金:");
    scanf("%d",&DiJ);
    printf("本局底金为:%d\n", DiJ);

/*************************************在此判断牌得张数*************************************/
    printf("------温馨提示:数字0,10,20,30为系统预留空间------\n");
    for (i = 0; i < 14; i++)
    {
        //依次输入手牌
        printf("please you majon ipt:");
        scanf("%d", &pai[i]);
        printf("rand = %d\n", pai[i]);

if ((pai[i] == 0) || (pai[i] == 10) || (pai[i] == 20) || (pai[i] == 30) || (pai[i] > 37))    //在判断牌型时 根据宏定义的数据来进行判断 方便来做判断
        {
            printf("input majon_type is error....quit\n");
            return 0;
        }
    }
    mysort(pai, 14);

for (i = 0; i < 14; i++)    //循环遍历输入的牌型 判断牌型是否成立若输入的手牌牌型大于4 则超出了麻将的牌数故直接退出
    {

printf("%3d", pai[i]);
        aPAI[pai[i]]++;
        if (aPAI[pai[i]] > 4)
        {
            printf("\n");
            printf("you input pai %d greater than 4.....so...bai\n", pai[i]);
            return 0;

}

}
    //Remain(pai);

/*
    if (h258jiang(pai))
    {
        printf("\n");
        printf("win................258");
        system("pause");
        return 0;
    }
    else
    {
        printf("\n");
        printf("No Win\n");
        system("pause");
    }
    */
    //豪华七对
    if (HHQD(pai))
    {
        printf("\n");
        printf("HHQD......\n");
        //胡牌算分
        Sleep(1000);
        num = DiJ * 15;
        sum = num * 3;
        printf("应得分:%d\n", num);
        Sleep(1000);
        printf("总得分:%d\n", sum);
        system("pause");
        return 0;
    }
    //七对
    if (QiDui(pai))
    {

printf("\n");
        printf("QiDui...\n");
        //胡牌算分
        num = DiJ * 8;
        sum = num * 3;
        printf("应得分:%d\n", num);
        Sleep(1000);
        printf("总得分:%d\n", sum);
        system("pause");
        return 0;

}
    //碰碰胡
    if (PPHU(pai))
    {
        printf("\n");
        printf("PPHU......\n");
        //胡牌算分
        num = DiJ * 12;
        sum = num * 3;
        printf("应得分:%d\n", num);
        Sleep(1000);
        printf("总得分:%d\n", sum);
        system("pause");
        return 0;
    }
    
    if (shisanyao(pai))
    {
        printf("\n");
        printf("十三幺\n");
        //胡牌算分
        num = DiJ * 13;
        sum = num * 3;
        printf("应得分:%d\n", num);
        Sleep(1000);
        printf("总得分:%d\n", sum);
        system("pause");
        return 0;
    }

//平胡
    
    if (Hu(pai))
    {
        printf("\n");
        printf("Win 2333\n");
        //胡牌算分
        num = DiJ * 2;
        sum = num * 3;
        printf("应得分:%d\n", num);
        Sleep(1000);
        printf("总得分:%d\n", sum);
        system("pause");
        return 0;
    }
    else
    {
        printf("\n");
        printf("No Win\n");
        system("pause");
    }
    return 0;
}
//判断七对
int QiDui(int QiDui_Jiag[14])
{
    int i = 0;
    memset(aPAI, 0, sizeof(aPAI));
    for (i = 0; i < 14; i++)
    {
        //循环遍历手牌,将牌型各自+1
        aPAI[QiDui_Jiag[i]]++;
        printf("qidui[%d] = %d ---%d\n", i, QiDui_Jiag[i], aPAI[QiDui_Jiag[i]]);

//判断牌型是否为将
        if (aPAI[QiDui_Jiag[i]] == 2)
        {
            aPAI[QiDui_Jiag[i]] -= 2;
            QiDui_Jiang++;

}
        //判断牌型是否为4个 如为四个一样的牌型则QiDui_JIang+2;
        if (aPAI[QiDui_Jiag[i]] == 4 && aPAI[QiDui_Jiag[i]] > 3)    QiDui_Jiang += 2;

}
    printf("QiDui_Jiang =%d\n", QiDui_Jiang);
    if (QiDui_Jiang == 7)    return 1;
    return 0;
}

int   Hu(int   PAI[14])
{    
    static   int   JIANG = 0;                                    //   将牌标志,即牌型“三三三三二”中的“二”    
    int i;      
    if (!Remain(PAI))   return   1;                                //   递归退出条件:如果没有剩牌,则和牌返回。

for (i = 0; !aPAI[PAI[i]] && i<14; i++);                    //   找到有牌的地方,i就是当前牌,   aPAI[PAI[i]]是个数

printf("i   =   %d\n", i);                                    //   跟踪信息    
    
                                                                //   4张组合(杠子)    
    if (aPAI[PAI[i]] == 4)                                        //   如果当前牌数等于4张    
    {
        aPAI[PAI[i] ] = 0;                                         //  除开全部4张牌    
        if (Hu(PAI))   return   1;                                //   如果剩余的牌组合成功,和牌    
        aPAI[PAI[i]] = 4;                                        //   否则,取消4张组合    
    }

//   3张组合(大对)    
    if (aPAI[PAI[i]] >= 3)                                        //   如果当前牌不少于3张    
    {
        aPAI[PAI[i]] -= 3;                                      //   减去3张牌    
        if (Hu(PAI))   return   1;                              //   如果剩余的牌组合成功,和牌    
        aPAI[PAI[i]] += 3;                                   //   取消3张组合    
    }

//   2张组合(将牌)    
    if (!JIANG   &&   aPAI[PAI[i]] >= 2)                    //   如果之前没有将牌,且当前牌不少于2张    
    {
        JIANG = 1;                                             //   设置将牌标志    
        aPAI[PAI[i]] -= 2;                                   //   减去2张牌    
        if (Hu(PAI))   return   1;                             //   如果剩余的牌组合成功,和牌    
        aPAI[PAI[i]] += 2;                                   //   取消2张组合    
        JIANG = 0;                                            //   清除将牌标志    
    }

if (PAI[i]   >   JIUTONG_MAJIANG)         return   0;                  //   “东南西北中发白”没有顺牌组合,不和

//   顺牌组合,注意是从前往后组合!    
    if (PAI[i] % 10 != 8 && PAI[i] % 10 != 9 &&                                 //   排除数值为8和9的牌    
        aPAI[PAI[i+1]] && aPAI[PAI[i+2]])                                      //   如果后面有连续两张牌    
    {
        aPAI[PAI[i]]--;
        PAI[PAI[i+ 1] ]--;
        aPAI[PAI[i+ 2] ]--;                                                        //   各牌数减1    
        if (Hu(PAI))   return   1;                                                //   如果剩余的牌组合成功,和牌    
        PAI[i]++;
        PAI[PAI[i+ 1] ]++;
        aPAI[PAI[i+ 2] ]++;                                                         //   恢复各牌数    
    }

//   无法全部组合,不和!    
    return   0;
}

//   检查剩余牌数    
int   Remain(int   PAI[14])
{
    int   sum = 0;
    
    for (int i = 0; i<14; i++)
        sum += aPAI[PAI[i]];
    return   sum;
}
/*
int   Hu(int   PAI[38])
{
    static   int   JIANG = 0;                         //   将牌标志,即牌型“三三三三二”中的“二”    
    int i = 0;
    if (!Remain(PAI))   return   1;           //   递归退出条件:如果没有剩牌,则和牌返回。

for ( i = 1; !PAI[i] && i<38; i++);     //   找到有牌的地方,i就是当前牌,   PAI[i]是个数    
    printf("i   =   %d\n", i);                         //   跟踪信息                                                      //   4张组合(杠子)    
    if (PAI[i] == 4)                               //   如果当前牌数等于4张    
    {
        PAI[i] = 0;                                     //   除开全部4张牌    
        if (Hu(PAI))   return   1;             //   如果剩余的牌组合成功,和牌    
        PAI[i] = 4;                                     //   否则,取消4张组合    
    }

//   3张组合(大对)    
    if (PAI[i] >= 3)                               //   如果当前牌不少于3张    
    {
        PAI[i] -= 3;                                   //   减去3张牌    
        if (Hu(PAI))   return   1;             //   如果剩余的牌组合成功,和牌    
        PAI[i] += 3;                                   //   取消3张组合    
    }

//   2张组合(将牌)    
    if (!JIANG   &&   PAI[i] >= 2)           //   如果之前没有将牌,且当前牌不少于2张    
    {
        JIANG = 1;                                       //   设置将牌标志    
        PAI[i] -= 2;                                   //   减去2张牌    
        if (Hu(PAI))   return   1;             //   如果剩余的牌组合成功,和牌    
        PAI[i] += 2;                                   //   取消2张组合    
        JIANG = 0;                                       //   清除将牌标志    
    }

if (i   >   30)         return   0;               //   “东南西北中发白”没有顺牌组合,不和

//   顺牌组合,注意是从前往后组合!    
    if (i % 10 != 8 && i % 10 != 9 &&       //   排除数值为8和9的牌    
        PAI[i + 1] && PAI[i + 2])             //   如果后面有连续两张牌    
    {
        PAI[i]--;
        PAI[i + 1]--;
        PAI[i + 2]--;                                     //   各牌数减1    
        if (Hu(PAI))   return   1;             //   如果剩余的牌组合成功,和牌    
        PAI[i]++;
        PAI[i + 1]++;
        PAI[i + 2]++;                                     //   恢复各牌数    
    }

//   无法全部组合,不和!    
    return   0;
}

//   检查剩余牌数    
int   Remain(int   PAI[38])
{
    int   sum = 0;
    for (int i = 1; i<38; i++)
        sum += PAI[i];
    return   sum;
}
*/
//豪华七对
int HHQD(int HHQD[14])
{
    int i = 0;
    int HH_QD = 0;
    int jiang = 0;
    //由于aPAI[38]为全局变量,则每次都需要把该数组内所有数据初始化为0;
    memset(aPAI, 0, sizeof(aPAI));
    for (i = 0; i < 14; i++)
    {    //循环遍历手牌,将牌型各自+1;
        aPAI[HHQD[i]]++;
        //当该牌型为4 则+1
        if (aPAI[HHQD[i]] == 4)
        {
            HH_QD++;
        }
        //判断该牌型是否有将
        if (!jiang && aPAI[HHQD[i]] == 2)
        {
            jiang++;
        }
    }
    if (HH_QD == 3 && jiang == 1)    return 1;
    return 0;
}

//PPH
int PPHU(int PPH[14])
{
    int i = 0;
    int PP_H = 0;
    int jiang = 0;
    //由于aPAI[38]为全局变量,则每次都需要把该数组内所有数据初始化为0;
    memset(aPAI, 0, sizeof(aPAI));
    for (i = 0; i<14; i++)
    {
        //循环遍历手牌,将牌型各自+1
        aPAI[PPH[i]]++;
        //当该牌型为2 则+1
        if (aPAI[PPH[i]] == 3)
        {
            aPAI[PPH[i]] -= 3;
            PP_H++;
        }
        //判断该牌型是否有将
        if (!jiang && aPAI[PPH[i]] == 2)
        {
            jiang++;
        }
    }
    //在这里判断该手牌是否有十四张牌....r如果没有则直接退出

printf("PPH = %d,jiang = %d\n", PP_H, jiang);
    if (PP_H == 4 && jiang == 1)    return 1;

return 0;
}

//十三幺
int shisanyao(int shisan[14])
{
    int i = 0;
    int majon = 0;
    int jiang = 0;
    memset(aPAI,0,sizeof(aPAI));
    
    for (i = 0; i < 14; i++)
    {
        aPAI[shisan[i]]++;
        //用条件语句来限制牌型
        if ((shisan[i] == YITIAO_MAJIANG) || (shisan[i] == JIUTIAO_MAJIANG) || (shisan[i] == YIWAN_MAJIANG) || \
            (shisan[i] == JIUWAN_MAJIANG)||(shisan[i] == YITONG_MAJIANG) || (shisan[i] == JIUTONG_MAJIANG) || (shisan[i]) > JIUTONG_MAJIANG)
        {        
            if (aPAI[shisan[i]] == 1)
            {
                
                continue;
            }
        }
        else if (aPAI[shisan[i]] == 2)
        {
            jiang++;    
        }
        else
        {
            return 0;
        }
        //在这里判断该手牌是否有十四张牌....r如果没有则直接退出
        if (jiang != 1)    return 0;
        printf("%d", jiang);
    }
    return 1;
}

//将258将牌单独用一个函数来存放
int isJiangPai(int pai)
{

//将258将牌单独用一个函数来存放 如果该牌型里是否有258将
    if (pai == ERTIAO_MAJIANG) return 1;
    if (pai == WUTIAO_MAJIANG) return 1;
    if (pai == BATIAO_MAJIANG) return 1;

if (pai == ERTONG_MAJIANG) return 1;
    if (pai == WUTONG_MAJIANG) return 1;
    if (pai == BATONG_MAJIANG) return 1;

if (pai == ERWAN_MAJIANG) return 1;
    if (pai == WUWAN_MAJIANG) return 1;
    if (pai == BAWAN_MAJIANG) return 1;

return 0;
}
//对输入的手牌进行排序(顺序)
void mysort(int * aa, int l)
{
    int tmp;
    int i = 0;
    int j = 0;
    for (i = 0; i<l; i++)
    {
        for (j = i + 1; j<l; j++)
        {
            if (aa[i] > aa[j])
            {
                tmp = aa[j];
                aa[j] = aa[i];
                aa[i] = tmp;
            }
        }
    }

}

int PAI_Type(int PAI[38])    //PAI[38]1-9表示tiao 11-19表示万.........
{
    int begin = YITIAO_MAJIANG;
    int end = BAIBAN_MAJIANG;    //表示麻将最后一张
    int len = 0;    //表示麻将的长度
    int i = 0;
    int i_pai[38];
    memset(i_pai,0,sizeof(i_pai));
    memcpy(i_pai,PAI,sizeof(int)* 38);

//遍历牌型
    for (i = YITIAO_MAJIANG; i < 38; i++)    
    {
        while (i > JIUTONG_MAJIANG)
        {
            if (PAI[i] < 2)    return 0;                    //由于在有风的情况下如果不为刻字和将则不能胡牌直接返回0;
            continue;
        }
        if (PAI[i] == 2)
        {
            PAI[i] -= 2;
        }
        
        //if (PAI[DONGFENG_MAJIANG] < 2)    return 0;    //由于在有风的情况下如果不为刻字和将则不能胡牌直接返回0;

}
}

///

............h文件

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

#define YITIAO_MAJIANG      1                                     
#define ERTIAO_MAJIANG      2                                        
#define SANTIAO_MAJIANG     3                                          
#define SITIAO_MAJIANG      4                                          
#define WUTIAO_MAJIANG      5                                          
#define LIUTIAO_MAJIANG     6                                         
#define QITIAO_MAJIANG      7                                          
#define BATIAO_MAJIANG      8                                         
#define JIUTIAO_MAJIANG     9

#define YIWAN_MAJIANG       11                                    
#define ERWAN_MAJIANG       12                                       
#define SANWAN_MAJIANG      13                                          
#define SIWAN_MAJIANG       14                                         
#define WUWAN_MAJIANG       15                                        
#define LIUWAN_MAJIANG      16                                          
#define QIWAN_MAJIANG       17                                          
#define BAWAN_MAJIANG       18                                          
#define JIUWAN_MAJIANG      19

#define YITONG_MAJIANG      21                                         
#define ERTONG_MAJIANG      22                                         
#define SANTONG_MAJIANG     23                                         
#define SITONG_MAJIANG      24                                          
#define WUTONG_MAJIANG      25                                          
#define LIUTONG_MAJIANG     26                                          
#define QITONG_MAJIANG      27                                          
#define BATONG_MAJIANG      28                                          
#define JIUTONG_MAJIANG     29

#define DONGFENG_MAJIANG    31                                           
#define NANFENG_MAJIANG     32                                           
#define XIFENG_MAJIANG      33                                          
#define BEIFENG_MAJIANG     34                                           
#define HONGZHONG_MAJIANG   35                                           
#define FACAI_MAJIANG       36                                           
#define BAIBAN_MAJIANG      37

#define NOTYPE_MAJIANG            0    //    牌型不成立
#define HAVETYPE_MAJIANG        1    //  牌型成立
#define NULL_MAJIANG            10    //    空麻将
#define AA_MAJIANG              2   //    判断将(不一定是2,5,8将)  
#define AAA_MAJIANG             3   //    判断三刻                                                             
#define ABC_MAJIANG             1   //    判断三顺                                                             
#define MAX_HAND_CARD_MAJIANG   14  //    手上的牌,最多时候的张数

//int Hu(int PAI[38]);
//int h258jiang(int PAI[14]);                        //判断胡牌
int PPHU(int PPH[14]);                        //判断碰碰胡
int Remain(int PAI[14]);                    //判断手牌剩余的牌
int QiDui(int QiDui_PAI[14]);                //判断七对
int Hu(int PAI[14]);
int HHQD(int HHQD[14]);                        //判断豪华七对
int shisanyao(int shisan[14]);
void mysort(int *aa, int l);                //将输入的手牌进行排序
int isJiangPai(int pai);                    //存放将牌
int aPAI[38];                                //保存牌型的数组
int DiJ = 0;                                //底金
int QiDui_Jiang = 0;                        //判断七对将 是否是七对

C 语言mj普通简单算法相关推荐

  1. 简单算法的举例c语言,计算机科学与技术系C语言程序设计22简单算法举例.PPT

    计算机科学与技术系C语言程序设计22简单算法举例 第2章 程序的灵魂--算法 本章主要介绍算法的思想及算法的表示方法. 2.0 绪论 2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2. ...

  2. c语言有啥简单的小程序,c语言-简单小程序-简单算法

    <c语言-简单小程序-简单算法>由会员分享,可在线阅读,更多相关<c语言-简单小程序-简单算法(19页珍藏版)>请在人人文库网上搜索. 1.以下小程序都在 TC2.0 中运行通 ...

  3. 用C语言实现一个简单的一元线性回归算法

    今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...

  4. C语言简单算法之高速公路超速处罚,计算油费,比较大小,两个数的简单计算器

    C语言简单算法之高速公路超速处罚,计算油费,比较大小,两个数的简单计算器 [1] 1.题目7-1高速公路超速处罚 1.实验代码 #include <stdio.h>int main() { ...

  5. C语言简单算法之求交错序列前N项和,统计学生平均成绩与及格人数,求1到100的和,求奇数分之一序列前N项和,找出最小值,求n!,统计字符,最佳情侣身高差

    C语言简单算法之求交错序列前N项和,统计学生平均成绩与及格人数,求1到100的和,求奇数分之一序列前N项和,找出最小值,求n!,统计字符,最佳情侣身高差 [1] 1.题目三 求交错序列前N项和 1.实 ...

  6. C语言简单算法之计算分段函数,A除以B,阶梯电价,出租车计价

    C语言简单算法之计算分段函数,A除以B,阶梯电价,出租车计价 1.题目一计算分段函数[1] 1.实验代码 #include<stdio.h> int main() {float x,y;s ...

  7. C语言简单算法之A乘以B,求整数平均值,是不是胖了,输出各位数字

    C语言简单算法之A乘以B,求整数平均值,是不胖了,输出各位数字 1.题目一:A乘以B 1.实验代码 include<stdio.h> int main() {int A,B;scanf(& ...

  8. 【简单算法】回文数(C语言)

    概述 注水博客,期末emo加摆烂,想做做简单算法抚慰心灵: 题目描述 9.回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右) ...

  9. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...

    语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...

最新文章

  1. jieba分词流程及部分源码解读(一)
  2. 项目进度,你汇报清楚了么?
  3. datetime 索引_date类型和varchar类型在查询索引效率上比较
  4. Linux下更好用的帮助命令—cheat
  5. 图解Redis之数据结构篇——压缩列表
  6. c++语言标准 pdf,C++14标准.pdf
  7. 【2050 Programming Competition - 2050 一万人码 】非官方部分题解(HDU)
  8. Java笔记-JdbcTemplate批量执行insert及update
  9. DIV默认高度且自适应高度
  10. JS调试的时候遇到无限debugger怎么办?
  11. 理解 Java 的 GC 与 幽灵引用
  12. 为全面到来的数字化未来准备就绪 戴尔科技峰会赋能企业数字化发展新动力
  13. Matlab简单教程:函数
  14. Python二级题库答案纠正
  15. 在.net中使用sqlite
  16. 数据库mysql报2005错_sql2005还原数据库错误的问题解决方法
  17. 灰色预测模型python实例_12-6:数学模型(灰色模型)与Python编程预测
  18. 唯物主义观点有哪些_唯物主义的观点及方法论有哪些?
  19. 《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用
  20. 下一代Web服务的基础框架——F2F俱乐部SOA系列活动

热门文章

  1. python 发布文章,使用Python自动化发布文章:(一)
  2. 何恺明新作来了!更快更有效的训练FLIP
  3. 在网页中内嵌视频,例如优酷
  4. 亚马逊FBA箱子贴标有哪些要求
  5. 从数字城市迈向智能城市
  6. 常见光纤连接头 ST、SC、FC、LC
  7. 腾讯T-Star高校挑战赛
  8. 中资美元债这么膨胀,个人投资者怎么买?
  9. Xrm.Page.data.entity Properties and Methods
  10. 【算法导论-主定理】用主方法求解递归式 学练结合版