两人斗地主

两人斗地主,首先是画牌,采用精灵图进行画牌,将整副牌按照value值的大小和位于几排的方式进行存储,如下:

var allpokers=[
  112,113,101,102,103,104,105,106,107,108,109,110,111,
  212,213,201,202,203,204,205,206,207,208,209,210,211,
  312,313,301,302,303,304,305,306,307,308,309,310,311,
  412,413,401,402,403,404,405,406,407,408,409,410,411,
  514,515
];

这样的话在取牌的面值的时候只需要对其取余即可。
画的时候需要求出其坐标:

   z=this.pokers[i]%100;
      y=(parseInt(this.pokers[i]/100)-1)*120;
      if(z==12||z==13){
        x=(z-12)*90;
      } else if(z==14){
        x=(z-13)*90;
      } else if(z==15){
        x=(z-15)*90;
      } else{
        x=(z+1)*90;
      }

poker.js修改对象

function Poker() {
    this.pokers=[];//用户的牌
    this.status=START;//设置用户的状态
    this.id=1;//用来判断谁先出牌,一开始都设置为1,后来谁先登陆将id改为0,id为0的时候先出牌
    this.oppPoker=[];//存储对方出的牌
}
Poker.prototype.num = 27;
//第一次画牌
Poker.prototype.drawPokers=function () {
  var x,y,z;
  this.sort(this.pokers);
  for(var i=0;i<this.num;i++) {
      z=this.pokers[i]%100;
      y=(parseInt(this.pokers[i]/100)-1)*120;
      if(z==12||z==13){
        x=(z-12)*90;
      } else if(z==14){
        x=(z-13)*90;
      } else if(z==15){
        x=(z-15)*90;
      } else{
        x=(z+1)*90;
      }
      $('#usrPoker').append('<div id="poker'+i+'L"></div>');
      $('#usrPoker #poker'+i+'L').css({
          left: i*22+'px',
          backgroundPosition: (0-x)+ 'px ' + (0-y) + 'px'
      });
  }
}
//每次出完牌之后,进行重新画牌
Poker.prototype.reDrawPoker=function (poker) {
  var x,y;
  $('#usrPoker').html("");
    this.sort(poker);
    for(var i=0;i<poker.length;i++){
      y=(parseInt(poker[i]/100)-1)*120;
      if(poker[i]%100==12||poker[i]%100==13){
        x=(poker[i]%100-12)*90;
      } else if(poker[i]%100==14){
        x=(poker[i]%100-13)*90;
      } else if(poker[i]%100==15){
        x=(poker[i]%100-15)*90;
      }
      else{
        x=(poker[i]%100+1)*90;
      }
      $('#usrPoker').append('<div id="poker'+i+'L"></div>');
      $('#usrPoker #poker'+i+'L').css({
        left: i*22+'px',
        backgroundPosition: (0-x)+ 'px ' + (0-y) + 'px'
      });
    }
    this.pokers = poker;
}
//对牌进行排序
Poker.prototype.sort = function (poker) {
    poker.sort(function (a,b) {
        a=a%100;
        b=b%100;
        return a-b;
    });
}

main.js 主要功能

先进行初始化

function  init() {
    initSocket();
    pokerArray=new Poker();
    $('body').on('click',clickMachine);
}

通过点击的事件来判断用户的状态,状态机:

function clickMachine(e){
    $("#alert").hide();
    switch(pokerArray.status){
        case START:
            doStart();
            break;
        case PLAY:
            //肯定要先选择,才能再出牌
            doPlayCard(e.target);
            break;
        case GAMEOVER:
            socket.emit("Game Over");
            break;
    }
}

js端socket事件:

