• 使用SuperSocket开发联网斗地主(三):抢地主


    本次实现抢地主功能,此功能的难点在于按顺序区分自己和对家,以及出牌顺序,服务端按顺序分玩家顺序很好办,但到了客户端每个人都是坐在最下面的位置,对家要按顺序分配在左右两边。

    抢地主分为几种情况:

    1. 玩家1抢  玩家2抢  玩家3抢,玩家3中

    2. 玩家1抢  玩家2抢  玩家3不抢,玩家2中

    3. 玩家1抢  玩家2不抢  玩家3不抢,玩家1中

    4. 玩家1不抢  玩家2不抢  玩家3不抢,玩家3中

    然后就是谁中谁出牌,然后把底牌给地主,抢地主逻辑如下:

    DouDiZhuGameConfig.GameDouble = DouDiZhuGameConfig.GameDouble * 2;//加倍
    DouDiZhuGameConfig.Player_DiZhu = session.SessionID;//标记临时地主
    DouDiZhuGameConfig.RequestDiZhuIndex++;
    
    //分别通知各位玩家
    foreach (var item in DouDiZhuGameConfig.OnlineUserList)
    {
         var play_session = webSocketServer.GetSessionByID(item.Key);
    
        ResponseModel<DouDiZhuUserInfoModel> res_sendCard = new ResponseModel<DouDiZhuUserInfoModel>();
         res_sendCard.Action = "requestdizhu_ok";
         res_sendCard.Data = item.Value;
         res_sendCard.Data.IsMyTurn = false;
         res_sendCard.Data.GameDouble = DouDiZhuGameConfig.GameDouble;
         //标记下个出牌者
         if(DouDiZhuGameConfig.RequestDiZhuIndex + 1==item.Value.PlayerIndex)
         {
             item.Value.IsMyTurn = true;
         }
        
         //抢地主完毕
         if(DouDiZhuGameConfig.RequestDiZhuIndex==3)
         {
             if (item.Key == DouDiZhuGameConfig.Player_DiZhu)
             {
                 res_sendCard.Data.IsDiZhu = true;
                 res_sendCard.Data.IsMyTurn = true;//地主先出
                 res_sendCard.Data.MyCards.AddRange(item.Value.CommonCards);//把底牌给地主
             }
             res_sendCard.Data.CommonCards = new List<DouDiZhuGameCard>();//清空每个人的底牌
             item.Value.CommonCards = new List<DouDiZhuGameCard>();//清空每个人的底牌
         }
         this.SendMessage(play_session, JsonConvert.SerializeObject(res_sendCard));
    }

    还有不抢地主的逻辑:

    if (DouDiZhuGameConfig.RequestDiZhuIndex < 4)
      {
          DouDiZhuGameConfig.RequestDiZhuIndex++;
          //if(DouDiZhuGameConfig.RequestDiZhuIndex==2)//
          //{
          //    DouDiZhuGameConfig.Player_DiZhu = session.SessionID;
          //}
          //分别通知各位玩家
          foreach (var item in DouDiZhuGameConfig.OnlineUserList)
          {
              var play_session = webSocketServer.GetSessionByID(item.Key);
    
             ResponseModel<DouDiZhuUserInfoModel> res_sendCard = new ResponseModel<DouDiZhuUserInfoModel>();
              res_sendCard.Action = "requestdizhu_ok";
              res_sendCard.Data = item.Value;
              res_sendCard.Data.IsMyTurn = false;
              //标记下个出牌者
              if (DouDiZhuGameConfig.RequestDiZhuIndex + 1 == item.Value.PlayerIndex)
              {
                  item.Value.IsMyTurn = true;
              }
    
             //1不抢,2不抢,3不抢
              if (DouDiZhuGameConfig.RequestDiZhuIndex == 2&& DouDiZhuGameConfig.Player_DiZhu=="")
              {
                  if (item.Value.PlayerIndex == 3)
                  {
                      res_sendCard.Data.IsDiZhu = true;
                      res_sendCard.Data.IsMyTurn = true;//地主先出
                      res_sendCard.Data.MyCards.AddRange(item.Value.CommonCards);//把底牌给地主
                  }
                  res_sendCard.Data.CommonCards = new List<DouDiZhuGameCard>();//清空每个人的底牌
                  item.Value.CommonCards = new List<DouDiZhuGameCard>();//清空每个人的底牌
              }
              //1不抢,2抢,3不抢   1抢,2不抢,3不抢
              else if (DouDiZhuGameConfig.RequestDiZhuIndex == 3 && DouDiZhuGameConfig.Player_DiZhu != "")
              {
                  if (item.Key==DouDiZhuGameConfig.Player_DiZhu)
                  {
                      res_sendCard.Data.IsDiZhu = true;
                      res_sendCard.Data.IsMyTurn = true;//地主先出
                      res_sendCard.Data.MyCards.AddRange(item.Value.CommonCards);//把底牌给地主
                  }
                  res_sendCard.Data.CommonCards = new List<DouDiZhuGameCard>();//清空每个人的底牌
                  item.Value.CommonCards = new List<DouDiZhuGameCard>();//清空每个人的底牌
              }
              this.SendMessage(play_session, JsonConvert.SerializeObject(res_sendCard));
          }

    然后就是,不管谁抢了,总得给大家都通知下:

    //公共信息广播
                                 if (DouDiZhuGameConfig.RequestDiZhuIndex == 3)
                                 {
                                     List<DouDiZhuUserInfoModel> pubUserInfo = new List<DouDiZhuUserInfoModel>();
    
                                    foreach (var itemSession in webSocketServer.GetAllSessions())
                                     {
                                         ResponseModel<List<DouDiZhuUserInfoModel>> res_pubInfo = new ResponseModel<List<DouDiZhuUserInfoModel>>();
                                         pubUserInfo.Clear();
    
                                        foreach (var itemUser in DouDiZhuGameConfig.OnlineUserList)
                                         {
                                             pubUserInfo.Add(new DouDiZhuUserInfoModel
                                             {
                                                 UserName = itemUser.Value.UserName,
                                                 UserMoney = itemUser.Value.UserMoney,
                                                 IsDiZhu = itemUser.Value.IsDiZhu,
                                                 GameDouble = itemUser.Value.GameDouble,
                                                 PlayerIndex = itemUser.Value.PlayerIndex,
                                                 IsMe = itemUser.Key == itemSession.SessionID
                                             });
                                         }
    
                                        res_pubInfo.Action = "pubInfo";
                                         res_pubInfo.Data = pubUserInfo;
                                         this.SendMessage(itemSession, JsonConvert.SerializeObject(res_pubInfo));
    
                                    }
                                 }

    客户端处理桌子分配有三种情况,逻辑如下:

    1-3*

    2-1

    3-2

    1-2

    2-3*

    3-1

    1-1

    2-2

    3-3*

     

     

    //公布广播信息

    function pubUserInfo(mydata, userData) {
    
    var myIndex = 0, myName = mydata.UserName;
    
    for (let o of userData) {
    
    if (o.UserName == myName) {
    
    myIndex = o.PlayerIndex;
    
    nowBeiShu = o.GameDouble;
    
    break;
    
            }
    
        }
    
    // 1-3*
    
    // 2-1
    
    // 3-2
    
    if (myIndex == 1) {
    
    for (let o of userData) {
    
    //找到我
    
    if (o.PlayerIndex == 1) {
    
    o.PlayerIndex = 3;
    
    Player3Info = o;
    
                }
    
    else if (o.PlayerIndex == 2) {
    
    o.PlayerIndex = 1;
    
    Player1Info = o;
    
                }
    
    else if (o.PlayerIndex == 3) {
    
    o.PlayerIndex = 2;
    
    Player2Info = o;
    
                }
    
            }
    
        }
    
    // 1-2
    
    // 2-3*
    
    // 3-1
    
    if (myIndex == 2) {
    
    for (let o of userData) {
    
    //找到我
    
    if (o.PlayerIndex == 1) {
    
    o.PlayerIndex = 2;
    
    Player2Info = o;
    
                }
    
    else if (o.PlayerIndex == 2) {
    
    o.PlayerIndex = 3;
    
    Player3Info = o;
    
                }
    
    else if (o.PlayerIndex == 3) {
    
    o.PlayerIndex = 1;
    
    Player1Info = o;
    
                }
    
            }
    
        }
    
    // 1-1
    
    // 2-2
    
    // 3-3*
    
    if (myIndex == 3) {
    
    for (let o of userData) {
    
    //找到我
    
    if (o.PlayerIndex == 1) {
    
    Player1Info = o;
    
                }
    
    else if (o.PlayerIndex == 2) {
    
    Player2Info = o;
    
                }
    
    else if (o.PlayerIndex == 3) {
    
    Player3Info = o;
    
                }
    
            }
    
        }

    最终效果如:

    image

    image

    image

    image

    代码下载

  • 相关阅读:
    安卓触摸事件探究
    android关于canvas,path,paint非常好的讲解
    android的Shader
    android中view的生命周期
    JAVA的Random类(转)
    lniux 64位导致adb无法运行解决方案
    [转]Android中attrs.xml文件的使用详解
    FlowLayout
    大数据平台架构技术选型与场景运用(转)
    mysql--java类型对应表
  • 原文地址:https://www.cnblogs.com/madyina/p/15761857.html
Copyright © 2020-2023  润新知