斗地主之基本功能实现

斗地主.gif

功能实现

  • 默认先进入的人拥有优先发牌权
  • 点对点发牌接收牌 discard&receive card
  • 发牌后将发牌权移交给另一方
  • 一方退出后回到开始页面,对方提示获胜 abandon
  • 一方牌全部发完后分别提示获胜方和失败方信息

客户端代码

//洗牌
function shuffle() {
  var pokers = new Array();
  for(var i = 0; i < 54; i++) {
    pokers[i]=i;
  }
  for (var i = 0; i < 54; i++) {
    var rd=parseInt(Math.random()*54);
    var b=pokers[i] ;
    pokers[i]= pokers[rd];
    pokers[rd]=b;
}
   var poker1 = [];
   var poker2 = [];
   for(var i = 0; i < 54; i++) {
    if(i<27)
        poker1[i]=pokers[i];
     else{
        poker2[i-27]=pokers[i];
    }
   }
   sort(poker1);
   sort(poker2);
  result = {
    poker1: poker1,
    poker2: poker2
  };
  return result;
}
//排序
function sort(pokers){
    var i=27;
        var temp;
        while (i > 0) {
            for (var j = 0; j < i - 1; j++) {
              if(pokers[j]===53){
                    temp = pokers[j];
                    pokers[j] = pokers[j + 1];
                    pokers[j + 1] = temp;
              }
              else if(pokers[j]===52&&pokers[j+1]!==52){
                    temp = pokers[j];
                    pokers[j] = pokers[j + 1];
                    pokers[j + 1] = temp;
              }
               else if (((pokers[j]+11)%13> (pokers[j + 1]+11)%13)&&(pokers[j + 1]!==52||pokers[j + 1]!==53)) {
                    temp = pokers[j];
                    pokers[j] = pokers[j + 1];
                    pokers[j + 1] = temp;
                }
            }
            i--;
        }
}



DISCARD=2;

var io = require('socket.io').listen(server);
var count = 0;
//var onlineList=[];
var first;
var second;

io.on('connection', function(socket){
  //用户登录
  socket.on('add user', function (obj) {
    console.log("user login");
    count++;
    console.log(count);
     if(count===1){
        socket.join(obj.from);
        first=obj;
        first.authority=true;
        console.log("first in");
     }
     else if(count===2){
        socket.join(obj.from);
        second=obj;
        console.log("second in");

        //发牌开始
        var res=shuffle();
        first.data.pokers=res.poker1;
        second.data.pokers=res.poker2;
        first.to=second.from;
        second.to=first.from;

        first.data.status=DISCARD;
        second.data.status=DISCARD;
        console.log(first);
        console.log(second);

        io.to(first.from).emit("start poker", first);
        io.to(second.from).emit("start poker", second);
        }
  }
  );
  socket.on('discard',function(data,sendMessage){
    if(data.data.count===0){
        io.to(data.from).emit("game over", 1);
        io.to(data.to).emit("game over",2 );
    }
    else{
        io.to(data.to).emit("receive poker", sendMessage,data.data.count);
    }
  })
  socket.on('abandon',function(data){
      io.to(data.from).emit("game over", 3);
      io.to(data.to).emit("game over",4);
    })
  })

用户端代码

/**
 * Created by Zoe on 2016/11/8.
 */
var socket = io();
INIT=0;
WAITING=1;
DISCARD=2;
GAMEOVER=3;

var fid="";
var id="";
var pkObj = {
    data:{
        status:INIT,
        count:27,
        pokers:[]
    },
    from:id,
    to: fid,
    success:0,
    init:function (){
        if(pkObj.data.status===INIT){
            $("#login").click(doInit);
        }
        socketInit();
    }
};

var htmlWait = "<h3 class='waiting'><h2>Waiting....</h2><h5>正在为你寻找小伙伴</h5></div>";
var htmlPoker="<div class='choose'><div class='oppo-usr'></div><div class='oppo-pokers'></div></div><div class='display'></div><div class='choose'><div class='user'><div class='usr'></div><button class='abandon'></button></div><div class='pokers'></div> <div class='button'> <button class='cancel'></button> <button class='confirm'></button> </div></div>";
var htmlStart="<div class='menu'><button type='button' id='login'></button></div>";
$(init);