function initSocket(){

    //初始化牌,并第一次打牌,id为0的先出牌
    socket.on('draw',function (obj) {
        $("#startBox").hide();
        initOther();
        pokerArray.status=PLAY;
        pokerArray.pokers=obj;
        doFirstPlay();
        pokerArray.drawPokers();
    });

    socket.on('wait',function (id) {
        $("#start").hide();
        $("#info").show();
        pokerArray.id=id;
        console.log(id);
        pokerArray.status=WAIT;
        console.log(pokerArray.id);
    });

    //发牌后的对方那边的显示
    socket.on("show card",function (other,pokers) {
        //获取对方出的牌的数组
        pokerArray.oppPoker=pokers;

       //显示在对方的桌面上
        $('#otherShow .showPoker').html("");
        for(var i=0;i<pokers.length;i++){
            y=(parseInt(pokers[i]/100)-1)*120;
            z=pokers[i]%100;
            if(z==12||z==13){
                x=(z-12)*90;
            } else if(z==14){
                x=(z-13)*90;
            } else if(z==15){
                x=(z-15)*90;
            } else{
                x=(z+1)*90;
            }
            $('#otherShow .showPoker').append('<div id="ospoker'+i+'"></div>');
            $('#otherShow .showPoker #ospoker'+i).css({
              left: i*32+'px',
              backgroundPosition: (0-x)+ 'px ' +(0-y) + 'px'
            });
        }
        oppPokerLength=oppPokerLength-pokers.length;
        initOther(oppPokerLength);
        socket.emit('doPlay',pokerArray.id);
    });
  //第一次之后开始打牌,判断该谁出牌,id为0的先出牌,id为1的后出牌
    socket.on('startPlay',function(id){
        pokerArray.status=PLAY;
        pokerArray.id=id;
        doFirstPlay();
    });
    socket.on('stop game',function () {
        $("#info").text("Game Over");
        $('#start').hide();
        $("#startBox").show();
    });
  //用户不出后,对方出牌的时候可以改变牌型
    socket.on('change type',function () {
        pokerArray.oppPoker.splice(0,pokerArray.oppPoker.length);
    });
}

服务器端进行发牌:

var users=[];
var online=[];
var sockets=[];
var allpokers=[
  112,113,101,102,103,104,105,106,107,108,109,110,111,
  212,213,201,202,203,204,205,206,207,208,209,210,211,
  312,313,301,302,303,304,305,306,307,308,309,310,311,
  412,413,401,402,403,404,405,406,407,408,409,410,411,
  514,515
];
io.on('connection', function(socket) {
    var uid;
    socket.on('login', function (usrName) {
        if (online.indexOf(usrName) != -1||online.length>=2) {
            console.log("existed");
        } else {
            uid=usrName;
            users[usrName] = socket.id;
            sockets[socket.id] = socket;
            online.push(usrName);
        }
    });

    socket.on('start game', function (usrId,obj) {
        var index;
        var pokerObj=obj;
        if(online.length==2){
            for(var i = 0; i < 27; i++) {
              index=parseInt(Math.random()*allpokers.length);
              pokerObj.pokers.push(allpokers[index]);
              allpokers.splice(index,1);
            }
          socket.broadcast.emit('draw',pokerObj.pokers);
          socket.emit('draw',allpokers);
        } else{
          //将先进来人的id设为0
          var id=0;
          socket.emit('wait',id);
        }
    });

    socket.on("play card",function(uid,pokers){
        var index=online.indexOf(uid);
        if(index!=-1){
          socket.broadcast.emit("show card",uid,pokers);
        }
    });
//用来设置下一个出牌的人,将当前出牌的id设为1,对方的设为0
    socket.on('doPlay',function (sid) {
          var id;
          if(sid==0){
            id=1;
          } else{
            id=0;
          }
          socket.broadcast.emit('startPlay',(1-id));
          socket.emit('startPlay',id);
    });
    socket.on('Game Over',function () {
          socket.broadcast.emit('stop game');
          socket.emit('stop game');
    })
//如果对方不出牌的话,那么用户就可以更换牌的类型
    socket.on('doRetype',function () {
          socket.broadcast.emit("change type");
    });
    socket.on('disconnect', function () {
          var index=online.indexOf(uid);
          if(index!=-1){
            online.splice(index,-1);
          }
    });
});

