十三张/十三水 最优组合

十三水规则:
    二到四人对局,,一副牌,除去大王,小王,剩下总共52张牌;游戏中每人获得13张牌;
游戏规则
    每位玩家需将手上的13张牌分成头、中、尾三墩牌,头墩三张,中尾墩各五张。

2)  普通牌型(3、5张牌)
    同花顺:同门花色中之五张连续牌。若别家也有同花顺时,比顺子大小如牌型全部相同,则平局。 在底墩,按5道计;在中墩,则记10道;
    铁支(四条):4张相同的牌。在底墩,按4道计;在中墩,则记8道;
    葫芦:由三条加一对组成。若别家也有此牌型,则比三张数字大小。 放中墩,则计3道;
    同花:同门花色中之五张杂牌。若遇相同则先比这副牌中最大的一支,如又相同再比第二支、依此类推。如牌型全部相同则平局;
    顺子:五张牌都是连续的组合,2、3、4、5、6为最小牌。 10、J、Q、K、A为最大牌,若巧遇别家也有则平局。道:第二大的牌不是9、10、J、Q、K(此为第三大)而是A、2、3、4、5;
    三条:三张相同的牌。若遇相同,则比三条部分的数字大小。 在头墩,以三尖刀计;
    三尖刀:头墩为三条。 按3道计。
    二对:牌型中五张牌由两组两张相同数字的牌所组成。若遇相同则先比这副牌中最大的一对,如又相同再比第二对、如又相同再比单张牌大小。如牌型全部相同则平局。
    对子:由两张相同数字的牌组成。若别家也相同则比剩下牌的数字大小,如牌型全部相同则平局。 第一墩是两张带一张,后面是两张带三张;
    乌龙(散牌):组不出任何牌型。只比数字大小,其比法与同花相同。若两家从大到小都一样,则平局;

规则介绍:
https://baike.baidu.com/item/%E5%8D%81%E4%B8%89%E6%B0%B4/81938

后台逻辑实现思路:
一手牌是13张,要组成头墩、中墩、尾墩,每墩可能分别是同花顺、铁枝……对子、乌龙等,要保证尾墩 >= 中墩 > 头墩。可以通过遍历所有类型,获取指定的尾墩组合后,对剩余的牌再进行组合,优先使用递归。
伪代码:

// CCombinateCards 组合类
// ST_ONE_HAND_COMBINATION 一手牌组合
// ST_CARD_SENTENCE 一墩牌,三张或五张
typedef std::vector<ST_ONE_HAND_COMBINATION> COneHandArray;

