- {
- if(intArray[0]==intArray[lengh-1])
- {
- return lengh;
- }
- if (intArray[0]==intArray[lengh-2]&&lengh==4)
- {
- return THREE_ONE_CARD;
- }
- }
出牌张数>=5
当出牌张数大于5张时,所组成的牌型就比较的复杂了,可以有连牌,连对,飞机,4带2等一系列牌型。
我们先来分析一下每种牌型组成的情况
连牌:由所有的单牌组成
连队:由所有的对子组成
飞机:由3个+对子,或者3个,或者3个+单张
4带2:4个+2张单牌,4个+2对牌,4个+1对牌
写一个计算数组中所有值是否为连续的方法。我们假设这个函数名叫做CheckContinuous,如果全连续返回true,否则返回false
下面是没种牌型的具体检查方法。
连牌牌型:if(CheckContinuous(出牌数组)==true)出牌数组中所有牌的牌值必须小于2
连队牌型:将出牌数组中的对子,挨个抽出,看是否还有剩余的牌,如果有剩余的牌就说明不能组成连队,则进行下面牌型的判断。如果没有剩余的牌,再根据判断连牌的方法来判断。(筛选条件:张数>=6张&&张数%2==0)
飞机和4带2就比较的复杂了,因为这2种牌型不像上面2种那样组成的牌比较单一,这2种牌型可以由很多种牌来组成。
接下来我们就可以定义一个结构体,来记录每种牌(单个,对子,3个,4个)出现的次数。最后我们只要根据结构体中每种牌出现的数量就很容易判断出到底是什么牌了。
struct CRAD_INDEX
{
vector <int > single_index;//记录单张的牌
vector<int> doble_index; //记录对子的牌
vector<int >three_index;//记录3张
vector<int> four_index;//记录张
}
飞机牌型:
我们把能组成飞机的所有牌型列举出来: 333444,33344456,3334445566,
通过一个遍历记录方法,上面结构体的值就变成这样了。
333444
single_index 空
doble_index 空three_index 3,4
four_index 空
33344456
single_index 5,6
doble_index 空three_index 3,4
four_index 空
3334445566
single_index 空
doble_index 5,6three_index 3,4
four_index 空
这3种飞机牌型都有一个共同点,three_index 中的数据必须为连续的并且four_index 必须为空。这个也是最开始筛选的条件之一,如果这个条件都不满足则直接返回。
如果上面个条件满足,接下来计算一下牌的数量就OK了
飞机不带:three_index .sziz()*3==出牌的数量&&single_index+doble_index ==0
飞机带1张 :three_index .sziz()*3+single_index.size()==出牌的数量&&doble_index.size()==0
飞机带1对:three_index .sziz()*3+doble_index.size()*2==出牌的数量&&single_index.size()==0
同样4带2也可以这样来分析
4带2牌型(牌张数%2==0)
还是像上面一样来列举出具体的牌型来判断
444423 444422 44442233
4个带单张
444423
single_index 2,3
doble_index 空three_index 空
four_index 4
444422
single_index 空
doble_index 2three_index 空
four_index 4
4个带2对
44442233
single_index 空
doble_index 2,3three_index 空
four_index 4
首先找出必须满足的条件:four_index .size()必须等于1,并且出牌张数%2==0,并且three_index.size()==0
如果这个条件不满足则直接进行下面牌型的判断
如果满足就计算牌的张数
4带1
第一种情况: 带2张单牌
((four_index.size()==1&&single_index.size()==2)||(four_index.size()+single_index.size()*4==出牌的张数))
第二种情况 :带2对牌
((four_index.size()==1&&doble_index.size()==1)||(four_index.size()*2+single_index.size()*4==出牌的张数))
4带2对
((four_index.size()==1&&doble_index.size()==2)||(four_index.size()*2+single_index.size()*4==出牌的张数))
- {
- if(intArray[0]==intArray[lengh-1])
- {
- return lengh;
- }
- if (intArray[0]==intArray[lengh-2]&&lengh==4)
- {
- return THREE_ONE_CARD;
- }
- }
出牌张数>=5
当出牌张数大于5张时,所组成的牌型就比较的复杂了,可以有连牌,连对,飞机,4带2等一系列牌型。
我们先来分析一下每种牌型组成的情况
连牌:由所有的单牌组成
连队:由所有的对子组成
飞机:由3个+对子,或者3个,或者3个+单张
4带2:4个+2张单牌,4个+2对牌,4个+1对牌
写一个计算数组中所有值是否为连续的方法。我们假设这个函数名叫做CheckContinuous,如果全连续返回true,否则返回false
下面是没种牌型的具体检查方法。
连牌牌型:if(CheckContinuous(出牌数组)==true)出牌数组中所有牌的牌值必须小于2
连队牌型:将出牌数组中的对子,挨个抽出,看是否还有剩余的牌,如果有剩余的牌就说明不能组成连队,则进行下面牌型的判断。如果没有剩余的牌,再根据判断连牌的方法来判断。(筛选条件:张数>=6张&&张数%2==0)
飞机和4带2就比较的复杂了,因为这2种牌型不像上面2种那样组成的牌比较单一,这2种牌型可以由很多种牌来组成。
接下来我们就可以定义一个结构体,来记录每种牌(单个,对子,3个,4个)出现的次数。最后我们只要根据结构体中每种牌出现的数量就很容易判断出到底是什么牌了。
struct CRAD_INDEX
{
vector <int > single_index;//记录单张的牌
vector<int> doble_index; //记录对子的牌
vector<int >three_index;//记录3张
vector<int> four_index;//记录张
}
飞机牌型:
我们把能组成飞机的所有牌型列举出来: 333444,33344456,3334445566,
通过一个遍历记录方法,上面结构体的值就变成这样了。
333444
single_index 空
doble_index 空three_index 3,4
four_index 空
33344456
single_index 5,6
doble_index 空three_index 3,4
four_index 空
3334445566
single_index 空
doble_index 5,6three_index 3,4
four_index 空
这3种飞机牌型都有一个共同点,three_index 中的数据必须为连续的并且four_index 必须为空。这个也是最开始筛选的条件之一,如果这个条件都不满足则直接返回。
如果上面个条件满足,接下来计算一下牌的数量就OK了
飞机不带:three_index .sziz()*3==出牌的数量&&single_index+doble_index ==0
飞机带1张 :three_index .sziz()*3+single_index.size()==出牌的数量&&doble_index.size()==0
飞机带1对:three_index .sziz()*3+doble_index.size()*2==出牌的数量&&single_index.size()==0
同样4带2也可以这样来分析
4带2牌型(牌张数%2==0)
还是像上面一样来列举出具体的牌型来判断
444423 444422 44442233
4个带单张
444423
single_index 2,3
doble_index 空three_index 空
four_index 4
444422
single_index 空
doble_index 2three_index 空
four_index 4
4个带2对
44442233
single_index 空
doble_index 2,3three_index 空
four_index 4
首先找出必须满足的条件:four_index .size()必须等于1,并且出牌张数%2==0,并且three_index.size()==0
如果这个条件不满足则直接进行下面牌型的判断
如果满足就计算牌的张数
4带1
第一种情况: 带2张单牌
((four_index.size()==1&&single_index.size()==2)||(four_index.size()+single_index.size()*4==出牌的张数))
第二种情况 :带2对牌
((four_index.size()==1&&doble_index.size()==1)||(four_index.size()*2+single_index.size()*4==出牌的张数))
4带2对
((four_index.size()==1&&doble_index.size()==2)||(four_index.size()*2+single_index.size()*4==出牌的张数))