Files
youlegames/codes/games/server/class/class.card2.js
2026-02-04 23:47:45 +08:00

743 lines
27 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*===================== cls_card2: 牌的基础类 ======================
扑克牌的统一定义:
1单张牌的定义是一个长度为14的数组 [Id, Flower, Number, ArithF, ArithN, Score, Deal, Start, Play, Index, Over, Tag1, Tag2, Tag3]
第一位Id牌的绝对id即数组下标从0开始计数。
第二位Flower牌的物理花色5:王 4:黑桃 3:红心 2:梅花 1:方块。
第三位Number牌的物理大小1:A 2:2 ... 9:9 10:10 11:J 12:Q 13:K 53:小王 54:大王。
第四位ArithF牌的算法花色区别于物理花色用于牌型计算和比较牌的大小。
要求是大于0的整数不能等于0或小于0默认等于物理花色。
第五位ArithN牌的算法大小区别于物理大小用于牌型计算和比较牌的大小。
要求是大于0的整数不能等于0或小于0默认等于物理大小。
第六位Score牌的分值如5、10、K。
第七位Deal发牌状态。
-2规则去除的牌
-1未发的牌底牌
>=0发牌发到谁手上即座位号。
第八位Start开局状态开局时牌在谁手上与座位编号对应。
第九位Play出牌状态。
-2埋的牌
-1未出的牌手上的牌
>=0牌是第几轮出出去的从0开始计数。
第十位Index本轮中的出牌顺序号从0开始计数。
第十一位Over牌局结束时被谁得到与座位编号对应。
第十二位Tag1扩展属性1。
第十三位Tag2扩展属性2。
第十四位Tag3扩展属性3。
2基础牌型的统一定义
所有基础牌型都由两个值表示tong表示一样的牌shun表示连续的牌。
单张tong=1shun=1
对子tong=2shun=1
两连对tong=2shun=2
三连对tong=2shun=3
三个tong=3shun=1
飞机tong=3shun=2
四个tong=4shun=1
五连顺tong=1shun=5
六连顺tong=1shun=6
其他基础牌型以此类推
注意:
1此牌类是基础扑克牌类、通用扑克牌类各子游戏可以直接使用也可以继承此基础类后下编写自己的牌类。
2子游戏开发人员不能修改该文件。
3访问牌的属性时要求使用Get和Set方法不能直接通过数组下标的形式访问。
===================================================================*/
var cls_card2 = {
//新建一张牌
New: function(id){
return this.declare(id);
},
//牌的数据定义
declare: function(id){
//id转物理花色
var IdToFlower = function(cardid){
var yu = cardid % 54;
if (yu == 52 || yu == 53){
return 5;
}
return parseInt(yu / 13) + 1;
}
//id转物理数值
var IdToNumber = function(cardid){
var yu = cardid % 54;
if (yu == 52){
return 53;
}
if (yu == 53){
return 54;
}
return yu % 13 + 1;
}
var o_card = [];
o_card[0] = id;
o_card[1] = IdToFlower(id);
o_card[2] = IdToNumber(id);
o_card[3] = o_card[1];
o_card[4] = o_card[2];
o_card[5] = null;
o_card[6] = null;
o_card[7] = null;
o_card[8] = null;
o_card[9] = null;
o_card[10] = null;
o_card[11] = null;
o_card[12] = null;
o_card[13] = null;
return o_card;
},
//牌的id整型只读
GetId: function(o_card){
return o_card[0];
},
//牌的物理花色,整型,只读
GetFlower: function(o_card){
return o_card[1];
},
//牌的物理大小,整型,只读
GetNumber: function(o_card){
return o_card[2];
},
//牌的算法花色,整型
GetArithF: function(o_card){
return o_card[3];
},
SetArithF: function(o_card, value){
o_card[3] = value;
},
//牌的算法大小,整型
GetArithN: function(o_card){
return o_card[4];
},
SetArithN: function(o_card, value){
o_card[4] = value;
},
//牌的分值,整型
GetScore: function(o_card){
return o_card[5];
},
SetScore: function(o_card, value){
o_card[5] = value;
},
//发牌状态,整型
GetDeal: function(o_card){
return o_card[6];
},
SetDeal: function(o_card, value){
o_card[6] = value;
},
//开局状态,整型
GetStart: function(o_card){
return o_card[7];
},
SetStart: function(o_card, value){
o_card[7] = value;
},
//出牌状态,整型
GetPlay: function(o_card){
return o_card[8];
},
SetPlay: function(o_card, value){
o_card[8] = value;
},
//出牌顺序,整型
GetIndex: function(o_card){
return o_card[9];
},
SetIndex: function(o_card, value){
o_card[9] = value;
},
//结束时被谁得到,整型
GetOver: function(o_card){
return o_card[10];
},
SetOver: function(o_card, value){
o_card[10] = value;
},
//扩展属性
GetTag1: function(o_card){
return o_card[11];
},
SetTag1: function(o_card, value){
o_card[11] = value;
},
GetTag2: function(o_card){
return o_card[12];
},
SetTag2: function(o_card, value){
o_card[12] = value;
},
GetTag3: function(o_card){
return o_card[13];
},
SetTag3: function(o_card, value){
o_card[13] = value;
},
/*
以下提供几个针对牌数组的基础算法,这两个方法是基于牌的算法花色和算法大小实现的,各子游戏在调用前需要将牌的算法花色和算法大小先设置好。
设置算法花色的原则是:
1如果对花色没要求则需要将所有牌的算法花色统一。比如斗地主中的五连顺是任何花色都可以一起连顺子的则需要将所有牌的算法花色全部设置成0表示都是同一花色然后在同一花色下取顺子。
2如果对花色有要求则需要根据实际情况区分算法花色。比如升级中的两连对是指同一花色下的两连对则需要将算法花色设置成不同的值表示不同算法花色之间是不能组成两连对的。
设置算法大小的原则是:算法大小即可表示是否连牌,也可表示牌的大小关系。
1设置算法大小时要求做到数字连续则表示是连牌。比如A的物理大小是1K的物理大小是131和13是不连续的此时需要将A的算法大小设置成14将K的算法大小设置成1314和13是连续的表示A和K可以连牌。再比如王牌和A是不能作为连牌出现的则需要将王的算法大小设置成16将A的算法大小设置成1416和14不是连续的表示王和A不能连牌。
2设置算法大小时要求做到数字大小则表示是牌的大小。比如A的物理大小是1K的物理大小是131比13小但A比K大此时需要将A的算法大小设置成14将K的算法大小设置成1314比13大表示A比K大。再比如王牌比A大则需要将王的算法大小设置成16将A的算法大小设置成1416大于14表示王比A大。
*/
//根据算法花色筛选牌
FilterCardListByArithF: function(o_cardlist, ArithF){
/*参数说明
o_cardlist需要进行筛选的牌数组
ArithF要筛选的算法花色默认不筛选
返回值:筛选后的牌数组*/
var result = [];
for (var i = 0; i < o_cardlist.length; i++) {
var o_card = o_cardlist[i];
var card_ArithF = this.GetArithF(o_card);
if (!ArithF || card_ArithF == ArithF) {
result.push(o_cardlist[i]);
}
}
return result;
},
//根据算法大小筛选牌
FilterCardListByArithN: function(o_cardlist, min_ArithN, max_ArithN){
/*参数说明
o_cardlist需要进行筛选的牌数组
min_ArithN要筛选的算法大小最小值>=,默认不限制
max_ArithN要筛选的算法大小最大值<=,默认不限制
返回值:筛选后的牌数组*/
var result = [];
for (var i = 0; i < o_cardlist.length; i++) {
var o_card = o_cardlist[i];
var card_ArithN = this.GetArithN(o_card);
if ((!min_ArithN || card_ArithN >= min_ArithN) &&
(!max_ArithN || card_ArithN <= max_ArithN)) {
result.push(o_cardlist[i]);
}
}
return result;
},
//根据算法大小对牌数组进行排序(冒泡排序法)
SortCardList: function(o_cardlist, options){
/*参数说明
o_cardlist: 需要进行排序的牌数组
options : 排序选项长度为2的数组结构为[大小排序方向,花色排序方向]
第一位: 算法大小排序方向0-从小到大排序 1-从大到小排序默认为0。
第二位: 物理花色排序方向算法大小相同时是否再按物理花色排序默认为0。
0-根据算法大小排序方向默认选择物理花色排序方向,
options[0]=0时物理花色默认按“方块->梅花->红心->黑桃”排序;
options[0]=1时物理花色默认按“黑桃->红心->梅花->方块”排序。
1-不按物理花色排序在o_cardlist中是什么顺序就什么顺序。
2-按物理花色从小到大,方块->梅花->红心->黑桃
3-按物理花色从大到小,黑桃->红心->梅花->方块
返回值: 排序后的牌数组*/
var ArithN_direct = 0; //算法大小排序方向
var Flower_direct = 0; //物理花色排序方向
if (options) {
ArithN_direct = parseInt(options[0]);
Flower_direct = parseInt(options[1]);
}
if (!Flower_direct){
if (ArithN_direct) {
//算法大小从大到小排序时,默认按“黑桃->红心->梅花->方块”排序
Flower_direct = 3;
} else {
//算法大小从小到大排序时,默认按“方块->梅花->红心->黑桃”排序
Flower_direct = 2;
}
}
//j与j+1互换位置
var doChangej = function(){
var tmp = o_cardlist[j];
o_cardlist[j] = o_cardlist[j + 1];
o_cardlist[j + 1] = tmp;
}
for (var i = 0; i < o_cardlist.length; i++){
for (var j = 0; j < o_cardlist.length - i - 1; j++){
var ArithN_j = this.GetArithN(o_cardlist[j]);
var ArithN_j1 = this.GetArithN(o_cardlist[j + 1]);
if (ArithN_direct == 0 && ArithN_j > ArithN_j1){
//从小到大排序
doChangej();
continue;
}
if (ArithN_direct == 1 && ArithN_j < ArithN_j1){
//从大到小排序
doChangej();
continue;
}
if (ArithN_j == ArithN_j1){
//算法大小相同时
if (Flower_direct == 1){
//不按物理花色排序
continue;
}
var Flower_j = this.GetFlower(o_cardlist[j]);
var Flower_j1 = this.GetFlower(o_cardlist[j + 1]);
if (Flower_direct == 2 && Flower_j > Flower_j1){
//按“方块->梅花->红心->黑桃”排序
doChangej();
continue;
}
if (Flower_direct == 3 && Flower_j < Flower_j1){
//按“黑桃->红心->梅花->方块”排序
doChangej();
continue;
}
}
}
}
return o_cardlist;
},
//获取指定牌型(基础牌型)的各种组合(只组合,无排列)
GetCardListByCardType: function(o_cardlist, cardtype, options){
/*参数说明
o_cardlist:在这些牌中获取指定牌型,必须是经过了从小到大排序后的牌数组。
cardtype :目标牌型长度为2的数组结构为[同,顺]。
例如单张为[1,1],对子为[2,1],五连顺为[1,5]。
options :取牌选项长度为4的数组结构为[结果数量,取牌方向,拆牌标志,一次标志]
第一位:结果数量0-获取所有可能的结果,>0要取的结果数量默认为0。
比如,牌数组为[2,3,5,7]时,
当options[0]=0时则取单张的结果为2357
当options[0]=1时则取单张的结果为2
当options[0]=3时则取单张的结果为235。
第二位:取牌方向0-从小到大取结果1-从大到小取结果默认为0。
第三位:拆牌标志0-不拆牌1-拆牌默认为0。
比如,牌数组为[2,2,3,5,5,5,7]
当options[2]=0时则取单张时会不取对子的牌和三张的牌即结果为37
当options[2]=1时则取单张时会拆掉对子的牌和三张的牌即结果为2357。
第四位:一次标志0-相同大小的牌只取一次1-取所有情况默认为0。
比如,牌数组为[红心2, 黑桃2, 方块3, 方块5, 红心5, 黑桃5, 方块7]
当options[3]=0时则取单张的结果为红心2, 方块3, 方块5, 方块7
当options[3]=1时则取单张时结果为红心2, 黑桃2, 方块3, 方块5, 红心5, 黑桃5, 方块7。
返回值:满足牌型要求的牌组合数组。
格式如
[
[o_card, o_card, o_card, ...],
[o_card, o_card, o_card, ...],
[o_card, o_card, o_card, ...],
...
]
注意统一用第一张牌的算法大小值表示牌型大小比如34567是顺子56789也是顺子用3表示34567顺子的大小用5表示56789顺子的大小5大于3表示56789的顺子比34567的顺子大*/
var cardtype_tong = parseInt(cardtype[0]); //牌型-同
var cardtype_shun = parseInt(cardtype[1]); //牌型-顺
var options_count = 0; //结果数量
var options_direct= 0; //取牌方向
var options_split = 0; //拆牌标志
var options_once = 0; //一次标志
if (options){
options_count = parseInt(options[0]);
options_direct= parseInt(options[1]);
options_split = parseInt(options[2]);
options_once = parseInt(options[3]);
}
//将牌按大小分组,即相同大小的牌归为一组。如,将[2,2,3,5,5,5,7]这样的牌数组转成[[2,2],[3],[5,5,5],[7]]
var SameGroupList = [];
var SameGroup = [];
for (var i = 0; i < o_cardlist.length; i++){
var o_card = o_cardlist[i];
if (SameGroup.length == 0){
SameGroup.push(o_card);
} else {
var card_ArithN = this.GetArithN(o_card);
var SameGroup_ArithN = this.GetArithN(SameGroup[0]);
if (card_ArithN == SameGroup_ArithN){
SameGroup.push(o_card);
} else {
SameGroupList.push(SameGroup);
SameGroup = [];
SameGroup.push(o_card);
}
}
}
if (SameGroup.length > 0){
SameGroupList.push(SameGroup);
}
//将牌分组按牌型的“同”获取各自的组合。例如,将[[2,2],[3],[5,5,5],[7]]这样的牌分组按“同”等于2转成[[[2,2]], [[方5,梅5],[方5,红5],[梅5,红5]]]
var TongGroupList = [];
for (var i = 0; i < SameGroupList.length; i++){
if (SameGroupList[i].length < cardtype_tong){
// TongGroupList.push([]);
continue;
}
if (SameGroupList[i].length == cardtype_tong){
TongGroupList.push([SameGroupList[i]]);
continue;
}
if (SameGroupList[i].length > cardtype_tong){
if (!options_split){ //不允许拆牌
// TongGroupList.push([]);
continue;
}
if (!options_once){ //同样大小的牌只取一次
TongGroupList.push([SameGroupList[i].slice(0, cardtype_tong)]);
} else {
TongGroupList.push(min_CombineInAry(SameGroupList[i], cardtype_tong));
}
}
}
//返回结果
var resultlist = [];
var ShunGroup = [];
//检查ShunGroup是否是连顺如果是连顺则在ShunGroup取结果保存到resultlist中
var check_return_ShunGroup = function(){
var isShun = true;
for (var j = 0; j < ShunGroup.length; j++){
if (ShunGroup[j].length == 0) {
isShun = false;
break;
}
if (j > 0) {
var j1_ArithN = this.GetArithN(ShunGroup[j-1][0][0]);
var j_ArithN = this.GetArithN(ShunGroup[j][0][0]);
//相减等于1表示是顺
if (j_ArithN - j1_ArithN != 1){
isShun = false;
break;
}
}
}
if (!isShun){
return false;
}
var result = min_CombineByArys(ShunGroup);
for (var j = 0; j < result.length; j++) {
var temp = [];
for (var k = 0; k < result[j].length; k++) {
temp = temp.concat(result[j][k]);
}
resultlist.push(temp);
if (options_count && resultlist.length >= options_count) {
//达到了要取的结果数量
return true;
}
}
return false;
}.bind(this);
//按牌型的“顺”获取符合要求的结果
if (!options_direct){
//从小到大取结果
for (var i = 0; i <= TongGroupList.length - cardtype_shun; i++){
ShunGroup = TongGroupList.slice(i, i + cardtype_shun);
if (check_return_ShunGroup()){
return resultlist;
}
}
} else {
//从大到小取结果
for (var i = TongGroupList.length - cardtype_shun; i >= 0; i--){
ShunGroup = TongGroupList.slice(i, i + cardtype_shun);
if (check_return_ShunGroup()){
return resultlist;
}
}
}
return resultlist;
},
GetCardListByCardTypeA: function(o_cardlist, cardtype, options, min_ArithN, max_ArithN){
/*参数说明
o_cardlist:同GetCardListByCardType中的参数说明。
cardtype :同GetCardListByCardType中的参数说明。
options :同GetCardListByCardType中的参数说明。
min_ArithN:同FilterCardListByArithN中的参数说明。
max_ArithN:同FilterCardListByArithN中的参数说明。
返回值同GetCardListByCardType中的参数说明。*/
var cardlist = this.FilterCardListByArithN(o_cardlist, min_ArithN, max_ArithN);
return this.GetCardListByCardType(cardlist, cardtype, options);
},
GetCardListByCardTypeB: function(o_cardlist, cardtype, options, ArithF, min_ArithN, max_ArithN){
/*参数说明
o_cardlist:可以是未排序的牌数组,该函数会实现排序。
cardtype :同GetCardListByCardType中的参数说明。
options :同GetCardListByCardType中的参数说明。
ArithF :同FilterCardListByArithF中的参数说明。
min_ArithN:同FilterCardListByArithN中的参数说明。
max_ArithN:同FilterCardListByArithN中的参数说明。
返回值同GetCardListByCardType中的参数说明。*/
var cardlist = this.FilterCardListByArithF(o_cardlist, ArithF);
this.SortCardList(cardlist);
cardlist = this.FilterCardListByArithN(cardlist, min_ArithN, max_ArithN);
return this.GetCardListByCardType(cardlist, cardtype, options);
},
//获取指定牌型(扩展牌型)的一种组合(只取一种组合)
GetCardListByExtendCardTypeA: function(o_cardlist, cardtypelist){
/*参数说明
o_cardlist :同GetCardListByCardTypeA中的参数说明。
cardtypelist:扩展牌型和取牌选项。
结构为[
[cardtype, options, min_ArithN, max_ArithN],
[cardtype, options, min_ArithN, max_ArithN],
[cardtype, options, min_ArithN, max_ArithN]
]
其中cardtype、options、min_ArithN、max_ArithN同GetCardListByCardTypeA中的参数说明。
例如3带1cardtypelist=[
[[3,1], [1,x,x,x], min_ArithN, max_ArithN],
[[1,1], [1,x,x,x], min_ArithN, max_ArithN]
]
3带2cardtypelist=[
[[3,1], [1,x,x,x], min_ArithN, max_ArithN],
[[1,1], [1,x,x,x], min_ArithN, max_ArithN],
[[1,1], [1,x,x,x], min_ArithN, max_ArithN]
]
3带1对cardtypelist=[
[[3,1], [1,x,x,x], min_ArithN, max_ArithN],
[[2,1], [1,x,x,x], min_ArithN, max_ArithN]
]
注意options中第一参数一定为1表示只取一个结果如果传的值不等于1也会按等于1处理。
返回值同GetCardListByCardTypeA中的参数说明。*/
var cardlist = o_cardlist;
var result = [];
for (var i = 0; i < cardtypelist.length; i++){
var cardtype = cardtypelist[i][0];
var options = cardtypelist[i][1];
if (options[0] != 1){
options[0] = 1;
}
var min_ArithN = cardtypelist[i][2];
var max_ArithN = cardtypelist[i][3];
var BaseCardGroup = this.GetCardListByCardTypeA(cardlist, cardtype, options, min_ArithN, max_ArithN);
if (BaseCardGroup.length == 0){
return [];
}
result = result.concat(BaseCardGroup[0]);
cardlist = min_ary_deduct(cardlist, BaseCardGroup[0]);
}
return [result];
},
//获取牌数组的最大牌型
GetMaxCardTypeByCardList: function(o_cardlist, option){
/*参数说明
o_cardlist: 必须是经过了从小到大排序后的牌数组。
option: 选项默认为0
0-返回"同"最多的最大牌型(如果"同"相同则取"顺"最多的,如果"顺"也相同则取"值"最大的)
1-返回"顺"最多的最大牌型(如果"顺"相同则取"同"最多的,如果"同"也相同则取"值"最大的)
返回值:结构为[cardtype, cardlist]。其中,
cardtype为基础牌型结构为[同,顺]
cardlist为满足cardtype的牌数组牌型相同时取最大值的牌。
例如当option=0时
牌数组为[3,7,7,7,9,9,J,J,J,Q,Q] 返回值为[[3,1], [J,J,J]]
牌数组为[3,7,7,7,8,8,8,9,9,J,J,J,Q,Q] 返回值为[[3,2], [7,7,7,8,8,8]]
牌数组为[3,7,7,7,8,8,8,9,9,J,J,J,Q,Q,Q],返回值为[[3,2], [J,J,J,Q,Q,Q]]
当option=1时
牌数组为[2,4,5,6,8,9,J,J,Q,Q,K] 返回值为[[1,3], [J,Q,K]]
牌数组为[2,4,4,5,5,6,6,8,9,J,J,Q,Q,K] 返回值为[[2,3], [4,4,5,5,6,6]]
牌数组为[2,4,4,5,5,6,6,8,9,J,J,Q,Q,K,K],返回值为[[3,2], [J,J,Q,Q,K,K]]*/
var result = [];
//将o_cardlist按大小分组。
//如,将[2,2,3,5,5,5,7]这样的牌数组转成[[2,2],[3],[5,5,5],[7]]
var changeto_SameGroupList = function(){
var SameGroupList = [];
var SameGroup = [];
for (var i = 0; i < o_cardlist.length; i++){
var o_card = o_cardlist[i];
if (SameGroup.length == 0){
SameGroup.push(o_card);
} else {
var card_ArithN = this.GetArithN(o_card);
var SameGroup_ArithN = this.GetArithN(SameGroup[0]);
if (card_ArithN == SameGroup_ArithN){
SameGroup.push(o_card);
} else {
SameGroupList.push(SameGroup);
SameGroup = [];
SameGroup.push(o_card);
}
}
}
if (SameGroup.length > 0){
SameGroupList.push(SameGroup);
}
return SameGroupList;
}.bind(this);
var SameGroupList = changeto_SameGroupList();
switch (option){
case 0: //取"同"最多的牌型 [A,2,2,3,4,4,5,5,7,7,8,8,9,9,J,J,Q,Q,K,K]
//检查ShunGroup是否是连顺
var check_ShunGroup_isShun = function(){
for (var j = 0; j < ShunGroup.length; j++){
if (ShunGroup[j].length == 0) {
return false;
}
if (j > 0) {
var j1_ArithN = this.GetArithN(ShunGroup[j-1][0]);
var j_ArithN = this.GetArithN(ShunGroup[j][0]);
//相减等于1表示是顺
if (j_ArithN - j1_ArithN != 1){
return false;
}
}
}
return true;
}.bind(this);
result[0] = [SameGroupList[0].length, 1];
result[1] = SameGroupList[0];
for (var i = 1; i < SameGroupList.length; i++) {
if (SameGroupList[i].length > result[0][0]){
result[0] = [SameGroupList[i].length, 1];
result[1] = SameGroupList[i];
} else if (SameGroupList[i].length == result[0][0]){
var ArithN_i = this.GetArithN(SameGroupList[i][0]);
var ArithN_r = this.GetArithN(result[1][result[1].length - 1]);
if (ArithN_i - ArithN_r == 1){ //相减等于1表示是顺
result[0][1] = result[0][1] + 1;
result[1] = result[1].concat(SameGroupList[i]);
} else {
if (i + result[0][1] <= SameGroupList.length){
var ShunGroup = SameGroupList.slice(i, i + result[0][1]);
var isShun = check_ShunGroup_isShun();
if (isShun){
var check_Tong = true;
for (var j = 1; j < ShunGroup.length; j++) {
if (ShunGroup[j].length != result[0][0]){
check_Tong = false;
break;
}
}
if (check_Tong) {
result[1] = [];
for (var j = 0; j < ShunGroup.length; j++) {
result[1] = result[1].concat(ShunGroup[j]);
}
i = i + result[0][1] - 1;
}
}
}
}
}
}
break;
case 1: //取"顺"最多的牌型 [A,3,4,6,8,8,9,9,J,J,J,Q,Q,Q]
//将SameGroupList转成ShunGroupList
//如,将[[2,2],[3],[5,5,5],[6,6],[7],[9,9]]转成[[[2,2],[3]], [[5,5,5],[6,6],[7]], [[9,9]]]
var changeto_ShunGroupList = function(){
var ShunGroupList = [];
for (var i = 0; i < SameGroupList.length; i++) {
var ArithN_i = this.GetArithN(SameGroupList[i][0]);
var isFound = false;
for (var j = 0; j < ShunGroupList.length; j++) {
var ArithN_j = this.GetArithN(ShunGroupList[j][ShunGroupList[j].length - 1][0]);
if (ArithN_i - ArithN_j == 1) {
ShunGroupList[j].push(SameGroupList[i]);
isFound = true;
break;
}
}
if (!isFound){
ShunGroupList.push([SameGroupList[i]]);
}
}
return ShunGroupList;
}.bind(this);
//获取ShunGroup中最小的"同"数
var get_ShunGroup_minTong = function(){
var min_Tong = ShunGroup[0].length;
for (var j = 1; j < ShunGroup.length; j++) {
if (ShunGroup[j].length < min_Tong) {
min_Tong = ShunGroup[j].length;
}
}
return min_Tong;
}.bind(this);
//根据ShunGroup的min_Tong设置result
var set_result_byShunGroup_byMinTong = function(){
result[0] = [min_Tong, ShunGroup.length];
result[1] = [];
for (var j = 0; j < ShunGroup.length; j++) {
result[1] = result[1].concat(ShunGroup[j].slice(0, min_Tong));
}
}.bind(this);
var ShunGroupList = changeto_ShunGroupList();
//在ShunGroupList中取最长的"顺"
for (var i = 0; i < ShunGroupList.length; i++) {
var ShunGroup = ShunGroupList[i];
var min_Tong = get_ShunGroup_minTong();
if (i == 0){
set_result_byShunGroup_byMinTong();
} else {
if (ShunGroup.length > result[0][1]) {
set_result_byShunGroup_byMinTong();
} else if (ShunGroup.length == result[0][1]) {
if (min_Tong >= result[0][0]){
set_result_byShunGroup_byMinTong();
}
}
}
}
break;
}
return result;
},
GetMaxCardTypeByCardListA: function(o_cardlist){
/*参数说明 o_cardlist:可以是未排序的牌数组,该函数会实现排序。*/
this.SortCardList(o_cardlist);
return this.GetMaxCardTypeByCardList(o_cardlist);
},
//新建单张牌类
NewClass: function(){
var cls = {};
cls.New = cls_card2.New;
cls.declare = cls_card2.declare;
cls.GetId = cls_card2.GetId;
cls.GetFlower = cls_card2.GetFlower;
cls.GetNumber = cls_card2.GetNumber;
cls.GetArithF = cls_card2.GetArithF;
cls.SetArithF = cls_card2.SetArithF;
cls.GetArithN = cls_card2.GetArithN;
cls.SetArithN = cls_card2.SetArithN;
cls.GetScore = cls_card2.GetScore;
cls.SetScore = cls_card2.SetScore;
cls.GetDeal = cls_card2.GetDeal;
cls.SetDeal = cls_card2.SetDeal;
cls.GetStart = cls_card2.GetStart;
cls.SetStart = cls_card2.SetStart;
cls.GetPlay = cls_card2.GetPlay;
cls.SetPlay = cls_card2.SetPlay;
cls.GetIndex = cls_card2.GetIndex;
cls.SetIndex = cls_card2.SetIndex;
cls.GetOver = cls_card2.GetOver;
cls.SetOver = cls_card2.SetOver;
cls.GetTag1 = cls_card2.GetTag1;
cls.SetTag1 = cls_card2.SetTag1;
cls.GetTag2 = cls_card2.GetTag2;
cls.SetTag2 = cls_card2.SetTag2;
cls.GetTag3 = cls_card2.GetTag3;
cls.SetTag3 = cls_card2.SetTag3;
cls.FilterCardListByArithF = cls_card2.FilterCardListByArithF;
cls.FilterCardListByArithN = cls_card2.FilterCardListByArithN;
cls.SortCardList = cls_card2.SortCardList;
cls.GetCardListByCardType = cls_card2.GetCardListByCardType;
cls.GetCardListByCardTypeA = cls_card2.GetCardListByCardTypeA;
cls.GetCardListByCardTypeB = cls_card2.GetCardListByCardTypeB;
cls.GetCardListByExtendCardTypeA = cls_card2.GetCardListByExtendCardTypeA;
cls.GetMaxCardTypeByCardList = cls_card2.GetMaxCardTypeByCardList;
cls.GetMaxCardTypeByCardListA = cls_card2.GetMaxCardTypeByCardListA;
return cls;
}
}