logo资料库

C#斗地主算法(绝对精华).doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
斗地主出牌算法 根据斗地主出牌规则.对玩家出的牌进行检验.判断是否符合出牌规则. (关于斗地主的出牌规则网上有很多) 思路:将玩家的牌按升序排序.然后将牌进行拆分,分存在 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 System.Collections.Generic; using System.Text; namespace LordLibrary { /* *以下程序版权由林奕霖所有,有兴趣的朋友可以用来交流和探讨.但请别用于商业用途.否则 后果自负. *您可以自由拷贝修改此源代码,但必须保留此注释. */ public class CheckType { private static int[][] DiffRow(int[] nums) { int[][] list = new int[4][]; for (int i = 0; i < list.Length; i++) { list = new int[20]; } int[] rowIndex = new int[4]; int columIndex = 0; for (int i = 0; i < nums.Length; i++) { if (i + 1 < nums.Length) { 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, int compStart, 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] = Array.IndexOf(list[k], 0); } int MaxValue = 0; int listCount = 0; string type = string.Empty; //当第 4 行牌的数量为 1 的时候 #region if (counts[3] == 1) { int index = Array.IndexOf(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 (counts[0] == counts[1] && counts[0] == 3) { type = "FOR2:8:" + MaxValue; } break; case 2: if (list[2][0] + 1 == list[2][1] && counts[1] == counts[2] && counts[0] == 3) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + counts[2] + ":" + MaxValue; } break; case 3: if (checkListCount(list, 2, 0, counts[2]) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + counts[2] + ":" + MaxValue; } else if (Array.IndexOf(list[2], list[3][0]) == 0 && counts[0] == counts[2]) { if ((listCount = checkListCount(list, 2, 1, counts[2])) == counts[2] - 1) {
MaxValue = list[2][counts[2] - 1]; type = "FEI2:" + listCount + ":" + MaxValue; } } else if (Array.IndexOf(list[2], list[3][0]) == counts[2] - 1 && counts[0] == counts[2]) { if ((listCount = checkListCount(list, 2, 0, counts[2] - 1)) == counts[2] - 1) { MaxValue = list[2][counts[2] - 2]; type = "FEI2:" + listCount + ":" + MaxValue; } } break; case 4: if (index == 0 && counts[0] == counts[1] && counts[0] == 5) { if ((listCount = checkListCount(list, 2, 1, counts[2])) == counts[2] - 1) { MaxValue = list[2][counts[2] - 1]; type = "FEI2:" + listCount + ":" + MaxValue; } } else if (index == counts[2] - 1 && counts[0] == counts[1] && counts[0] == 5) { if ((listCount = checkListCount(list, 2, 0, counts[2] - 1)) == counts[2] - 1) { MaxValue = list[2][counts[2] - 2]; type = "FEI2:" + listCount + ":" + MaxValue; } } else if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } break; case 5: if (index == 0) { if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1];
type = "FEI1:" + listCount + ":" + MaxValue; } else if (listCount == counts[2] - 1 && counts[0] == counts[1]) { if (counts[0] + 1 == 2 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 1]; type = "FEI2:" + listCount + ":" + MaxValue; } else if (2 * (counts[0] + 1) == 3 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } } } else if (index == counts[2] - 1) { if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } else if ((listCount = checkListCount(list, 2, 0, counts[2] - 1)) == counts[2] - 1 && counts[0] == counts[1]) { if (counts[0] + 1 == 2 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 2]; type = "FEI2:" + listCount + ":" + MaxValue; } else if (2 * (counts[0] + 1) == 3 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 2]; type = "FEI1:" + listCount + ":" + MaxValue; } } } else { if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) {
MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } } break; case 6: if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } else if (index == 0 && listCount == counts[2] - 1 && counts[0] + counts[1] + 2 == 3 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } else if (index == counts[2] - 1 && (listCount = checkListCount(list, 2, 0, counts[2] - 1)) == counts[2] - 1 && counts[0] + counts[1] + 2 == 3 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 2]; type = "FEI1:" + listCount + ":" + MaxValue; } break; } } #endregion //当第 4 行牌的数量为 2 的时候 #region if (counts[3] == 2) { switch (counts[2]) { default: if (counts[2] >= 2 && counts[2] < 6) { if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } }
break; case 6: int firstIndex = Array.IndexOf(list[2], list[3][0]); int secIndex = Array.IndexOf(list[2], list[3][1]); if (secIndex == 1) { if ((listCount = checkListCount(list, 2, 2, counts[2])) == counts[2] - 2 && counts[0] == counts[1] && counts[0] + 2 == 2 * (counts[2] - 2)) { MaxValue = list[2][counts[2] - 1]; type = "FEI2:" + listCount + ":" + MaxValue; } } else if (secIndex == counts[2] - 1) { if (firstIndex == 0) { if ((listCount = checkListCount(list, 2, 1, counts[2] - 1)) == counts[2] - 2 && counts[0] == counts[1] && counts[0] + 2 == 2 * (counts[2] - 2)) { MaxValue = list[2][counts[2] - 2]; type = "FEI2:" + listCount + ":" + MaxValue; } } else if (firstIndex == secIndex - 1) { if ((listCount = checkListCount(list, 2, 0, counts[2] - 2)) == counts[2] - 2 && counts[0] == counts[1] && counts[0] + 2 == 2 * (counts[2] - 2)) { MaxValue = list[2][counts[2] - 3]; type = "FEI2:" + listCount + ":" + MaxValue; } } } if ((listCount = checkListCount(list, 2, 1, counts[2])) == counts[2] - 1 && 2 * counts[0] + 3 == 3 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } else if ((listCount = checkListCount(list, 2, 0, counts[2] - 1)) == counts[2] - 1 && 2 * counts[0] + 3 == 3 * (counts[2] - 1)) { MaxValue = list[2][counts[2] - 2];
type = "FEI1:" + listCount + ":" + MaxValue; } break; } } #endregion //当第 4 行牌的数量大于 2 的时候 #region if (counts[3] > 2) { if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2] && counts[0] + counts[1] + counts[3] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } } #endregion //当第 4 行牌的数量为 0,第三行牌的数量大于 0 #region if (counts[3] == 0 && counts[2] > 0) { if ((listCount = checkListCount(list, 2, 0, counts[2])) == counts[2]) { if (counts[0] == counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI0:" + listCount + ":" + MaxValue; } else if (counts[0] + counts[1] == 3 * counts[2]) { MaxValue = list[2][counts[2] - 1]; type = "FEI1:" + listCount + ":" + MaxValue; } else if (counts[0] + counts[1] == 4 * counts[2] && counts[0] == counts[1]) { MaxValue = list[2][counts[2] - 1]; type = "FEI2:" + listCount + ":" + MaxValue; } } if ((listCount = checkListCount(list, 2, 1, counts[2])) == counts[2] - 1 && counts[0] + counts[1] + 1 == 3 * (counts[2] - 1)) {
分享到:
收藏