两人斗地主

两人斗地主,首先是画牌,采用精灵图进行画牌,将整副牌按照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
'); $('#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
'); $('#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
'); $('#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
'); $('#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; } }

你可能感兴趣的:(两人斗地主)