自己写的带混牌麻将算法

// 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 };
int iImagicPaiNum = 2;
bool AnalyzePai(int aKindPai[], bool bIsZi, bool bHasJiang);
bool IsHu(int iAllPaiTemp[4][10]);

bool IsHu(int iAllPaiTemp[4][10])
{
bool bHasJiang = false;
for (int i = 0; i < 4; i++)
{
if (!AnalyzePai(iAllPaiTemp[i], i == 3, bHasJiang))
return false;
}
return true;
}

bool AnalyzePai(int aKindPai[], bool bIsZi,bool bHasJiang)
{
bool bResult = false;
if (aKindPai[0] == 0){

if (bHasJiang){

return true;
}
else
{
if (iImagicPaiNum % 3 == 2)
{
return true;
}
}

}

for (int j = 1; j < 10; j++){

if (bIsZi)
{
if (aKindPai[j] > 0)
{
if (bHasJiang){

int iNeedImagic = aKindPai[j];
if (iImagicPaiNum < (3 - iNeedImagic)){ return false; }
aKindPai[j] = 0;
aKindPai[0] -= iNeedImagic;
iImagicPaiNum -= (3 - iNeedImagic);
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] = iNeedImagic;
aKindPai[0] += iNeedImagic;
iImagicPaiNum += (3 - iNeedImagic);
return bResult;
}
int iNeedImagic = aKindPai[j];
if (iImagicPaiNum < (2- iNeedImagic)){ return false; }
aKindPai[j] = 0;
aKindPai[0] -= iNeedImagic;
bHasJiang = true;
iImagicPaiNum -= (2 - iNeedImagic);
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] = iNeedImagic;
aKindPai[0] += iNeedImagic;
iImagicPaiNum += (2 - iNeedImagic);
return bResult;
}
}
else
{
//处理牌的数量为1
if (aKindPai[j] == 1){

if (aKindPai[j + 1] > 0 && aKindPai[j + 2] > 0)
{
if ((aKindPai[j + 1] + aKindPai[j + 2]) > 4){
if (bHasJiang){
if (iImagicPaiNum < 2){ return false; }
aKindPai[j] -= 1;
iImagicPaiNum -= 2;
aKindPai[0] -= 1;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[0] += 1;
iImagicPaiNum += 2;
return bResult;
}
if (iImagicPaiNum < 1){ return false; }
aKindPai[j] -= 1;
iImagicPaiNum -= 1;
bHasJiang = true;
aKindPai[0] -= 1;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[0] += 1;
aKindPai[j] += 1;
iImagicPaiNum += 1;
return bResult;
}
aKindPai[j] -= 1;
aKindPai[j + 1] -= 1;
aKindPai[j + 2] -= 1;
aKindPai[0] -= 3;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[j + 1] += 1;
aKindPai[j + 2] += 1;
aKindPai[0] += 3;
return bResult;
}

//当没有可以与它组成顺子的牌,开始判断有没有比它大一的牌
else if (aKindPai[j + 1]>0){
switch (aKindPai[j + 1])
{
case 1:
if (iImagicPaiNum < 1){return false;}
aKindPai[j] -= 1;
aKindPai[j + 1] -= 1;
iImagicPaiNum -= 1;
aKindPai[0] -= 2;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[j + 1] += 1;
aKindPai[0] += 2;
iImagicPaiNum += 1;
return bResult;
break;
case 2:
if (bHasJiang){
if (iImagicPaiNum < 3){ return false; }
aKindPai[j] -= 1;
aKindPai[j + 1] -= 2;
aKindPai[0] -= 3;
iImagicPaiNum -= 3;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[j + 1] += 2;
aKindPai[0] += 3;
iImagicPaiNum += 3;
return bResult;
}
else{
if (iImagicPaiNum < 2){ return false; }
aKindPai[j] -= 1;
aKindPai[j + 1] -= 2;
aKindPai[0] -= 3;
iImagicPaiNum -= 2;
bHasJiang = true;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[j + 1] += 2;
aKindPai[0] += 3;
iImagicPaiNum += 2;
return bResult;
}
break;
case 3:
aKindPai[j + 1] -= 3;
aKindPai[0] -= 3;
bResult = (aKindPai, bIsZi, bHasJiang);
aKindPai[j + 1] += 3;
aKindPai[0] += 3;
return bResult;

/*if (bHasJiang){
if (iImagicPaiNum < 2){ return false; }
aKindPai[j] -= 1;
aKindPai[j + 1] -= 3;
iImagicPaiNum -= 2;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[j + 1] += 3;
iImagicPaiNum += 2;
return bResult;
}
else{
if (iImagicPaiNum < 1){ return false; }
aKindPai[j] -= 1;
aKindPai[j] -= 3;
iImagicPaiNum -= 1;
bHasJiang = true;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[j + 1] += 3;
iImagicPaiNum += 1;
return bResult;
}*/
break;
case 4:
aKindPai[j + 1] -= 3;
aKindPai[0] -= 3;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j + 1] += 3;
aKindPai[0] += 3;
return bResult;
break;
}

}

//孤立的一张牌
else{
if (bHasJiang){
if (iImagicPaiNum < 2){ return false; }
aKindPai[j] -= 1;
iImagicPaiNum -= 2;
aKindPai[0] -= 1;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[0] += 1;
iImagicPaiNum += 2;
return bResult;
}
else
{
if (iImagicPaiNum < 1){ return false; }
aKindPai[j] -= 1;
aKindPai[0] -= 1;
iImagicPaiNum -= 1;
bHasJiang = true;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 1;
aKindPai[0] += 1;
iImagicPaiNum += 1;
return bResult;
}

}
}

