第一次写这种棋牌出牌的规则。第一想到的是正则,花了两天时间写出来,反复调试,大致应该没有BUG。代码有点乱,但是具体注释都写了。
规则JS
/**
* Created by jialin on 2016/10/21.
*/
(function (window) {
var r = {};
/**
* 牌型定义:
* 1.单张
* 2.对子
* 3.三张相同
* 4.三带一
* 5.三带二
* 6.顺子
* 7.两连对(AABB)
* 71.三连对
* 72.四连对
* 73.五连对
* 74.六连对
* 75.七连对
* 76.八连对
* 8.飞机(AAABBB)
* 81.三飞机
* 82.四飞机
* 83.五飞机
* 10.炸弹
*/
//public - 检测扑克牌的牌型是否与上一家打出的牌型相同并且权重大于上一家
//@param poker 存放牌对象的数组
//@param surplus 剩余手牌数
//@param poker_matcing 上家的牌型
//@param poker_scale 上家牌型的权重
r.pokerMatcing = function (dataJson, surplus, poker_matcing, poker_scale) {
var poker_num = Object.keys(dataJson).length;
var str_poker = '';
var is_carry; // 带牌是否符合规则
var return_object = {
"matcing":0,
"scale":0,
"status":0,
}
for(var index in dataJson){
str_poker += dataJson[index].value;//将牌对象转成字符串,用于正则判断
}
str_poker = str_poker.replace(/10/g,"S");//由于10占两个字符,对正则匹配有影响,因此批量替换成S
var result = matcing(str_poker, Object.keys(dataJson).length, dataJson);//判断当前牌型及权重
return_object.matcing = result[0];
return_object.scale = result[1];
// console.log("return_object.matcing : "+return_object.matcing);
// console.log("return_object.scale : "+return_object.scale);
//如果没有上家,则只要符合规则都允许出牌。
if(poker_matcing == 0 && poker_scale == 0){
return_object.status = 1;
return return_object;
}
//判断牌型是否与上家一致
if(return_object.matcing != poker_matcing){
//如果牌型不一致并且为炸弹则直接可以出牌,此处判断可避免上家也是炸弹不判断大小直接出牌
if(return_object.matcing == 10){
return_object.status = 1;
}
//如果不是炸弹牌型也一致则出牌失败。
return return_object;
}
//判断带牌是否符合
switch (return_object.matcing){
// 三不带,三带一
case 3:
case 4:
//剩余手牌数大于0 不允许出牌
surplus <= 0 ? is_carry = true : is_carry = false;
break;
//飞机 双三 需要带 四张 3+3+4 = 10
case 8:
if(poker_num == 10){
is_carry = true;
}else{
surplus <= 0 ? is_carry = true : is_carry = false;
}
break;
//81.三飞机 3+3+3+6 = 15
case 81:
if(poker_num == 15){
is_carry = true;
}else{
surplus <= 0 ? is_carry = true : is_carry = false;
}
break;
default:
is_carry = true;
//由于牌不够,其余飞机不管带几张都可以出。
}
if(is_carry){
//-------继续判断权重是否大于上家。大于上家则允许出牌
return_object.status = return_object.scale > poker_scale ? 1 : 0;
}else{
return_object.status =