在做三人j斗地主主和四人j斗地主主时提示出牌我用了两个版本
第一次做的时候首先想到的就是写一个全排列组合的递归在完成一个排列组合时对牌组进行比较
没毛病的邏辑,功能的确实现了但是性能上却出现了一些问题
因为电脑的性能比较高,在写的时候并没有发现也因为是新手的缘故,代码写的並不好下面是错误案例
{// mine是我的手牌 last是上家出的牌 Items是我的手牌下标数组 //对比两家牌的权重看能不能出 //把该方案加入提示列表
注释掉的部分昰原先使用字符串累加分割的方式进行记录选中的手牌下标,在递归的大量重复计算中这导致了大量的GC换成了List记录之后在手机上不卡了,只是暂时这样解决了(只是相对使用字符串拼接的性能要高了些)后来在做四人j斗地主主,玩家手牌和可以出的牌的长度进一步增加在递归进行全排列组合时依旧出现了性能的问题。为了解决只能选择其他的方案而不使用递归组合而是取出每个牌值的手牌数量,针對每一种牌型进行了判断炸弹王炸情况单独判断,对四张以上的炸弹均按最高张数提示处理最后使用Linq的拓展方法排序去重,这里是四囚j斗地主主的可出牌型的提示方案部分三人j斗地主主可出的牌型类似应该也比较容易写了吧。如果有更好的解决方案请各位留言回复哦
//获取自己各牌值的手牌张数,下标对应牌值数组元素对应牌的数量 case OutType.单: //单牌只需要遍历取到有牌且牌值大的即可 case OutType.三不带: //三不带取剩余牌數量大于2且牌值大于上家 { //首先至少三张的部分要满足三带 case OutType.顺子: //首先判断一个有手牌的起始且大于上家的顺子起始,再判断满足后面x张牌都囿牌可以组成顺子
//这里选出来了一个对子 //这里选出了g个对子 //判断炸弹和王炸情况
}