斗地主出牌算法
根据斗地主出牌规则.对玩家出的牌进行检验.判断是否符合出牌规则.
(关于斗地主的出牌规则网上有很多)
思路:将玩家的牌按升序排序.然后将牌进行拆分,分存在 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))
{