开始打牌:

function doStart() {
    socket.emit("start game",uid,pokerArray);
}

选择牌

function doSlide(event){
    var s=event.id.slice(5,-1);
    if($(event).attr('selected')){
        $(event).css({bottom: '10px'}).removeAttr('selected');
        var index = pokers.indexOf(pokerArray.pokers[parseInt(s)]);
        if (index > -1) {
            pokers.splice(index, 1);
        }
    } else {
        $(event).css({bottom:'30px'}).attr('selected',true);
        pokers.push(pokerArray.pokers[parseInt(s)]);
    }
}

出牌:

//出牌的时候
function doPlayCard(event) {
    var match;
    var value=event.id;
    var reg=/L/g;
    while(match = reg.exec(value)){
        value="NUM";
    }
    switch(value){
        case PLAY:
            $('#showBox .showPoker').html("");
            //到时候在这边先进行比较,如果大于的话就出牌,否则的话就弹出不出
            if(compare(pokers,pokerArray.oppPoker)||pokerArray.oppPoker.length==0){
                for(var i=0;i<pokers.length;i++){
                    y=(parseInt(pokers[i]/100)-1)*120;
                    z=pokers[i]%100;
                    if(z==12||z==13){
                        x=(z-12)*90;
                    } else if(z==14){
                        x=(z-13)*90;
                    } else if(z==15){
                        x=(z-15)*90;
                    }
                    else{
                        x=(z+1)*90;
                    }
                    $('#showBox .showPoker').append('<div id="spoker'+i+'"></div>');
                    $('#showBox .showPoker #spoker'+i).css({
                        left: i*32+'px',
                        backgroundPosition: (0-x)+ 'px ' +(0-y) + 'px'
                    });
                    var index = pokerArray.pokers.indexOf(pokers[i]);
                    if (index > -1) {
                        pokerArray.pokers.splice(index, 1);
                    }
                }
                if(pokerArray.pokers.length==0){
                    pokerArray.status=GAMEOVER;
                    pokerArray.reDrawPoker(pokerArray.pokers);
                } else{
                    pokerArray.reDrawPoker(pokerArray.pokers);
                    socket.emit("play card",uid,pokers);
                    pokers.splice(0,pokers.length);
                    $('#userBox #pokerBtn').remove();
                }
            } else{
                console.log(alertMessage);
                $("#alert").text(alertMessage);
                $("#alert").show();
            }
            break;
        case "NUM":
            doSlide(event);
            break;
        case PASS:
            pokerArray.status=PASS;
            $('#userBox #pokerBtn').remove();
            socket.emit('doPlay',pokerArray.id);
            socket.emit('doRetype');
            break;
        default:
            break;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 两人斗地主 一、体系结构图 通讯模型 大功能模块切换关系 二、逻辑流程图 登录login.PNG 主页面开始界面....
    wuyumumu阅读 497评论 0 0
  • 用状态机先来判断出牌的类型 将用户和对方出的牌的面值分别存到数组ownValue和oppValue里面,每次读取数...
    wuyumumu阅读 644评论 0 0
  • 体系结构图 逻辑流程图 逻辑流程图详细 通讯图 图片参考简书作者kamidox的文章使用 Sublime + Pl...
    ofelia_why阅读 948评论 0 3
  • 今天春分那个点,济南这座城市阴云密布,下起了小雨。真是春天的惊喜。 济南真的和我想象中的不一样,差异有点大。长沙很...
    一隻萬象阅读 218评论 0 0
  • 下午五点多的时候,村长私底下把四爷约到一个九回头的酒馆,要了两壶小酒,点了俩菜,慢斟慢饮着。 “那好啊,那我可要好...
    浮世绘话阅读 261评论 1 2