C 语言mj普通简单算法
#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普通简单算法相关推荐
- 简单算法的举例c语言,计算机科学与技术系C语言程序设计22简单算法举例.PPT
计算机科学与技术系C语言程序设计22简单算法举例 第2章 程序的灵魂--算法 本章主要介绍算法的思想及算法的表示方法. 2.0 绪论 2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2. ...
- c语言有啥简单的小程序,c语言-简单小程序-简单算法
<c语言-简单小程序-简单算法>由会员分享,可在线阅读,更多相关<c语言-简单小程序-简单算法(19页珍藏版)>请在人人文库网上搜索. 1.以下小程序都在 TC2.0 中运行通 ...
- 用C语言实现一个简单的一元线性回归算法
今天我们用C语言实现一个简单的线性回归算法:在代码前面我们在回顾一下线性回归. 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式.通过构建损失函数,来求解损失 ...
- C语言简单算法之高速公路超速处罚,计算油费,比较大小,两个数的简单计算器
C语言简单算法之高速公路超速处罚,计算油费,比较大小,两个数的简单计算器 [1] 1.题目7-1高速公路超速处罚 1.实验代码 #include <stdio.h>int main() { ...
- C语言简单算法之求交错序列前N项和,统计学生平均成绩与及格人数,求1到100的和,求奇数分之一序列前N项和,找出最小值,求n!,统计字符,最佳情侣身高差
C语言简单算法之求交错序列前N项和,统计学生平均成绩与及格人数,求1到100的和,求奇数分之一序列前N项和,找出最小值,求n!,统计字符,最佳情侣身高差 [1] 1.题目三 求交错序列前N项和 1.实 ...
- C语言简单算法之计算分段函数,A除以B,阶梯电价,出租车计价
C语言简单算法之计算分段函数,A除以B,阶梯电价,出租车计价 1.题目一计算分段函数[1] 1.实验代码 #include<stdio.h> int main() {float x,y;s ...
- C语言简单算法之A乘以B,求整数平均值,是不是胖了,输出各位数字
C语言简单算法之A乘以B,求整数平均值,是不胖了,输出各位数字 1.题目一:A乘以B 1.实验代码 include<stdio.h> int main() {int A,B;scanf(& ...
- 【简单算法】回文数(C语言)
概述 注水博客,期末emo加摆烂,想做做简单算法抚慰心灵: 题目描述 9.回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右) ...
- 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...
语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...
最新文章
- jieba分词流程及部分源码解读(一)
- 项目进度,你汇报清楚了么?
- datetime 索引_date类型和varchar类型在查询索引效率上比较
- Linux下更好用的帮助命令—cheat
- 图解Redis之数据结构篇——压缩列表
- c++语言标准 pdf,C++14标准.pdf
- 【2050 Programming Competition - 2050 一万人码 】非官方部分题解(HDU)
- Java笔记-JdbcTemplate批量执行insert及update
- DIV默认高度且自适应高度
- JS调试的时候遇到无限debugger怎么办?
- 理解 Java 的 GC 与 幽灵引用
- 为全面到来的数字化未来准备就绪 戴尔科技峰会赋能企业数字化发展新动力
- Matlab简单教程:函数
- Python二级题库答案纠正
- 在.net中使用sqlite
- 数据库mysql报2005错_sql2005还原数据库错误的问题解决方法
- 灰色预测模型python实例_12-6:数学模型(灰色模型)与Python编程预测
- 唯物主义观点有哪些_唯物主义的观点及方法论有哪些?
- 《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用
- 下一代Web服务的基础框架——F2F俱乐部SOA系列活动