网页斗地主实现——(2)

上文概要

上文简要叙述了大图截取小图,游戏开始前的坐位判断,扑克牌的value值判断

游戏开始

上文中在后台的ioServer中的sitSeat方法对当前桌子坐下的人数进行了判断,如果人数等于3则向客户端发送gameStart消息和seats储存的每个座位上的用户信息.

gameStart

netConnection.js

    socket.on("gameStart",function (seats) {
        MODAL.startGame(seats);
    })

myjs.js

var modalBox = {
        startGame:function (seats) {
            $(".bc").empty();
            for(var i = 0;i<3;++i){
                if(seats[i].id==X._id){
//如果index为i的座位对应的用户id和当前用户id相同,则将myIndex设置为i
                   MODAL.default.myIndex = i;
                }
            }
            if(MODAL.default.myIndex==0){
                MODAL.default.status = "DISCARD";
            }else{
                MODAL.default.status = "WAITNG"
            }
//status表示游戏开始后的三个状态,出牌阶段,等待阶段,游戏结束后得状态
            MODAL.default.leftIndex = ((MODAL.default.myIndex-1)<0)?2:MODAL.default.myIndex-1;
            MODAL.default.rightIndex = ((MODAL.default.myIndex+1)>2)?0:MODAL.default.myIndex+1;
//leftIndex为处于左边的玩家,rightIndex 为处于右边的玩家
            this.cardsSort(this.default.cards);                                       //按照花色,牌大小排序
            this.drawothers(seats[MODAL.default.leftIndex],seats[MODAL.default.rightIndex]);
//将左右两位玩家的信息绘制上去
            this.drawuser(seats[MODAL.default.myIndex]);
//绘制玩家
            this.placeCards($(".cardsLine"),this.default.cards,true);                                      //放置扑克
            this.initPlay();
//绑定扑克牌的点击事件
        }
}
drawothers
        drawothers:function (objLeft,objRight) {
            var content = [
            '    <div class="others">',
            '        <div class="player leftPlayer">',
            '            <div class="otherPlayer">',
            '                <img src="/images/leftIcon.jpg">',
            '            </div>',
            '            <div class="otherCards">',
            '            </div>',
            '       </div>',
            '       <div class="player rightPlayer">',
            '            <div class="otherCards">',
            '            </div>',
            '            <div class="otherPlayer">',
            '                <img src="/images/rightIcon.jpg">',
            '            </div>',
            '        </div>',
            '    </div>'
            ].join("");
            var $others = $(content);
            $others.children(".leftPlayer").children(".otherPlayer").children().attr({
                src:objLeft.imgUrl
            });
            $others.children(".rightPlayer").children(".otherPlayer").children().attr({
                src:objRight.imgUrl
            });
            $(".bc").append($others);
        }
drawuser
        drawuser:function (obj) {
            var content = [
            '    <div class="user">',
            '        <div class="avatar">',
            '            <img src="/images/doge.jpg">',
            '        </div>',
            '        <div class="twoCards">',
            '           <div class="showCardLine">',
            '            </div>',
            '            <div class="cardsLine">',
            '            </div>',
            '        </div>',
            '        <div class="sendCards">',
            '           <button  id="sendCards" class="button button-glow button-rounded button-primary">出牌</button>',
            '           <button  id="clearCards" class="button button-glow button-rounded button-primary">清空</button>',
            '        </div>',
            '    </div>',
            ].join("");
            var $user = $(content);
            $user.children(".avatar").children().attr({
                src:obj.imgUrl
            })
            $(".bc").append($user);
        },

绘制玩家和对手没什么可以解析的

placeCards
placeCards:function ($goal,cardArray,isDelay) {
//isDelay用于设置延迟发牌,true则0.3s发一张牌
            var $cards = $("<div>").addClass("cards");
            var array = cardArray;
            for(var i = 0;i<array.length;++i){
                (function(i){
                    if(isDelay){
                        setTimeout(function(){
                            var $card = $("<div>").addClass("card");
                            $card.css({
                                'background-position':(array[i]%13*-90)+"px "+(Math.floor(array[i]/13)*-120)+"px"
                            });                                            //background-position:0px -480px;
                            $card.attr({
                                index:array[i]
 //给每张牌设置index
                            });
                            //console.log("x坐标:"+array[i]%13+"   y坐标"+Math.floor(array[i]/13));
                            $cards.append($card);
                        },i*300);
                    }else{
                        var $card = $("<div>").addClass("card");
                        $card.css({
                            'background-position':(array[i]%13*-90)+"px "+(Math.floor(array[i]/13)*-120)+"px"
                        });                                            //background-position:0px -480px;
                        $card.attr({
                            index:array[i]
                        });
                        //console.log("x坐标:"+array[i]%13+"   y坐标"+Math.floor(array[i]/13));
                        $cards.append($card);
                    }
                })(i);
            }
            $goal.empty();
            $goal.append($cards);
        },