bool CCombinateCards::CombinateSpecifiedStyle(COneHandArray &arrTraverseArray,BYTE byType)
{
    CCombinateCards clsGroup = *this;   
    if (clsGroup.m_nCount == 0)
    {
        return true;
    }

    int iStcTypeCount = 0;
    int iSentence = 0;
    int iPos = clsGroup.m_nCount / MAX_SENTENCE_LENGTH;                 // 头、中、尾
    int iLength = iPos == EN_LOCALTION_HEAD? MIN_SENTENCE_LENGTH : MAX_SENTENCE_LENGTH;
    bool bTail = clsGroup.m_nCount == MAX_CARDS_EVERYONE;

    std::vector<ST_CARD_SENTENCE> arrSentence;
    if (byType >= EN_ST_TONGHUASHUN && m_nCount >= MAX_SENTENCE_LENGTH)
    {
        int iTonghuashunCount = NormalTonghuashun(arrSentence);
        if (byType == EN_ST_TONGHUASHUN && bTail && iTonghuashunCount == 0)
        {
            return false;
        }
        for (;iSentence < iTonghuashunCount;++iSentence)    // 如果有同花顺,则将该顺子从手牌中删除,拼凑头和中
        {
            CCombinateCards clsGroupTmp = clsGroup;
            if (!clsGroupTmp.DeleteSentence(arrSentence[iSentence],iLength))        // 删除该句子,获得剩余的牌
            {
                return false;
            }

            if (bTail)                      // 如果是尾墩,应该新建一个 ST_ONE_HAND_CARD ,如果是中或头,则往 arrTraverseArray 的最后一个 ST_ONE_HAND_CARD 中添加
            {
                ST_ONE_HAND_COMBINATION stOneHand;
                stOneHand.SetLocationCard(EN_LOCALTION_TAIL,arrSentence[iSentence]);
                arrTraverseArray.push_back(stOneHand);
            }
            else
            {
                // 如果是取中墩,且已经有一个中墩了,再新建一个 ST_ONE_HAND_COMBINATION ,尾墩不需要新建。如果是尾墩则直接往 arrTraverseArray 里面设置
                if (iPos == EN_LOCALTION_MID && arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_MID].IsValidSentence())
                {
                    ST_ONE_HAND_COMBINATION stOneHand;
                    stOneHand.m_astSentence[EN_LOCALTION_TAIL] = arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_TAIL];
                    arrTraverseArray.push_back(stOneHand);
                }
                arrTraverseArray[arrTraverseArray.size() - 1].SetLocationCard(iPos,arrSentence[iSentence]);                 
            }

            clsGroupTmp.CombinateSpecifiedStyle(arrTraverseArray,EN_ST_TONGHUASHUN);                                        // 此处获得的是以同花顺为尾墩的组合
        }

        if (iTonghuashunCount > 0 && bTail)
        {
            return true;
        }
    }


    if (byType >= EN_ST_TIEZHI)
    {
        int iTiezhiCount = NormalTiezhi(arrSentence);                                           // 到这里肯定没有同花顺了,此时从剩余的单牌中找一个放入 arrSentence 中
        if (byType == EN_ST_TIEZHI && bTail && iTiezhiCount == 0)
        {
            return false;
        }

        for (iSentence = 0;iSentence < iTiezhiCount;++iSentence)                                // 如果有铁枝,则将该铁枝从手牌中删除,拼凑头和中
        {
            CCombinateCards clsGroupTmp = clsGroup;
            if (!clsGroupTmp.DeleteSentence(arrSentence[iSentence],arrSentence[iSentence].m_iSentenceLen))      // 删除该句子,获得剩余的牌
            {
                return false;
            }

            if (bTail)                      // 如果是尾墩,应该新建一个 ST_ONE_HAND_CARD ,如果是中或头,则往 arrTraverseArray 的最后一个 ST_ONE_HAND_CARD 中添加
            {
                ST_ONE_HAND_COMBINATION stOneHand;
                stOneHand.SetLocationCard(EN_LOCALTION_TAIL,arrSentence[iSentence]);
                arrTraverseArray.push_back(stOneHand);
            }
            else
            {
                // 如果是取中墩,且已经有一个中墩了,再新建一个 ST_ONE_HAND_COMBINATION ,尾墩不需要新建。如果是尾墩则直接往 arrTraverseArray 里面设置
                if (iPos == EN_LOCALTION_MID && arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_MID].IsValidSentence())
                {
                    ST_ONE_HAND_COMBINATION stOneHand;
                    stOneHand.m_astSentence[EN_LOCALTION_TAIL] = arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_TAIL];
                    arrTraverseArray.push_back(stOneHand);
                }
                arrTraverseArray[arrTraverseArray.size() - 1].SetLocationCard(iPos,arrSentence[iSentence]);
            }
            clsGroupTmp.CombinateSpecifiedStyle(arrTraverseArray,EN_ST_TIEZHI);                                         // 此处是以铁枝为尾墩的组合
        }
        if (iTiezhiCount > 0  && bTail)
        {
            return true;
        }
    }

        // 中间其他类型省略 ...

    int iWulongCount = NormalWulong(arrSentence);
    //if (byType == EN_ST_WULONG/* && bTail */&& iWulongCount == 0)                             // 乌龙不会出现在尾墩
    //{
    //  return false;
    //}
    for (iSentence = 0;iSentence < iWulongCount;++iSentence)                                    // 如果有葫芦,则将该葫芦从手牌中删除,拼凑头和中
    {
        CCombinateCards clsGroupTmp = clsGroup;
        if (!clsGroupTmp.DeleteSentence(arrSentence[iSentence],iLength))        // 删除该句子,获得剩余的牌
        {
            return false;
        }

        if (bTail)                      // 如果是尾墩,应该新建一个 ST_ONE_HAND_CARD ,如果是中或头,则往 arrTraverseArray 的最后一个 ST_ONE_HAND_CARD 中添加
        {
            ST_ONE_HAND_COMBINATION stOneHand;
            stOneHand.SetLocationCard(EN_LOCALTION_TAIL,arrSentence[iSentence]);
            arrTraverseArray.push_back(stOneHand);
        }
        else
        {
            // 如果是取中墩,且已经有一个中墩了,再新建一个 ST_ONE_HAND_COMBINATION ,尾墩不需要新建。如果是尾墩则直接往 arrTraverseArray 里面设置
            if (iPos == EN_LOCALTION_MID && arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_MID].IsValidSentence())
            {
                ST_ONE_HAND_COMBINATION stOneHand;
                stOneHand.m_astSentence[EN_LOCALTION_TAIL] = arrTraverseArray[arrTraverseArray.size() - 1].m_astSentence[EN_LOCALTION_TAIL];
                arrTraverseArray.push_back(stOneHand);
            }
            arrTraverseArray[arrTraverseArray.size() - 1].SetLocationCard(iPos,arrSentence[iSentence]);
        }
        clsGroupTmp.CombinateSpecifiedStyle(arrTraverseArray,EN_ST_WULONG);                                         // 
    }

    return true;
}
<think>好的,我现在需要给用户介绍一下微信小程序“财神十三”。首先,我得确定用户对这个游戏的了解程度。可能用户听说过但不太清楚具体玩法,或者想找一个新的游戏小程序。我需要先解释什么是十三,然后再介绍微信小程序版本的特点。 接下来,我应该回忆一下十三的基本规则。十三,也叫拼道、十三,是流行于华东、华南地区的扑克游戏。通常四人参与,每人13牌,分成三道进行比较。然后要说明微信小程序可能有的特色,比如便捷性、社交功能、游戏模式等。 然后,我需要考虑财神十三小程序可能包含的功能。例如,是否支持好友对战、人机模式,有没有排行榜、成就系统,或者皮肤、道具等个性化设置。另外,用户可能关心是否需要下载安装,小程序的优势就在于即点即用,无需安装,节省手机空间。 还要注意用户可能对规则不太熟悉,是否需要简要说明游戏规则?比如如何分牌,牌型大小,胜负判定等。但用户的问题主要是“介绍”,所以可能需要概括,而不是详细教学。 另外,安全性和广告也是用户可能关心的点。可以提到小程序是否有广告干扰,是否需要实名认证,或者是否存在内购项目。 可能还需要比较其他平台或APP的十三游戏,突出微信小程序版本的优势,比如社交分享方便,通过微信好友直接邀请,或者微信登录的便捷性。 最后,需要提醒用户适度游戏,注意时间管理,以及是否涉及金币或虚拟货币,是否有防沉迷系统。 现在要组织这些信息,结构清晰,分点说明,使用口语化中文,避免使用Markdown,按照用户的要求用自然段落分隔。同时确保LaTeX格式正确,如果有数学表达式的话,但在这个问题中可能用不到,不过要保持警惕。需要检查是否有错别字,信息是否准确,比如十三的别名、玩家人数、分道规则等是否正确。 可能还需要确认“财神十三”是否有特殊规则,比如带财神牌(即百搭牌),这会影响玩法介绍。如果有,需要说明财神牌的作用,例如可以替代任意牌组成更好的牌型。 总结下来,回答的结构应该是:首先介绍十三游戏的基本概念,然后过渡到微信小程序版本,分点说明其主要特点、功能、便捷性、社交元素等,最后可能加上注意事项或游戏建议。</think>微信小程序“财神十三”是一款基于传统扑克游戏“十三”(又称“拼道”“十三”)开发的休闲娱乐小程序。以下从游戏背景、玩法规则、小程序特色等方面为你简要介绍: --- ### 一、游戏背景 十三起源于中国华东、华南地区,通常为4人局,每人发13牌,需将牌分为**头道(3)**、**中道(5)**、**尾道(5)**三道,按牌型大小与对手比较胜负。因其策略性强、趣味性高,成为热门扑克玩法之一。 --- ### 二、核心玩法规则 1. **分牌规则** 玩家需将13牌分为前、中、后三道,要求**尾道 ≥ 中道 ≥ 头道**(即尾道牌型最大)。若分牌不符合顺序,则视为“倒”并判负。 2. **牌型大小** 从高到低依次为:同花顺 > 炸弹 > 葫芦 > 同花 > 顺子 > 三条 > 两对 > 一对 > 散牌。部分版本可能引入“财神牌”(万能牌),可替代任意牌组成更强牌型。 3. **胜负判定** 与同桌其他玩家逐道比较,赢一道计1分,输一道扣1分,最终根据总分结算胜负。 --- ### 三、微信小程序特色 1. **便捷性** 无需下载APP,通过微信搜索即可快速进入游戏,节省手机存储空间。 2. **社交互动** - 支持微信好友实时组局,一键分享房间链接。 - 内置聊天表情和语音功能,增强玩家互动体验。 3. **多样化模式** 通常包含经典模式、癞子模式(带财神牌)、比赛场等,满足不同玩家需求。 4. **个性化设置** - 提供虚拟形象、牌桌背景等自定义选项。 - 部分版本设有成就系统和排行榜,增加游戏挑战性。 --- ### 四、注意事项 1. 小程序一般为免费娱乐,但部分功能(如特殊道具、皮肤)可能需要虚拟货币解锁。 2. 需警惕广告弹窗,建议选择官方或口碑较好的小程序。 3. 注意游戏时间,避免沉迷。 --- 若你对策略类卡牌游戏感兴趣,可以尝试体验。实际玩法可能因小程序版本略有差异,建议进入游戏后通过教程快速上手!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值