var panduan = function(shangjia,chupai){ //牌型,手牌,出的牌 var yici = 0; var can_play = 1;//判断出的牌是否能出 var paixing = [];//本次出牌牌型 var chupaipx0 = [];//同算法 var shangjiapai = [];//上家出的牌 var sjpshuzu = [];//上家的牌数组 var cpshuzu = [];//本次出牌数组 var zuidazha = 0; var shangjiapx = []; if (shangjia) { if ( shangjia.length>0) { shangjiapx = shangjia[0]; shangjiapai = game.xs_dapai[game.chu]; } } if ( game.people == 2) {//根据人数判断最大的炸 zuidazha = 14; } else { zuidazha = 15; } cpshuzu = cls_aset2_gp.CardIdsToCards(gp.pai, chupai);//获取打出牌的11位数组牌 cls_card2_gp.SortCardList(cpshuzu);//从小到大排序牌(以下都经过排序) chupai = cls_aset2_gp.CardsToCardIds(cpshuzu);//从小到大排序出牌的ID(以下都经过排序) chupaipx0=cls_card2_gp.GetMaxCardTypeByCardList(cpshuzu, 0);////返回"同"最多的最大牌型(如果"同"相同则取"顺"最多的,如果"顺"也相同则取"值"最大的) sjpshuzu = cls_aset2_gp.CardIdsToCards(gp.pai, shangjiapai); paixing=chupaipx0[0]; if(chupaipx0[0][0]==chupai.length && chupaipx0[0][0]<5) { paixing=chupaipx0[0];//同 }else if(chupaipx0[0][1] == chupai.length && chupai.length>=5) { paixing=chupaipx0[0];//顺子 }else if(chupaipx0[0][0]==2 && chupaipx0[1].length==chupai.length) { paixing=chupaipx0[0];//连对 }else if(chupaipx0[0][0]==3&&chupaipx0[0][1]>1&&chupai.length==chupaipx0[0][1]*5 && chupaipx0[1][chupaipx0[1].length-1][4] != 15){ paixing=chupaipx0[0];//飞机 }else if(chupaipx0[0][0]==3&&chupaipx0[0][1]>1&&chupai.length==chupaipx0[0][1]*3 && chupaipx0[1][chupaipx0[1].length-1][4] != 15){ paixing=chupaipx0[0];//飞机 }else if(chupaipx0[0][0]==3&&chupaipx0[0][1]==1&&chupai.length==chupaipx0[0][1]*5){ paixing=chupaipx0[0];//3带二 }else if(chupaipx0[0][0]==4&&chupaipx0[0][1]==1&&chupai.length==5){ paixing=chupaipx0[0];//3带二 paixing[0]=chupaipx0[0][0]-1; }else if(chupaipx0[0][0]==3&&chupaipx0[0][1]>=1&&chupai.length <= chupaipx0[0][1]*5 && chupai.length >= chupaipx0[0][1]*3 && game.pai.length == chupai.length){ paixing=chupaipx0[0];//3带1 }else if (chupaipx0[0][0] == 4 && chupaipx0[0][1] >= 1 && chupai.length > 4) {//有个炸弹 if (chupai.length !=game.pai.length) { if (chupai.length == 10) {//10张牌 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,2], [0,0,1,1], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,2]; }else { can_play = 0;//不能出 yici++; } }else if (chupai.length == 15) {//15张牌 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,3], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,3]; }else { can_play = 0;//不能出 yici++; } } else { can_play = 0;//不能出 yici++; } }else{ if (chupai.length >6) {//多余6张牌 if(chupai.length <=9){//飞机 2 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,2], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,2]; }else { can_play = 0;//不能出 yici++; } } else if (chupai.length <=12 && chupai.length >9) {//飞机 3 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,3], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,3]; }else { can_play = 0;//不能出 yici++; } } else if (chupai.length <= 15) {//飞机 3.4 if (shangjiapx[0] == 3 && shangjiapx[1] == 4) {//飞机 4 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,4], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,4]; }else { can_play = 0;//不能出 yici++; } }else if(shangjiapx[0] == 3 && shangjiapx[1] == 3) {//飞机 3 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,3], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,3]; }else { can_play = 0;//不能出 yici++; } }else { var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,3], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,3]; }else { var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,4], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,4]; }else { can_play = 0;//不能出 yici++; } } } }else if (chupai.length > 15) {//飞机 3.4 if (shangjiapx[0] == 3 && shangjiapx[1] == 4) {//飞机 4 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,4], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,4]; }else { can_play = 0;//不能出 yici++; } }else if(shangjiapx[0] == 3 && shangjiapx[1] == 5) {//飞机 3 var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,5], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,5]; }else { can_play = 0;//不能出 yici++; } }else { var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,5], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,5]; }else { var feiji = cls_card2_gp.GetCardListByCardTypeA(cls_card2_gp.SortCardList(cpshuzu,[0,0]), // 牌的类型 [所有可能,小到大,拆牌,取所有情况] 起始牌 [3,4], [0,0,1,0], null ,null); if(feiji.length){//如果有就是飞机 paixing = [3,4]; }else { can_play = 0;//不能出 yici++; } } } } else { can_play = 0;//不能出 yici++; } }else { can_play = 0;//不能出 yici++; } } } else { can_play = 0;//不能出 yici++; } if( shangjiapx && shangjiapx.length!=0)//上家出了牌 { if(chupai.length != shangjiapai.length)//判断出的牌的长度相同 { can_play = 0;//不能出 yici++; } if(paixing[0]!=shangjiapx[0]&&paixing[1]!=shangjiapx[1]&&yici == 0)//判断牌型是否与上家相同 { can_play = 0;//不能出 yici++; } if(paixing[0]==shangjiapx[0]&&paixing[1]==shangjiapx[1]&&yici == 0 && shangjiapai.length == paixing[0]*paixing[1])//未带牌的情况 { //判断牌型相同的第一张的算法大小 if(cls_card2_gp.GetArithN(cpshuzu[0]) >= cls_card2_gp.GetArithN(sjpshuzu[0]) + 1)// { can_play = 1;//能出 } else { can_play = 0;//不能出 yici++; } } else if(paixing[0]==shangjiapx[0]&&paixing[1]==shangjiapx[1] &&paixing[0]==3 &&shangjiapai.length > shangjiapx[0]*shangjiapx[1])//3带2比大小 { //判断牌型相同的第一张的算法大小 if (game.pai.length == chupai.length ) { if(cls_card2_gp.GetArithN(chupaipx0[1][0]) >= cls_card2_gp.GetArithN(cls_card2_gp.GetMaxCardTypeByCardList(sjpshuzu, 0)[1][0]) + 1) { can_play = 1;//能出 } else { can_play = 0;//不能出 yici++; } }else { if(chupai.length != shangjiapai.length)//判断出的牌的长度相同 { can_play = 0;//不能出 yici++; }else { if(cls_card2_gp.GetArithN(chupaipx0[1][0]) >= cls_card2_gp.GetArithN(cls_card2_gp.GetMaxCardTypeByCardList(sjpshuzu, 0)[1][0]) + 1) { can_play = 1;//能出 } else { can_play = 0;//不能出 yici++; } } } } } if(chupai.length == 2&&yici == 0)//长度为2只能为对子 { if(cls_card2_gp.GetArithN(cpshuzu[0]) != cls_card2_gp.GetArithN(cpshuzu[1])) { can_play = 0;//不能出 yici++; } } if(yici == 0) { for(var er = 0;er=2)//大于等于3的牌组中 如果有2 则不能出(顺子和连对) { if(cls_card2_gp.GetArithN(cpshuzu[er]) == 15) { can_play = 0;//不能出 yici++; } } else if(chupaipx0[0][0] == 1&& chupaipx0[1].length == chupai.length && chupai.length >= 5) { if(cls_card2_gp.GetArithN(cpshuzu[er]) == 15) { can_play = 0;//不能出 yici++; } } } } if(shangjiapx && shangjiapx.length!=0)//上家出牌 { if(chupai.length == 4)//判断炸弹是否能出 { var s=0; var zhadan = 0; for(var aaa = 0;aaa<=chupai.length - 1;aaa++) { if(cls_card2_gp.GetArithN(cpshuzu[0])==cls_card2_gp.GetArithN(cpshuzu[aaa])) { s++; { if(s==chupai.length) { //下家炸弹要比上家大或者比上家长 if (laizi_mun == 0) {//出真炸弹 if((cls_card2_gp.GetArithN(cpshuzu[0]) <= cls_card2_gp.GetArithN(sjpshuzu[0]))&&shangjiapx[0]==4&&shangjiapx[1] == 1) { if (game.laizi_bian[game.chu].length == 0) { can_play = 0;//不能出,炸弹大小小于上家 yici++; } else { can_play = 1; } }else { can_play = 1; } } else {//出假炸弹 if (shangjiapx[0]==4&&shangjiapx[1] == 1) {//上家也是炸 if((cls_card2_gp.GetArithN(cpshuzu[0]) > cls_card2_gp.GetArithN(sjpshuzu[0]))) { if (game.laizi_bian[game.chu].length == 0) {//上家真炸弹 can_play = 0;//不能出,炸弹大小小于上家 yici++; } else { can_play = 1; } }else { can_play = 0;//不能出,炸弹大小小于上家 yici++; } } else { can_play = 1; } } } } } } } if(chupai.length==3)//判断炸弹(无视牌型) { var s=0; for(var aaa = 0;aaa<=chupai.length - 1;aaa++) { if(cls_card2_gp.GetArithN(cpshuzu[0])==cls_card2_gp.GetArithN(cpshuzu[aaa])) { s++; { if(s==chupai.length && cls_card2_gp.GetArithN(cpshuzu[0]) == zuidazha)//判断为最大的炸 { if (shangjiapx[0]==4&&shangjiapx[1] == 1 && cls_card2_gp.GetArithN(sjpshuzu[0]) == zuidazha) {//上家出了最大炸 can_play = 0;//不能出,炸弹大小小于上家 yici++; }else { if (shangjiapx[0]==4&&shangjiapx[1] == 1 && game.laizi_bian[game.chu].length == 0 && laizi_mun > 0){ can_play = 0;//不能出,炸弹大小小于上家 yici++; }else { can_play = 1; } } } } } } } } if(chupai.length == 4)//判断炸弹是否能出 { var s=0; var zhadan = 0; for(var aaa = 0;aaa<=chupai.length - 1;aaa++) { if(cls_card2_gp.GetArithN(cpshuzu[0])==cls_card2_gp.GetArithN(cpshuzu[aaa])) { s++; { if(s==chupai.length) { if(cls_card2_gp.GetArithN(cpshuzu[0]) == 15) { can_play = 0;//不能出, yici++; }else if(cls_card2_gp.GetArithN(cpshuzu[0]) == 14 && game.people == 2){ can_play = 0;//不能出, yici++; } } } } } } var cppx = []; cppx[0] = chupai; cppx[1] = paixing; cppx[2] = chupaipx0[1]; if (can_play == 0 ) { cppx[0]=[]; cppx[1] = []; cppx[2] = []; }else { var iqas = 0; } return cppx; } var pd_laizi = function(chupai,laizi){//出的牌id,选的癞子牌 for(var a = 0;a= 3; i--) { cls_card2_gp.SetArithN(pais[laizi_weizhi[0]],i); var rr = cls_aset2.CardsToCardIds(pais); var keyichu = panduan(game.paixing,rr)[0]; var zd = panduan(game.paixing,rr)[1]; if(keyichu.length!=0) { sz.push([i]); laizi_paizu[laizi_paizu.length]=[]; var ss = cls_aset2.CardIdsToCards(gp.pai,pai_s); ss = cls_card2_gp.SortCardList(ss); var uu = cls_aset2.CardsToCardIds(ss) laizi_paizu[laizi_paizu.length-1] = laizi_paizu[laizi_paizu.length-1].concat(uu.slice()); if(zd[0] ==4 && chupai.length == 4){//如果为炸弹直接跳出 sz = [[i]]; laizi_paizu = [laizi_paizu[laizi_paizu.length-1]]; a = 0; break ; } } } break; case 2: var sz = []; if ( game.people == 2) { zdz =14; } for (var a = zdz; a >= 3; a--) { for (var b = zdz; b >= 3; b--) { cls_card2_gp.SetArithN(pais[laizi_weizhi[0]],a); cls_card2_gp.SetArithN(pais[laizi_weizhi[1]],b); var rr = cls_aset2.CardsToCardIds(pais); var keyichu = panduan(game.paixing,rr)[0]; var zd = panduan(game.paixing,rr)[1]; if(keyichu.length!=0) { sz.push([a,b]); laizi_paizu[laizi_paizu.length]=[]; var ss = cls_aset2.CardIdsToCards(gp.pai,pai_s); ss = cls_card2_gp.SortCardList(ss); var uu = cls_aset2.CardsToCardIds(ss) laizi_paizu[laizi_paizu.length-1] = laizi_paizu[laizi_paizu.length-1].concat(uu.slice()); if(zd[0] ==4 && chupai.length == 4){//如果为炸弹直接跳出 sz = [[a,b]]; laizi_paizu = [laizi_paizu[laizi_paizu.length-1]]; a = 0; break ; } } } } break; case 3: var sz = []; if ( game.people == 2) { zdz =14; } for (var c = zdz; c >= 3; c--) { for (var a = zdz; a >= 3; a--) { for (var b = zdz; b >= 3; b--) { cls_card2_gp.SetArithN(pais[laizi_weizhi[0]],c); cls_card2_gp.SetArithN(pais[laizi_weizhi[1]],a); cls_card2_gp.SetArithN(pais[laizi_weizhi[2]],b); var rr = cls_aset2.CardsToCardIds(pais); var keyichu = panduan(game.paixing,rr)[0]; var zd = panduan(game.paixing,rr)[1]; if(keyichu.length!=0) { sz.push([c,a,b]); laizi_paizu[laizi_paizu.length]=[]; var ss = cls_aset2.CardIdsToCards(gp.pai,pai_s); ss = cls_card2_gp.SortCardList(ss); var uu = cls_aset2.CardsToCardIds(ss) laizi_paizu[laizi_paizu.length-1] = laizi_paizu[laizi_paizu.length-1].concat(uu.slice()); if(zd[0] ==4 && chupai.length == 4){//如果为炸弹直接跳出 sz = [[c,a,b]]; laizi_paizu = [laizi_paizu[laizi_paizu.length-1]]; a = 0; break ; } } } } } break; case 4: var sz = []; if ( game.people == 2) { zdz =14; } for (var d = zdz; d >= 3; d--) { for (var c = zdz; c >= 3; c--) { for (var a = zdz; a >= 3; a--) { for (var b = zdz; b >= 3; b--) { cls_card2_gp.SetArithN(pais[laizi_weizhi[2]],d); cls_card2_gp.SetArithN(pais[laizi_weizhi[1]],c); cls_card2_gp.SetArithN(pais[laizi_weizhi[3]],a); cls_card2_gp.SetArithN(pais[laizi_weizhi[0]],b); var rr = cls_aset2.CardsToCardIds(pais); var keyichu = panduan(game.paixing,rr)[0]; var zd = panduan(game.paixing,rr)[1]; if(keyichu.length!=0) { sz.push([d,c,a,b]); laizi_paizu[laizi_paizu.length]=[]; var ss = cls_aset2.CardIdsToCards(gp.pai,pai_s); ss = cls_card2_gp.SortCardList(ss); var uu = cls_aset2.CardsToCardIds(ss) laizi_paizu[laizi_paizu.length-1] = laizi_paizu[laizi_paizu.length-1].concat(uu.slice()); if(zd[0] ==4 && chupai.length == 4){//如果为炸弹直接跳出 sz = [[d,c,a,b]]; laizi_paizu = [laizi_paizu[laizi_paizu.length-1]]; a = 0; break ; } } } } } } break; } } } for(var a = 0;a 13 && laizi < 16) { //癞子为A和2 if(cls_card2_gp.GetNumber(gp.pai.cardlist[a])==laizi-13){ cls_card2_gp.SetArithN(gp.pai.cardlist[a],laizi); //癞子算法还原 } } } for(var p = 0;p1) { systemSort(sz[p]); } } //console.log(sz); shanchu = sz.distinct_t()[1];//癞子位置 shanchu_pai = sz.distinct_t()[0];//癞子牌型算法 jieguo_pai = []; paipai = []; for(var b=0;b1 ) { for(var i = 0; i < jieguo_pai.length; i++){//改变后的可出牌 jieguo_pai_gai[i] = []; for (var j = 0; j < jieguo_pai[i].length; j++) { jieguo_pai_gai[i].push(jieguo_pai[i][j]); } } for (var i = 0; i < jieguo_pai.length; i++) {//把癞子id换成改变后的 var yici = 0; for (var a = 0; a < jieguo_pai[i].length; a++) { if (jieguo_pai[i][a]%13+1 ==game.laizi ) { jieguo_pai_gai[i][a]= (paipai[i][yici]-1)%13; yici++; } } } var tongpaixing = []; for (var i = 0; i < jieguo_pai_gai.length; i++ ) { tongpaixing[i] = panduan(game.paixing,jieguo_pai_gai[i]); tongpaixing[i].splice(0,1); } for (var i = 0; i < jieguo_pai_gai.length-1; i++) { //删除同类型的牌 if (tongpaixing.length>1 ) { //当牌型大于一的情况 for (var j = i+1;jtongpaixing[j][1][0][4]) { //牌型大于后面的删除后面 jieguo_pai.splice(j,1); paipai.splice(j,1); tongpaixing.splice(j,1); jieguo_pai_gai.splice(j,1); i = -1; break; }else {//否则删除前面的 jieguo_pai.splice(i,1); paipai.splice(i,1); tongpaixing.splice(i,1); jieguo_pai_gai.splice(i,1); i = -1; break; } } } } } } return jieguo_pai; } Array.prototype.distinct_t = function() { //数组去重 var arr = this, i, obj = {}, result = [], dd = [], len = arr.length; for(i = 0; i < arr.length; i++) { if(!obj[arr[i]]) { //如果能查找到,证明数组元素重复了 obj[arr[i]] = 1; result.push(arr[i]); dd.push(i); } } return [result,dd]; } function systemSort(array) { //快速排序 return array.sort(function(a, b) { return a - b; }); } Array.prototype.duplicate = function() { //数组中相同数tmp 有几个tem.length var tmp = []; this.concat().sort().sort(function(a, b) { if(a == b && tmp.indexOf(a) === -1) tmp.push(a); }); return tmp; } var gp_ui_duoxuan = function(kechu) { set_group(222,37,1,0,0); set_group(223,37,0,0,0); set_self(1145,21,160+100*kechu.length,0,0); set_self(1145,20,160+75*kechu[0].length,0,0); set_self(1145,18,640-get_self(1145,20)/2,0,0); if (get_self(1145,20)>1290) { set_self(1145,20,1290,0,0); } for (var i = 1152; i < 1186; i++) { set_self(i,33,55,0,0); } var gbh_laizi = [[]]; //癞子为改编后牌组 var cishu = 0; for (var i = 0; i < kechu.length; i++) {//把癞子id换成改变后的 var yici = 0; for (var a = 0; a < kechu[i].length; a++) { gbh_laizi[i][a]= kechu[i][a]; if (kechu[i][a]%13+1 ==game.laizi ) { gbh_laizi[i][a]= paipai[i][yici]-1; yici++; } } for (var a=0;a