胡牌算法-湖南跑胡子

      首先摸清跑胡子胡牌的规则,跑胡子胡牌是由一句话、绞牌、坎牌、顺子以及将牌组成的,在玩家有跑牌或提牌的情况下需要一对将牌,为3n+2,无跑和提则胡牌为3n。在胡息满15的情况下则胡牌,因此胡牌要满两个条件,1.胡息>=15 ,2.牌组最后被拆完。

本文胡牌算法采用拆牌法用Go语言实现的,下面介绍整体思路。

1.将一个麻将牌作为一个对象Mcard,有Data,value,color三个属性,其中data是唯一的,一张牌一个data,value值就是牌大小,比如一万的value值都是1。color就是大、小。

2. CalHuInfo:胡牌对象,把牌组作为其一个属性,里面存放的是牌的data值(data值是唯一的,通过data可以获得牌对象的其他值)。

3.DecomposeCards(ch *CalHuInfo){...}:拆牌方法,把胡牌对象作为参数。

4.GetPVal(date int){...}通过一张牌的data值获取其value。

func DecomposeCards(ch *CalHuInfo) bool {

	Result := false
	if len(ch.HandCards) == 0 {                           //如果牌组里已经无牌则说明牌组满足 拆牌条件返回true
		return true
	}
	_date := ch.HandCards[0]                              //取牌组的任意
	if GetPVal(_date) == 1 {                              //获取牌value值,代码实例当value为1的情况,以此类推。
		_handCards := make([]int, 0)                  //将牌组先保存起来,如果一种拆法不能将牌拆完,则将牌组恢复
		for _, v := range ch.HandCards {
			_handCards = append(_handCards, v)
		}
		if len(ch.Get123(_date)) == 3 {               //获取顺子123,如果有则把 1,2,3,这三张牌删掉
			if len(ch.HandCards) == 0 {           //牌组长度为0则返回
				Result = true
				//return Result
			} else {
				Result = DecomposeCards(ch)   //如果不为0则 递归调用
			}
			if Result {                           //加上胡息
				if _date < 40 {
					ch.HuXi += 3
				} else {
					ch.HuXi += 6
				}
			}
		}
		if !Result {                                  //如果拆1,2,3没拆完,则恢复牌组,开始下一种拆法
			ch.HandCards = _handCards
		}

		if len(ch.GetJiao_One(_date)) == 3 && !Result {   //获取绞牌
			if len(ch.HandCards) == 0 {
				Result = true
				return Result
			} else {
				Result = DecomposeCards(ch)
			}
		}
		if !Result {
			ch.HandCards = _handCards
		}
		if len(ch.GetJiao_Two(_date)) == 3 && !Result {   //获取绞牌
			if len(ch.HandCards) == 0 {
				Result = true
				return Result
			} else {
				Result = DecomposeCards(ch)
			}
		}
		return Result                                   //返回结果
	}

以上展示的是当起始的那张牌牌值为1的情况,后面需要把所有牌值情况都添加上,代码结构一致,最后返回Result的值。

你可能感兴趣的:(胡牌算法-湖南跑胡子)