//处理牌的数量为2
else if (aKindPai[j] == 2)
{
if (((aKindPai[j + 1] + aKindPai[j + 2]) <= 4) && (aKindPai[j + 1] > 0) && (aKindPai[j + 2] > 0))
{
int iNeedBigOne = aKindPai[j + 1];
int iNeedBigTwo = aKindPai[j + 2];
if (iImagicPaiNum <( 4-(iNeedBigOne + iNeedBigTwo))){ return false; }
aKindPai[j] -= 2;
aKindPai[j + 1] = 0;
aKindPai[j + 2] = 0;
iImagicPaiNum -= iNeedBigOne;
iImagicPaiNum -= iNeedBigTwo;
aKindPai[0] = aKindPai[0] - 2 - iNeedBigOne - iNeedBigTwo;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 2;
aKindPai[j + 1] += iNeedBigOne;
aKindPai[j + 2] += iNeedBigTwo;
aKindPai[0] = aKindPai[0] + 2 + iNeedBigOne + iNeedBigTwo;
return bResult;
}
else {
if (bHasJiang){
if (iImagicPaiNum < 1){ return false; }
aKindPai[j] -= 2;
iImagicPaiNum -= 1;
aKindPai[0] -= 2;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 2;
aKindPai[0] += 2;
iImagicPaiNum += 1;
return bResult;
}
aKindPai[j] -= 2;
aKindPai[0] -= 2;
bHasJiang = true;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 2;
aKindPai[0] += 2;
return bResult;
}
}

//处理牌数量为3或4
else if ((aKindPai[j] == 3) || (aKindPai[j] == 4))
{
aKindPai[j] -= 3;
aKindPai[0] -= 3;
bResult = AnalyzePai(aKindPai, bIsZi, bHasJiang);
aKindPai[j] += 3;
aKindPai[0] += 3;
return bResult;
}

}
}
return false;
}

时间: 2024-11-09 00:21:46

自己写的带混牌麻将算法的相关文章

JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)

一.描述 解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序. Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m) 二.源代码 <span st

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

【来写个2048吧】—— 移动算法与随机数字生成

一.移动算法 其实2048的移动算法蛮简单,看代码很容易明白,就不多说了. 向左滑动 //左滑动 bool GameScene:: doLeft () { //判断有没有发生移动 bool isMove = false ; for ( int y = 0 ; y < 4; y++) { for ( int x = 0 ; x < 4; x++) { for ( int x1 = x +1 ; x1 < 4; x1++) { if ( cardArr [x1 ][ y]-> getN

写一个随机洗牌函数——概率题

题目描述: 写一个随机洗牌函数.要求洗出的52!种组合都是等概率的. 也就是你洗出的一种组合的概率是1/(52!).假设已经给你一个完美的随机数发生器. 解题思路: 这是一道概率题 随机洗牌,目的是要做到随机性,要求每一张牌出现的概率要相等. 我们常用的普通扑克牌54张,要做到每张牌出现的概率是1/(54!), 抽第一张牌概率:1/54: 抽第二张牌概率:1/53: 抽第三张牌概率:1/52: -- 一直这样随机地拿下去直到拿完最后1张,我们就从52!种可能中取出了一种排列, 这个排列对应的概率

成都麻将胡牌问题算法

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

麻将算法

麻将胡牌算法(不带赖子)(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<

Android Json数据的解析+ListView图文混排+缓存算法Lrucache 仿知乎

前几天心血来潮,打算根据看知乎的API自己做一个小知乎,定制的过程遇到ListView的优化问题及图片未缓存重加载等等许多问题,解决了以后打算和博友分享一下. 接口数据:http://api.kanzhihu.com/getpostanswers/20150925/archive 首先,Json数据太常用,相信每一位开发者Json的解析都是必备的.我们要准备以下知识: JavaBean,枚举你需要的元素,用来存储数据. 异步加载网络内容的必备途径,多线程加载+AsyncTask两种方式. Jso

带权重的随机算法及实现

在游戏开发过程中,经常会遇到生成一波带权重的随机怪物或是掉落List中物品带权重的情况,总结下我的算法以及实现方法. 直接上代码 using System.Collections.Generic; using System; public class RandomHelper { /// <summary> /// 算法: /// 1.每个元素权重+1命名为w,防止为0情况. /// 2.计算出总权重n. /// 3.每个元素权重w加上从0到(n-1)的一个随机数(即总权重以内的随机数),得到

【BZOJ-3052】糖果公园 树上带修莫队算法

3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status][Discuss] Description Input Output Sample Input Sample Output 84 131 27 84 HINT Source Solution 树上带修莫队 本质还是树上莫队,详情可以转 BZOJ-3757苹果树 但是这里需要修改,就需要一些特殊的地方