麻将胡牌算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
char tNums[10];//存放输入牌的所有条
int countT = 0;
char wNums[10];//存放输入牌的所有万
int countW = 0;
char dNums[10];//存放输入牌的所以筒
int countD = 0;
char *nums[40][40];//存放输入的所有牌
typedef struct _pai{
char num;
char kind;
} Pai[20];
int judegeNums(char n[],int count){
if(count > 0){
char temp = n[0];
int i,j ;
for(i = 0; i < count-1; i ++){
for(j = i+1; j < count; j ++){
if(n[i] > n[j]){
temp=n[i];
n[i]=n[j];
n[j]=temp;
}
}
}
int startIndex = 1;
char doubleList[10] = {n[0]};
int doubleCount =1;
char orderList[10] = {n[0]};
int orderCount = 1;
while(startIndex < count){
if(doubleCount == 0 && orderCount ==0){
doubleList[0] = n[startIndex];
orderList[0] = n[startIndex];
doubleCount ++;
orderCount ++;
startIndex ++;
continue;
}
if(n[startIndex] == doubleList[0]){
doubleCount = 0;
orderCount = 0;
}else if(n[startIndex] == orderList[orderCount-1]+1){
doubleCount = 0;
orderList[orderCount] =n[startIndex];
orderCount ++;
if((orderCount % 3) == 0){
orderCount = 0;
}
}else{
return 0;
}
startIndex ++;
}
}
return 1;
}
void main(){
int isRightK = 1;
int isRightN = 1;
printf("Please enter your nums:\n");
//1 输入几张牌 存到nums数组里面
int count = 0; //记录输入了几张牌
Pai pai;
while(1){
char num[10];
scanf("%s",&num);
if(num[0] != '0'){
if(strlen(num) == 2){
if(num[0])
pai[count].num=num[0];
pai[count].kind=num[1];
count ++;
}else{
printf("请输入合法的牌!");
}
}else{
break;
}
}
int i ;
printf("您的牌为:");
for(i = 0; i < count; i ++){
//将随机输入的14张牌按花色分组 分别存到tNums,wNums,dNums数组中
if(pai[i].kind == 'W'){
wNums[countW] = pai[i].num;
countW ++;
}else if(pai[i].kind == 'T'){
tNums[countT] = pai[i].num;
countT ++;
}else if(pai[i].kind == 'D'){
dNums[countD] = pai[i].num;
countD ++;
}else{
isRightK = 0;//花色不合法
}
if(pai[i].num>'9'||pai[i].num<'1'){
isRightN = 0;//牌面值不合法
}
printf("%c%c",pai[i].num,pai[i].kind);
}
printf("\n");
if(isRightK == 0 || isRightN ==0){
printf("您的牌不合法,请输入合法的牌!");
exit(0);
}
//2 验证牌是否是14张牌 小于或大于14则不能胡牌
if(count < 14){
printf("您的牌小于14张 不能胡牌!");
exit(0);
}
if(count > 14){
printf("您的牌大于14张 不能胡牌!");
exit(0);
}
//4 分别将三个数组内部排序,并看数组里面是否都是两个一样的字符或按三个连续字符的数组成
if(judegeNums(tNums,countT) == 1 &&
judegeNums(wNums,countW) == 1 &&
judegeNums(dNums,countD) == 1){
printf("恭喜
您,
胡牌啦!!");
}else{
printf("不能胡牌!");
}
//5 如果4中有一个数组不符合 则直接退出(不能糊牌),如果4中三个数组都符合 则能糊牌
}