function init() {
    $("body").on("click", pkObj.init());
}
function socketInit() {
    socket.on('start poker', function (data) {
        doDiscard(data);
    });
    socket.on('receive poker',function (data,count) {
        doRecieve(data,count);
        console.log(data);
    });
    socket.on('game over',function (data) {
        if(data===1)
        {
            alert("you win!");
        }
        else if(data===2){
            alert("you lose!");
        }
        else if(data===3){
            alert("你放弃啦!");
            //回到初始页面
            $(".wrapper").html("");
            $(".wrapper").append(htmlStart);
            $("#login").click(doInit);
            pkObj.data.status=INIT;
        }
        else{
            alert("对方落荒而逃,恭喜你,不战而胜!");
        }
    })
}
function doInit() {
    //获得唯一的id
    var id = new Date().getTime()+""+Math.floor(Math.random()*11+1);
    pkObj.from=id;
    var obj=pkObj;
    //发送添加用户事件
    socket.emit("add user",obj);
    $(".wrapper").html("");
    $(".wrapper").append(htmlWait);
}
//发牌
function doDiscard(data) {
    pkObj=data;
    console.log(pkObj);
    $(".wrapper").html("");
    $(".wrapper").append(htmlPoker);
    for(var i=0;i<27;i++){
        var html = $("<button class='oppo-poker'></button>");
        html.css({"background-position":"-180px -480px"});
        $(".oppo-pokers").append(html);
    }
    for(var i=0;i<27;i++){
        var x=pkObj.data.pokers[i]%13*(-90);
        var y=parseInt(pkObj.data.pokers[i]/13)*(-120);
        var left=x+"px";
        var top=y+"px";
        var pokeri="poker"+i;
        var html = $("<button class='poker'></button>").addClass(pokeri);
        console.log(html);
        html.css({"background-position":left+" "+top});
        $(".pokers").append(html);
    }
    $(".poker").click(function(){
        if($(this).hasClass("select")){
            $(this).removeClass("select");
            $(this).animate({top:"+=50px"});
        }
        else{
            $(this).addClass("select");
            $(this).animate({top:"-=50px"});
        }
    });
    //发牌
    $(".confirm").click(function(){
        if($(".display").children() != null){
            $(".display .poker").remove();
        }
        var j=0;
        for(var i=0;i<27;i++){
            var index=".poker"+i;
            if($(index).hasClass('select')){
                $(".display").append($(index));
                j++;
            }
        }
        pkObj.data.count-=j;
        var sendMessage=$(".display").html();
        socket.emit('discard', pkObj,sendMessage);
        //把发牌按钮隐藏
        $(".confirm").hide();
        console.log("hide");
    });
    //取消
    $(".cancel").click(function(){
        for(var i=0;i<13;i++){
            var index=".poker"+i;
            if($(index).hasClass('select')){
                $(index).removeClass('select');
                $(index).animate({top:"+=50px"});
            }
        }
    });
    //退出游戏
    $(".abandon").click(function(){
        socket.emit('abandon', pkObj);
    })
}
//接收对方发来的牌
function doRecieve(data,after) {
    $(".confirm").show();
    console.log("show");
    console.log("other count"+after);
     var before= $(".oppo-pokers").children().length;
    console.log("before count"+before);
    for(var i=before;i>after;i--){
        $(".oppo-pokers").children('.oppo-poker:last').remove();
    }
    if($(".display").children() != null){
        $(".display .poker").remove();
    }
    $(".display").append(data);
}

待完成功能

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 1.体系结构图 2.逻辑流程图 2.1简易流程图 2.2详细流程图 3.服务器-客户端通讯图 4.数据结构 4.1...
    Zoemings阅读 812评论 0 1
  • 体系结构图 逻辑流程图 逻辑流程图详细 通讯图 图片参考简书作者kamidox的文章使用 Sublime + Pl...
    ofelia_why阅读 956评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,072评论 25 707
  • 乡村:我们的拥有 □ 山田耕夫 乡村 ...
    巴山雪儿阅读 170评论 0 2