一个麻将算法


bool CGameLogic::AnalyseCard_New(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard, bool bSelfSend, bool bNoneThePair)
{
	//别人打出一张万能牌,只能当作普通牌使用,但是自己手里的耗子牌可以当作耗子
	BYTE bMagicCount = m_cbMagicIndex == MAX_INDEX ? 0 : cbCardIndex[m_cbMagicIndex];
	BYTE cbTempCardIndex[MAX_INDEX] = { 0 };
	CopyMemory(cbTempCardIndex, cbCardIndex, sizeof(cbTempCardIndex));
	if (bSelfSend == false && (SwitchToCardIndex(cbCurrentCard) == m_cbMagicIndex))
	{
		bMagicCount--;
	}
	cbTempCardIndex[m_cbMagicIndex] -= bMagicCount;
	//递归算法
	BYTE cbCardData[MAX_COUNT] = { 0 };
	SwitchToCardData_Digui(cbTempCardIndex, cbCardData, MAX_INDEX);
	bool value = AnalyseCard_DiGui(cbCardData, bNoneThePair, bMagicCount);
	return value;
}

bool CGameLogic::AnalyseCard_DiGui(BYTE cbCardData[MAX_COUNT], bool bNoneThePair, BYTE cbMagicCount)
{
	BYTE cbTmpCardIndex[MAX_INDEX] = { 0 };
	SwitchToCardIndex(cbCardData, MAX_COUNT, cbTmpCard
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
麻将胡牌算法一般采用递归回溯的方法,以下是一个简单的实现: 1. 对手中的牌进行排序,方便后续的计算。 2. 将排好序的牌以一个列表的形式存储,每张牌用一个数字表示。 3. 定义一个递归函数,用来判断当前的牌是否可以胡牌。该函数需要传入以下参数:当前牌型列表、已经组成的刻子和顺子列表、当前判断的牌、当前牌的张数、是否已经有将牌。 4. 在递归函数中,首先判断当前牌是否可以组成刻子或者顺子,如果可以,则将当前牌加入刻子或顺子列表,并继续递归判断剩下的牌是否可以胡牌。 5. 如果当前牌无法组成刻子或顺子,则判断是否可以作为将牌。如果已经有将牌,则将当前牌加入刻子或顺子列表,继续递归判断剩下的牌是否可以胡牌。 6. 如果当前牌无法组成刻子、顺子或将牌,则说明无法胡牌,回溯到上一层继续判断。 7. 当所有的牌都被判断过后,如果已经有将牌,则说明可以胡牌,返回 True,否则返回 False。 代码实现如下: ``` def is_hu(pai_list, kezi_list=[], shunzi_list=[], jiang=None): if not pai_list: return jiang is not None for i in range(len(pai_list)): if i < len(pai_list) - 2 and pai_list[i] == pai_list[i+1] == pai_list[i+2]: # 组成刻子 new_kezi_list = kezi_list + [pai_list[i], pai_list[i+1], pai_list[i+2]] if is_hu(pai_list[:i] + pai_list[i+3:], new_kezi_list, shunzi_list, jiang): return True if i < len(pai_list) - 2 and pai_list[i]+1 in pai_list and pai_list[i]+2 in pai_list: # 组成顺子 new_shunzi_list = shunzi_list + [pai_list[i], pai_list[i]+1, pai_list[i]+2] if is_hu(pai_list[:i] + pai_list[i+1:], kezi_list, new_shunzi_list, jiang): return True if jiang is None and pai_list[i] == pai_list[i+1]: # 作为将牌 new_jiang = pai_list[i] if is_hu(pai_list[:i] + pai_list[i+2:], kezi_list, shunzi_list, new_jiang): return True return False ``` 调用实例: ``` pai_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 1] pai_list.sort() print(is_hu(pai_list)) # True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值