C# 斗地主出牌算法精华斗地主出牌算法根据斗地主出牌规则. 对玩家出的牌进行检验. 判断是否符合出牌规则. ( 关于斗地主的出牌规则网上有很多) 思路: 将玩家的牌按升序排序. 然后将牌进行拆分, 分存在 4 个数组中. 拆分规则如下: 假设有牌:333/444/555/789 则拆分后数组中的数据如下 arr[0]:345789 arr[1]:345 arr[2]:345 arr[3]:null 可以看出拆分规则是: 如果遇到相同数字的牌则存到下一个数组的末尾. 拆分完后可以根据各数组的存储情况判定玩家出牌的类型, 上面例子 arr[3] 为空. 可以排除掉 4带 1(2). 炸弹. 的情况根据 arr[2] 为顺子且个数大于 1,且 arr[2] 中存放的牌的张数乘以 3 刚好等于 arr[0] 的张数+arr[1] 的张数. 则可以判定是三带一的飞机. 其他类型的牌也有相似的规律. 以下是该算法的核心源代码. 本算法用 C# 编写. using System; using ; using ; namespace LordLibrary { /* * 以下程序版权由林奕霖所有, 有兴趣的朋友可以用来交流和探讨. 但请别用于商业用途. 否则后果自负. * 您可以自由拷贝修改此源代码, 但必须保留此注释. */ public class CheckType { private static int[][] DiffRow(int[] nums) { int[][] list = new int[4][]; for (int i= 0;i< ; i++) { list = new int[20]; } int[] rowIndex = new int[4]; int columIndex = 0; for (int i= 0;i< ; i++) { if (i+1< ) { if (nums != 0) { list[columIndex][rowIndex[columIndex]] = nums; rowIndex[columIndex]++; } if (nums == nums[i + 1]) { columIndex++; } else { columIndex = 0; }} else if (nums != 0) list[columIndex][rowIndex[columIndex]] = nums; } return list; } private static int checkListCount(int[][] list, int rowIndex, pStart, int rowMaxCount) { /* LIST 代表单顺. *DOUB 代表双顺. *FEI0 代表三顺. *FEI1 代表三带一的飞机*FEI2 代表三带二的飞机*FOR1 代表四带 1 *FOR2 代表四带 2 *ROCK 代表大小王*/ int listCount = 1; for (int i= compStart; i< rowMaxCount - 1; i++) { if (list[rowIndex] +1 == list[rowIndex][i + 1]) listCount++; else listCount = 1; } return listCount; } public static string getCardType(int[] nums) { int[][] list = DiffRow(nums); int[] counts = new int[4]; for (int k= 0;k< 4; k++) { counts[k] = (list[k], 0); } int MaxValue = 0; int listCount = 0; string type = ; // 当第 4 行牌的数量为 1 的时候#region if (counts[3] == 1) { int index = (list[2], list[3][0]); switch (counts[2]) { case 1: MaxValue = list[3][0]; if (counts[0] == 1) { type = "BOMB:4:" + MaxValue; } else if (counts[0] + counts[1] == 4) { type = "FOR1:6:" + MaxValue; } else if (c
C# 斗地主出牌算法 精华 来自淘豆网m.daumloan.com转载请标明出处.