重点分析initPlay
initPlay:function () {
            var isDrag;//表示玩家是否拖动在拖动选择扑克牌
            var overCount = 0;//记录玩家通过拖动使牌被选择的数量
            var index = [0,0,0];//记录玩家连续拖动的三张牌的序号
            $("body").on("mousedown",".cardsLine .cards .card",function (e) {
//mousedown记录扑克牌被选择事件
                e.preventDefault();
                overCount = 1;
                index[overCount-1] = $(this).index();
                if(e.which==1){
                    isDrag = true;
//开始拖动
                }
                ptrThis.toggleCard($(this));
//被点击的扑克牌变换状态
            })
            $("body").on("click","#clearCards",function () {
                ptrThis.clearCards();
//清空展示被发送的扑克牌的界面
            })
            $("body").mousedown(function (e) {
                if(e.which==1){
                    isDrag = true;
                }
//给body元素绑定mousedown事件,如果是左键则设置isDrag为true
                console.log("down");
            })
            $("body").mouseup(function (e) {
                if(e.which==1){
                    isDrag = false;
                }
                console.log("up");

            })
            $("body").on("mouseover",".cardsLine .cards .card",function () {
//关键部分,如果只用mouseover来实现扑克牌滑动选择,则会出现BUG
                ++overCount;
                switch (overCount){
                    case 1:
                    case 2:
                    case 3:
                        index[overCount-1] = $(this).index();
                        break;
                    default:
                        index[0] = index[1];
                        index[1] = index[2];
                        index[2] = $(this).index();
                        break;
                }
                if(overCount>2){
                    var direction;
                    if((index[0]-index[1])*(index[1]-index[2])>0){
                        direction = true;                   //true表同方向
                    }else{
                        direction = false;
                    }
                    if(!direction){
//发生变向则需要将产生变向的那张牌变换状态.
                        if(isDrag){
                            ptrThis.toggleCard($(".cardsLine .cards").children().eq(index[1]));
                            console.log("发生变向"+$(".cardsLine .cards").eq(index[1]).index());
                        }
                    }
                }
                if(isDrag){
                    ptrThis.toggleCard($(this));
                }
                //console.log($(this).index());
            })
        }

发送扑克牌事件

$("body").on("click","#sendCards",statusMachine);//这里使用了状态机的思想
function statusMachine() {
//根据status在产生不同的效果
    switch(MODAL.default.status){
        case "DISCARD":
            MODAL.preSend();//发送扑克
            break;
        case "WAITNG":
            MODAL.notYourTurn();//发送不是你的回合的提示
            break;
        case "GAMEOVER":
            MODAL.readyGame();//准备开始游戏,其实已经不是一个性质的按钮了
        default:
            break;
    }
}
preSend
        preSend:function () {
            var array  = new Array();
            $(".cardsLine .card").each(function () {
                if($(this).hasClass("select")){
                    array.push($(this).attr("index"));
                }
            })
            socketFun.sendCards(array);
            //ptrThis.sendCards();
        },
sendCards
    sendCards:function (array) {
        var sendOut;
        if(($(".cardsLine .cards").children().length-array.length)==0){
//如果牌被发光,则sendOut设置为true
            sendOut = true;
        }else{
            sendOut = false;
        }
        var obj = {
            array:array,
            posterIndex:MODAL.default.myIndex,
            sendOut:sendOut
        }
        socket.emit("postCards",obj);
    },
服务器端处理
        socket.on("postCards",function (obj) {
            console.log(obj);
            if(obj.sendOut){
                for(var i = 0;i<3;++i){
                    seats[i].isReady=false;
                }
            }
//一局游戏结束,所有玩家都设置为没有准备状态
            for(var i = 0;i<3;++i){
                    users[seats[i].id].emit("postCards",obj);
            }
//将obj转发到(回)客户端
        })
客户端接收postCards信息
    socket.on("postCards",function (obj) {
        MODAL.justifyWhich(obj);
    })
justifyWhich
        justifyWhich:function (obj) {
            var $goal;
            switch(obj.posterIndex){//判断是谁发的牌
                case MODAL.default.myIndex:
                    ptrThis.removeCards();
                    $goal = $(".showCardLine");
                    break;
                case MODAL.default.leftIndex:
                    $goal = $(".leftPlayer").children(".otherCards");
                    break;
                case MODAL.default.rightIndex:
                    $goal = $(".rightPlayer").children(".otherCards");
                    break;
                default:
                    break;
            }
            ptrThis.placeCards($goal,obj.array,false);
            MODAL.default.turn = (MODAL.default.turn+1)%3;//将轮次+1
            if(MODAL.default.turn==MODAL.default.myIndex){
                MODAL.default.status = "DISCARD";
            }else{
                MODAL.default.status = "WAITNG"
            }
//如果轮次和玩家的座位号相等,则设置status为DISCARD(发牌阶段),否则WAITING
            if(obj.sendOut){
//如果发牌完毕,则调用end
                if(obj.posterIndex==MODAL.default.myIndex){
                    ptrThis.end(true);
                }else{
                    ptrThis.end(false);
                }
            }
        }
end和gameover
        end:function (isWin) {
            MODAL.default.status = "GAMEOVER";
            ptrThis.gameover(isWin);
        },
        gameover:function (isWin) {
            $("#sendCards").text("准备");
//将发牌的按钮的text改为准备
            if(isWin){
                alert("You Win!");
            }else{
                alert("You Lose!");
            }
            $(".showCardLine").empty();
            $(".cardsLine").empty();
            $(".leftPlayer").children(".otherCards").empty();
            $(".rightPlayer").children(".otherCards").empty();
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容