麻将算法(八)胡牌之选择正确的组合方式
2017-10-27 10:52
218 查看
手牌中的“对子”取出后,将“连牌”和“同牌”方进入一个List里面,并通过M选N的组合方式将可能出现的种类选择出来:
list是引用类型,如果在下面改变原来的值,会改变本身的值,因此需要在每一次进行判断前创建一个副本代替他去执行比较操作。
public static List<int[]> KindsToType(int[] cbCardIndex, int NumberInHand, List<FrontageItem> Frontage, List<tagKindItem> tagKindItem_list) { List<int[]> Kinds = GetAllkinds(tagKindItem_list); //将List中的连牌、同牌取出来,放到一个list里面 List<int[]> comnbineList = GetCombineNFromM(4 - Frontage.Count, tagKindItem_list.Count); //M选N中选出来的组合方式 List<int[]> UserKinds = new List<int[]>(); List<int> StartCard = new List<int>(); //将初始手牌存进一个list里面是为了和选出来不同组合的“待选牌”进行比较 int indexstart = 0; for (int i = 0; i < cbCardIndex.Length; i++) { if (cbCardIndex[i] != 0 ) { for (int j = 0; j < cbCardIndex[i]; j++) { StartCard.Add(i); //初始手牌中存放的是牌索引 } } } int[] StartCard1 = new int[StartCard.Count]; //为了由于在比较过程中会改变手牌的值,所以将初始手牌克隆一个副本,用副本进行比较 int indexnew = 0; foreach (int[] ing in comnbineList) { List<int> NewCard = new List<int>(); for (int i = 0; i < ing.Length; i++) { if (ing[i] == 1) { int[] tempy = (int[])Kinds[i].Clone(); for (int j = 0; j < tempy.Length; j++) { NewCard.Add(tempy[j]); //将不同种类的组合方式全部存进一个List里面 } } } int[] Clonearray = new int[NewCard.Count]; //把List转化为数组 for (int i = 0; i < Clonearray.Length; i++) { Clonearray[i] = NewCard[i]; } int[] Clonearray1 = (int[])Clonearray.Clone(); //比较依旧是通过克隆出来的副本进行比较,改变副本的值 for (int i = 0; i < StartCard1.Length; i++) { StartCard1[i] = StartCard[i]; } for (int z = 0; z < StartCard1.Length; z++) //将初始手牌的副本与一个组合后的牌的副本进行比较,如果有相同的,就把他们这个相同的值都归零 { for (int m = 0; m < Clonearray.Length; m++) { if (StartCard1[z] == Clonearray[m]) { Clonearray[m] = 0; StartCard1[z] = 0; break; } } } bool isitm1 = true; for (int i = 0; i < StartCard1.Length; i++) { isitm1 = true; if (StartCard1[i] != 0) { isitm1 = false; break; } } bool isitm = false; for (int i = 0; i < Clonearray.Length; i++) { isitm = true; if (Clonearray[i] != 0) { isitm = false; break; } } if (NewCard.Count == Clonearray1.Length && isitm && isitm1) //如果初始手牌的副本与一个组合后的牌的副本没有不等于零的,且数目相同,就说明选出来的组合和手牌一致。是一种正确的组合方式 { UserKinds.Add(Clonearray1); NewCard.Clear(); } else { NewCard.Clear(); } } return UserKinds; }
list是引用类型,如果在下面改变原来的值,会改变本身的值,因此需要在每一次进行判断前创建一个副本代替他去执行比较操作。
相关文章推荐
- 孟岩:技术路线的选择重要但不具有决定性(什么是核心竞争力?是你独特的个性知识经验组合,正确的态度应该是着重于你要干的事情,然后认真把这件事情做好,然后融会贯通)good
- iOS 正确选择图片加载方式
- 你选择大数据培训机构的方式正确吗?这样选择就对了
- iOS 正确选择图片加载方式
- 选择适合的前端UI框架正确方式
- 你选择大数据培训机构的方式正确吗?这样选择就对了
- 正确选择循环方式:LinkedLisk让Iterator绽放光芒
- iOS 正确选择图片加载方式
- 数据需要找回怎么办?----我们如何选择正确的恢复/退回方式?
- 如何用最恰当的方式做出正确的选择和最优地解决问题
- PHP5开发应用之XML所有解析整理说明----正确选择XML解析方式
- iOS开发 正确选择图片加载方式
- 18.UIImage选择正确的加载方式
- 如何依据激励对象和公司状况,选择正确的股权激励方式?
- iOS 正确选择图片加载方式
- iOS开发 正确选择图片加载方式
- [No0000A3]护眼谎言大揭秘,选择正确的方式保护眼睛!
- 企业打开云HBase的正确方式,来自阿里云云数据库团队的解读
- Android 多种方式正确的加载图像,有效避免oom
- Android存储方式的选择