根据前面一片博客传送门,算法介绍,这里来实现核心部分
中间用到的一些功能函数,大家自己搞定吧,我把核心算法po出来大家参考
一、数据结构设计c#
算法流程:轮流判断每一张牌是否符合要求
找出所有可以当将的牌
while(将牌没遍历完)
{
去除将牌,提取数组byte[] cardgroup
while(数组不为空)
{
取出第一张牌byte card = cardgroup[0];
确认牌张数 int count = GetCardCount(card);//功能函数
If(判断数组是不是空的)
{
如果是空的break
}
else
{
If(判断数组中是否含有顺子或者刻子(三张))
{
//根据张数处理
If(count == 1)
{
If(判断card能否组成顺子)
{
能就把这个顺子从牌组中删掉
}
else
{
break
}
}
If(count == 2)
{
If(判断card能否组成2个顺子)
{
能就把这2个顺子从牌组中删掉
}
else
{
break
}
}
If(count == 3)
{
If(判断card能否组成3个顺子)
{
能就把这3个顺子从牌组中删掉
}
else
{
不能就把这个刻子删掉
}
}
If(count == 4)
{
If(判断card能否组成4个顺子)
{
能就凑够12张了,一定可以胡
return true
}
else
{
If(能否拿出一张和后面的牌组成顺子)
{
能就把这个顺子和刻子都删掉
}
else
{
否则break
}
}
}
}
else
{
//数组不为空,没有顺,没有刻,一定没胡
如果没有break
}
}
}
数组为空或者while被break到这里
If(判断cardgroup是否为空(全部完整移除))
{
是就表示胡return true
}
}
二、实现
bool TingCard(byte[] JiangArray, byte[] Cards, int type){
byte[] cardgroup = Cards;
while (JiangCount < JiangNumber)
{
byte[] jiang = new byte[2];//两张一样的
jiang[0] = JiangArray[JiangCount];
jiang[1] = JiangArray[JiangCount];
JiangCount++;
cardgroup = GameLogic.DeleteArr(jiang, Cards);//DeleteItem(jiang, Cards);
if (cardgroup == null) return true;
cardgroup = GameLogic.SortCard1(cardgroup);//Sort(cardgroup);
while (!IsNilGrop(cardgroup))
{
if (IsHaveLine(cardgroup) || IsHaveThree(cardgroup))
{
byte card = cardgroup[0];
int cardcount = GetCardCount(card, cardgroup);
if (cardcount == 1)
{
byte [] line = GetLine(cardgroup,card,1);
if (line!= null)
{
cardgroup = GameLogic.DeleteArr(line, cardgroup);
}
else
{
break;
}
}
else if (cardcount == 2)
{
byte[] line = GetLine(cardgroup, card,2);
if (line != null)
{
cardgroup = GameLogic.DeleteArr(line, cardgroup);
cardgroup = GameLogic.DeleteArr(line, cardgroup);
}
else
{
break;
}
}
else if (cardcount == 3)
{
byte[] line = GetLine(cardgroup, card, 3);
if (line != null)
{
cardgroup = GameLogic.DeleteArr(line, cardgroup);
cardgroup = GameLogic.DeleteArr(line, cardgroup);
cardgroup = GameLogic.DeleteArr(line, cardgroup);
}
else
{
cardgroup = GameLogic.DeleteArr(new byte[] {card, card, card}, cardgroup);
}
}
else if (cardcount == 4)
{
byte[] line = GetLine(cardgroup, card, 4);
if (line != null) return true;
else
{
byte[] line1 = GetLine(cardgroup, card, 1);
if (line1 != null)
{
cardgroup = GameLogic.DeleteArr(line1, cardgroup);
cardgroup = GameLogic.DeleteArr(new byte[] { card, card, card }, cardgroup);
}
else
{
break;
}
}
}
}
else
{
break;
}
}
if (IsNilGrop(cardgroup))
{
return true;
}
}
return false;
}
只上了核心部分代码,这时候有的小伙伴会发现,当cardcount == 3的时候,如果可以组成3个顺子就直接把三个顺子删掉,如果出现其中一个要和其他牌组成顺子的话,会不会报错,放心吧不会的!这个特殊情况是不存在的,自己摆一摆就知道啦
后来自己发现了一个漏洞,就是没有考虑到添加完了有5张的情况,要加个break,不然会死循环