美文网首页前端社团程序员
简单扑克游戏之玩法规则

简单扑克游戏之玩法规则

作者: 淡就加点盐 | 来源:发表于2016-11-07 19:57 被阅读230次
    简单扑克游戏规则.gif

    为之前一篇添加玩法规则,参考了最为亲切的关牌(流行于江浙一带)

    我的关牌规则

    1.牌数

    一副牌,保留了所以牌,共54张;

    2.发牌

    由系统随机分发2家的牌,每家27张,不重复

    3.出牌
    • 第一次为黑桃3先出
    • 牌的大小顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3。
    • 牌形分为:单张、 一对、 三张、姐妹对(两张三张都可以连接,且连接数量无限)、顺子(数量无限制)、炸弹(不能4带1):
    • 除了炸弹以外,普通牌形不允许对压,相同牌形只有比它大的才能出。
    • 炸弹任何牌形都能出,炸弹的大小为:天王炸,2,A,K,Q,J,10,9,8,7,6,5,4,3。

    思路

    1. 客户端向服务器发送的是出牌的扑克块状代码数组
    //利用$(selector).each 将每一个选中(上移)的扑克牌的html放进数组
    var i = 0;
    $(".click-up").each(function() {
        list[i] = $(this).prop("outerHTML"); //获取选中的牌的整个html代码
        $(this).removeClass("click-up");
        $("#preview-below").append(list[i]);
        $(this).remove();
        i++;
    });
    
    2. 利用socket.io发送到对方客户端,如下获取
    //利用append动态添加到指定id为“preview-above”的div里
    for (var index in data.discard) {
        $("#preview-above").append(data.discard[index]);
    }
    

    简单点,直接把id为preview-above元素里的扑克.poker利用attr("id")取出id值并进行正则操作获取值

    $("#preview-above").find(".poker").each(function() {
        var pokerId = $(this).attr("id"); //atte取出id值
        pokerId = pokerId.replace(/[p]([0-9]+)/g, "$1"); //获取选中的牌的编号(删掉id值首字母p)
        aboveList[j] = getPokerFace(pokerId);
        j++;
    });
    
    3. 判断牌的类型

    3.1 由于扑克牌的序号是从1到54,但这并不是扑克牌的面值。转换操作:

    //返回每张牌的面值
    function getPokerFace(n) {
        var temp = n % 13;
        var result;
        if(n == 53) {   //大王
            result = 17;
        } else if(n == 54) {  //小王
            result = 16;
        }
        if(temp >= 3 && temp <= 12) {  //3到Q
            result = temp;
        } else if(temp == 0) {  //老K
            result = 13;
        } else if(temp == 1) {  //A
            result = 14;
        } else if(temp == 2) {  //2
            result = 15;
        }
        return result;
    }
    

    3.2 获取到扑克牌面值,进行确定扑克牌数组的类型操作

    //出牌类型:单,对,连对,炸
    var ONE = "ONE";
    var TWO = "TWO";
    var TWO_2 = "TWO_2";
    var THREE = "THREE";
    var THREE_2 = "THREE_2";
    var THREE_3 = "THREE_3";
    var FOUR = "FOUR";
    var STRAIGHT = "STRAIGHT";
    var ERROR = "ERROR";
    var KING = "KING";
    
    简陋的状态转化
    //牌型状态机
    function typeState(type, n, m) {
        switch (type) {
            //单
            case ONE:
                if(n == m) {
                    type = TWO;
                } else if(n == m +1 && m == 16) {
                    type = KING;
                } else if(n == m + 1){
                    type = STRAIGHT;
                } else {
                    type = ERROR;
                }
                break;
            //对
            case TWO:
                if(n == m) {
                    type = THREE;
                } else if(n == m + 1){
                    type = TWO_2;
                } else {
                    type = ERROR;
                }
                break;
            case TWO_2:
                if(n == m) {
                    type = TWO;
                } else {
                    type = ERROR;
                }
                break;
            case THREE:
                if(n == m) {
                    type = FOUR;
                } else if(n == m + 1){
                    type = THREE_2;
                } else {
                    type = ERROR;
                }
                break;
            case THREE_2:
                if(n == m) {
                    type = THREE_3;
                } else {
                    type = ERROR;
                }
                break;
            case THREE_3:
                if(n == m) {
                    type = THREE;
                } else {
                    type = ERROR;
                }
                break;
            case STRAIGHT:
                if(n == m + 1) {
                    type = STRAIGHT;
                } else {
                    type = ERROR;
                }
                break;
            default:
                break
        }
        return type;
    }
    
    //返回牌的类型和排列中最小牌的面值
    function getPokerType(pokerList) {
        var type = ONE;
        var n, m;
        for(var i = 1; i < pokerList.length; i++) {
            n = pokerList[i-1];
            m = pokerList[i];
            type = typeState(type, n, m);
        }
        if(type == TWO_2 || type == THREE_2 || type == THREE_3 || (type == STRAIGHT && pokerList.length < 5)) {
            type = ERROR;
        }
        var result = {
            type: type,
            val: m,
            length: pokerList.length
        };
        return result;
    }
    

    3.3 获取我自己选中的牌

    $("#box-below").find(".click-up").each(function() {
        var pokerId = $(this).attr("id");
        pokerId = pokerId.replace(/[p]([0-9]+)/g, "$1"); //获取选中的牌的id(删掉首字母p)
        belowList[k] = getPokerFace(pokerId);
        k++;
    });
    

    将两个扑克牌数组的类型进行比较并确定大小

    //pkObj.data.before为true表示谁拿到♠3 或者 对方放弃我可以出任意牌,同时我出的牌必须符合规则,即type != ERROR
    var myPoker = getPokerType(belowList);
    
    //compare(aboveList, belowList)用于比较相同类型的牌的大小
    if(compare(aboveList, belowList) || (pkObj.data.before && myPoker.type != ERROR))
    
    //将选择出的牌和对方出的牌进行比较
    function compare(list1, list2) {
        var check = false;
        var data1 = getPokerType(list1); //对方的牌类型
        var data2 = getPokerType(list2);  //我的牌类型
    
        //1.类型相同的情况下再比较数组第一个元素大小;
        //2.4表示炸,对方不是炸,我出炸则check为true
        //3.天王炸
        if((data1.type == data2.type && (data1.length == data2.length) && list2[0] > list1[0]) || (data1.type != FOUR && data2.type == FOUR) || (data2.type == KING)) {
            check = true;
        }
        //check为true可出牌,否则不能出牌
        return check;
    }
    

    总结

    1. jquery设置按钮的disabled属性
    $('#button').attr('disabled',"true");  //添加disabled属性 
    $('#button').removeAttr("disabled");  //移除disabled属性 
    
    1. replace()
    pokerId = pokerId.replace(/[p]([0-9]+)/g, "$1"); //$1获取]([0-9]+)的值
    

    相关文章

      网友评论

      本文标题:简单扑克游戏之玩法规则

      本文链接:https://www.haomeiwen.com/subject/yzbouttx.html