📄 ddzdesk.cs
字号:
if (tmpPaiArray[i] == 4)
{
m4 = i;
}
if (tmpPaiArray[i] == 2)
{
m2++;
}
if (tmpPaiArray[i] == 1)
{
m1++;
}
}
if (m4 > 0 && m2 * 2 + m1 == 2)
{
for (int k = 0; k < paiArrayList.Count; k++)
{
int pai = int.Parse(paiArrayList[k].ToString());
if (m4 == (pai / 10) % 100)
{
return pai;
}
}
}
return 0;
}
// > 5 判断是否是单顺(莲子),此函数适合5-12张牌情况;(返回最小单牌,0 表示不是单顺)
private int IsOneTrain(string paistrlist)
{
ArrayList paiArrayList = new ArrayList(paistrlist.Split(','));
paiArrayList.Sort();
int m_nTypeValue = 0; //单牌的起始大小;
int counter = 0; //总牌张数;
counter = paiArrayList.Count;
if (counter < 5 || counter > 12)
return 0;
for (int i = 0; i < paiArrayList.Count; i++)
{
int m_ben = int.Parse(paiArrayList[i].ToString()) / 10;
if (m_ben >= 113) //有2 或 鬼直接返回
{
return 0;
}
if (i == 0)
{
m_nTypeValue = m_ben;
}
else
{
if (m_nTypeValue + i != m_ben) //判断是否比上一张大一
{
return 0;
}
}
}
return int.Parse(paiArrayList[0].ToString());
}
// > 6 判断是否是双顺(姊妹对);此函数适合6-20张牌情况;(返回最小牌,0 表示不是双顺)
private int IsTwoTrain(string paistrlist)
{
ArrayList paiArrayList = new ArrayList(paistrlist.Split(','));
paiArrayList.Sort();
int m_nTypeValue = 0; //单牌的起始大小;
int counter = 0; //总牌张数;
counter = paiArrayList.Count;
if (counter < 6 || counter > 20 || counter % 2 == 1)
return 0;
for (int i = 0; i < paiArrayList.Count; i++)
{
int m_ben = int.Parse(paiArrayList[i].ToString()) / 10;
if (m_ben >= 113) //有2 或 鬼直接返回
{
return 0;
}
if (i == 0)
{
m_nTypeValue = m_ben;
}
else
{
if (m_nTypeValue + i / 2 != m_ben) //判断比上一张大一或等于上一张(i为单数就等于,双数就大一)
{
return 0;
}
}
}
return int.Parse(paiArrayList[0].ToString());
}
// = 6 判断是否是飞机(不带牌);此函数适合6-18张牌情况;(返回最小顺牌,0 表示不是三顺)
private int Is33(string paistrlist)
{
ArrayList paiArrayList = new ArrayList(paistrlist.Split(','));
paiArrayList.Sort();
int counter = 0; //总牌张数;
counter = paiArrayList.Count;
if (counter < 6 || counter > 18)
return 0;
int m_startValue = 0; //三顺的起始牌
int[] tmpPaiArray = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //保存对应大小牌的张数
for (int i = 0; i < paiArrayList.Count; i++)
{
int pai = int.Parse(paiArrayList[i].ToString());
int index = (pai > 5000) ? (pai / 10) % 100 + 13 : (pai / 10) % 100; //判断大小鬼
tmpPaiArray[index]++;
}
for (int i = 1; i < tmpPaiArray.Length - 3; i++)
{
counter = 0;
if (tmpPaiArray[i] == 3)
{
counter++;
m_startValue = i;
for (int j = i + 1; j < tmpPaiArray.Length; j++) //从表第i+1项开始扫描;
{
if (tmpPaiArray[j] == 3)
{
counter++;
}
else
{
for (int k = j; k < tmpPaiArray.Length; k++)
{
if (tmpPaiArray[k] != 0)
{
counter++;
return 0;
}
}
if (counter > 1)
{
for (int k = 0; k < paiArrayList.Count; k++)
{
int pai = int.Parse(paiArrayList[k].ToString());
if (m_startValue == (pai / 10) % 100)
{
return pai;
}
}
}
break;
}
}
return 0;
}
else if(tmpPaiArray[i] != 0)
{
return 0;
}
}
return 0;
}
// = 6 判断是否是飞机(带牌);此函数适合6-20张牌情况;(返回最小顺牌,0 表示不是三顺) ______ 该算法包含了 Is33
private int Is33_Tail(string paistrlist)
{
ArrayList paiArrayList = new ArrayList(paistrlist.Split(','));
paiArrayList.Sort();
int counter = 0; //总牌张数;
counter = paiArrayList.Count;
if (counter < 6 || counter > 20)
return 0;
int m_startValue = 0; //三顺的起始牌
int[] tmpPaiArray = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //保存对应大小牌的张数
for (int i = 0; i < paiArrayList.Count; i++)
{
int pai = int.Parse(paiArrayList[i].ToString());
int index = (pai > 5000) ? (pai / 10) % 100 + 13 : (pai / 10) % 100; //判断大小鬼
tmpPaiArray[index]++;
}
for (int i = 1; i < tmpPaiArray.Length - 3; i++)
{
int m1 = 0;
counter = 0;
if (tmpPaiArray[i] > 2)
{
if (tmpPaiArray[i] > 3) m1++;
counter++;
m_startValue = i;
for (int j = i + 1; j < tmpPaiArray.Length; j++) //从表第i+1项开始扫描;
{
if (tmpPaiArray[j] > 2 && j < tmpPaiArray.Length - 3)
{
if (tmpPaiArray[j] > 3) m1++;
counter++;
i++;
}
else
{
if (counter < 2) break;
int m2 = 0, m3 = 0, m4 = 0;
int mz = m1;
#region 统计不连续的牌张
for (int k = j; k < tmpPaiArray.Length; k++)
{
if (tmpPaiArray[k] == 1)
{
m1++;
}
else if (tmpPaiArray[k] == 2)
{
m2++;
}
else if (tmpPaiArray[k] == 3)
{
m3++;
}
else if (tmpPaiArray[k] == 4)
{
m4++;
}
}
for (int k = 1; k < m_startValue; k++)
{
if (tmpPaiArray[k] == 1)
{
m1++;
}
else if (tmpPaiArray[k] == 2)
{
m2++;
}
else if (tmpPaiArray[k] == 3)
{
m3++;
}
else if (tmpPaiArray[k] == 4)
{
m4++;
}
}
#endregion
if (counter == m1 + m2 * 2 + m3 * 3 + m4 * 4 ||
(counter == m2 + m4 * 2 && m1 == 0 && m3 == 0) ||
(counter == 3 && mz == 1 && m1 + m2 + m3 + m4 == mz && tmpPaiArray[m_startValue + 1] == 3) ||
m1 + m2 + m3 + m4 + mz == 0 ||
(counter == 5 && mz == 1 && m1 + m2 + m3 + m4 == mz && (tmpPaiArray[m_startValue] == 4 || tmpPaiArray[i] == 4))
)
{
for (int k = 0; k < paiArrayList.Count; k++)
{
int pai = int.Parse(paiArrayList[k].ToString());
if (m_startValue == (pai / 10) % 100)
{
return pai;
}
}
}
break;
}
}
m_startValue = 0;
}
}
return 0;
}
// = 8 判断是否是四带两对;
private int Is4_22(string paistrlist)
{
ArrayList paiArrayList = new ArrayList(paistrlist.Split(','));
paiArrayList.Sort();
int counter = 0; //总牌张数;
counter = paiArrayList.Count;
if (counter != 8)
return 0;
int[] tmpPaiArray = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //保存对应大小牌的张数
for (int i = 0; i < paiArrayList.Count; i++)
{
int pai = int.Parse(paiArrayList[i].ToString());
int index = (pai > 5000) ? (pai / 10) % 100 + 13 : (pai / 10) % 100; //判断大小鬼
tmpPaiArray[index]++;
}
int m4 = 0, m2 = 0;
for (int i = 1; i < tmpPaiArray.Length; i++)
{
if (tmpPaiArray[i] == 4)
{
m4 = i;
}
if (tmpPaiArray[i] == 2)
{
m2++;
}
}
if (m4 > 0 && m2 == 2)
{
for (int k = 0; k < paiArrayList.Count; k++)
{
int pai = int.Parse(paiArrayList[k].ToString());
if (m4 == (pai / 10) % 100)
{
return pai;
}
}
}
return 0;
}
#endregion
/*检查出牌的逻辑合法性
* 函数介绍:检查出牌的逻辑合法性;
* 输入参数:paistrlist 牌值字符串,中间用逗号隔开,不出就是 "pass" 字符;
* 返回值 : 匹配成功返回1,不成功返回0;
*/
private int CheckChuPai(string paistrlist)
{
paiMin = 0; //牌型最小值
paiType = PaiType.Not; //牌型
chuPaiCount = paistrlist.Length / 5 + 1; //牌总张数
#region 1到4张牌的判断 (包括 Pass)
if (paistrlist == "pass")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -