麻将开发-客户端打牌+服务器响应

本篇文章围绕如下主线:

自己打出一张牌,服务器做碰牌检查
1 如果其它家可以碰牌->提示其碰牌->客户端确认碰牌->服务器端碰牌处理->将碰牌响应返回给所有的玩家
2 如果其它家没有碰的可能->服务器端这边算出摸牌信息,然后将这些信息返回给所有玩家


告诉服务器是我打的牌以及打的是什么牌
将我在玩家列表中的下标编号发给服务器

这里写图片描述



服务器出牌处理器:

这里写图片描述


自己出牌后先检查一下其它家是否可以碰杠,如果其它家能够碰和杠则通知那家

   public void putOffCard(Avatar avatar,int cardPoint){
        avatar.avatarVO.setHuType(0);//重置划水麻将胡牌格式
        //出牌信息放入到缓存中,掉线重连的时候,返回房间信息需要
        avatar.avatarVO.updateChupais(cardPoint);
        avatar.avatarVO.setHasMopaiChupai(true);//修改出牌 摸牌状态
        //已经出牌就清除所有的吃,碰,杠,胡的数组
        clearAvatar();

        //下面这两张牌很重要,服务器将出牌信息先缓存起来,拱后续其它人碰使用
        putOffCardPoint = cardPoint;  
        curAvatarIndex = playerList.indexOf(avatar);


        PlayRecordOperation(curAvatarIndex,cardPoint,1,-1,null,null);
        avatar.pullCardFormList(putOffCardPoint); //将牌从自己的牌中
        for(int i=0;i<playerList.size();i++){
            //不能返回给自己
            if(i != curAvatarIndex) {
                playerList.get(i).getSession().sendMsg(new ChuPaiResponse(1, putOffCardPoint, curAvatarIndex));
            }
            else{
                playerList.get(i).gangIndex.clear();//每次出牌就先清除缓存里面的可以杠的牌下标
            }
        }

            Avatar ava;
            StringBuffer sb;
            for(int i=0;i<playerList.size();i++){
                ava = playerList.get(i);
                if(ava.getUuId() != avatar.getUuId()) { //检测其它玩家 
                        sb = new StringBuffer();
                    if (ava.checkGang(putOffCardPoint)) {
                        gangAvatar.add(ava);
                        //同时传会杠的牌的点数
                        sb.append("gang:"+putOffCardPoint+",");
                    }
                    if (ava.checkPeng(putOffCardPoint)) {
                        penAvatar.add(ava);
                        sb.append("peng:"+curAvatarIndex+":"+putOffCardPoint+",");
                    }
                    if(sb.length()>1){
                       //如果有人能够碰和杠 则通知他
                        ava.getSession().sendMsg(new ReturnInfoResponse(1, sb.toString()));
                    }
                }
            }

        //如果没有吃,碰,杠,胡的情况,则下家自动摸牌
        chuPaiCallBack();
    }

这里写图片描述



如果这名玩家点击碰按钮:

其实我个人觉得这里isDrag是不能够设置成True,因为还没有收到服务器端碰牌的响应

这里写图片描述


服务器在碰牌处理后,告诉所有玩家碰牌信息

    public boolean pengCard(Avatar avatar , int cardIndex){
        if((penAvatar.size() >= 1 && huAvatar.size() == 0) ||
                ( huAvatar.contains(avatar) && huAvatar.size() ==1 && penAvatar.size() ==1)) {
                avatar.avatarVO.setHasMopaiChupai(true);//修改出牌 摸牌状态
                 if(huAvatar.contains(avatar)){
                     huAvatar.remove(avatar);
                 }
                 if(gangAvatar.contains(avatar)){
                     gangAvatar.remove(avatar);
                 }
                 if(penAvatar.contains(avatar)){
                    //回放记录
                    PlayRecordOperation(playerList.indexOf(avatar),cardIndex,4,-1,null,null);

                     playerList.get(curAvatarIndex).avatarVO.removeLastChupais(); //从出牌玩家中移除所碰的牌
                     penAvatar.remove(avatar);

                     flag = avatar.putCardInList(cardIndex);//把碰的这张牌加入自己的牌组中
                     avatar.setCardListStatus(cardIndex,1);

                     //把各个玩家碰的牌记录到缓存中去,牌的index
                     avatar.avatarVO.getHuReturnObjectVO().updateTotalInfo("peng", cardIndex+"");
                     clearArrayAndSetQuest();
                     for (int i=0;i<playerList.size();i++){
                         if(playerList.get(i).getUuId() == avatar.getUuId()){
                             //碰了的牌放入到avatar的resultRelation  Map中
                             playerList.get(i).putResultRelation(1,cardIndex+"");
                             playerList.get(i).avatarVO.getPaiArray()[1][cardIndex]=1;
                             avatar.getPaiArray()[1][cardIndex] = 1;
                         }
                         playerList.get(i).getSession().sendMsg(new PengResponse(1,cardIndex,playerList.indexOf(avatar)));
                     }
                     pickAvatarIndex = playerList.indexOf(avatar);
                     curAvatarIndex = playerList.indexOf(avatar);
                     currentCardPoint  = -2;//断线重连判断该自己出牌
             }
            }else{
             if(penAvatar.size() > 0) {
                 for (Avatar ava : penAvatar) {
                     ava.pengQuest = true;
                }
             }
           }
        return flag;
    }

客户端碰的响应处理:

    public void otherPeng(ClientResponse response)//对服务器端碰牌响应处理
    {
        UpateTimeReStart ();
        OtherPengGangBackVO cardVo = JsonMapper.ToObject<OtherPengGangBackVO>(response.message);
        otherPengCard = cardVo.cardPoint;
        curDirString = getDirection (cardVo.avatarId);
        print("Current Diretion==========>" + curDirString);
        SetDirGameObjectAction ();
        effectType = "peng";
        pengGangHuEffectCtrl();
        SoundCtrl.getInstance ().playSoundByAction ("peng",avatarList [cardVo.avatarId].account.sex);
        if (cardOnTable != null) {
            reSetOutOnTabelCardPosition (cardOnTable);
            Destroy (cardOnTable);
        }


        if (curDirString == DirectionEnum.Bottom) {   //自己碰牌
            mineList [0] [putOutCardPoint]++; 
            mineList [1] [putOutCardPoint] = 2;
            int removeCount = 0;
            for (int i = 0; i < handerCardList [0].Count; i++) {
                GameObject temp = handerCardList [0] [i];
                int tempCardPoint = temp.GetComponent<bottomScript> ().getPoint ();
                if (tempCardPoint == putOutCardPoint) {

                    handerCardList [0].RemoveAt (i);
                    Destroy (temp);  //从手牌中删除碰的牌
                    i--;
                    removeCount++;
                    if (removeCount == 2) {
                        break;
                    }
                }
            }
            SetPosition (true);
                List<GameObject> templist = new List<GameObject>();

        for (int j = 0; j < 3; j++)         //重新生成碰的三张牌

        {
            GameObject obj1 = createGameObjectAndReturn("Prefab/PengGangCard/PengGangCard_B",
                pengGangParenTransformB.transform,
                new Vector3(-370 + PengGangCardList.Count * 190 + j * 60f, 0));
            obj1.GetComponent<TopAndBottomCardScript>().setPoint(putOutCardPoint);
            obj1.transform.localScale = Vector3.one;
            templist.Add(obj1);
        }
        PengGangCardList.Add(templist);
        GlobalDataScript.isDrag = true;

        } 


如果自己打牌后,其它家没有吃碰,那么服务器就可以通知下家拾牌
下面是服务器摸牌代码
这里写图片描述

这里写图片描述

 public void pickCard(){
        clearAvatar();
        //摸牌
        pickAvatarIndex = getNextAvatarIndex();
        //pickAvatarIndex = nextIndex;
        //本次摸得牌点数,下一张牌的点数,及本次摸的牌点数
        int tempPoint = getNextCardPoint();

        if(tempPoint != -1) {
            //回放记录
            PlayRecordOperation(pickAvatarIndex,tempPoint,2,-1,null,null);

            currentCardPoint = tempPoint;
            Avatar avatar = playerList.get(pickAvatarIndex);
            avatar.avatarVO.setHasMopaiChupai(true);//修改出牌 摸牌状态
            avatar.qiangHu = true;
            avatar.canHu = true;
            avatar.avatarVO.setHuType(0);//重置划水麻将胡牌格式
            //记录摸牌信息
             //avatar.canHu = true;


            //告诉这个玩家可以拾取一张牌
            avatar.getSession().sendMsg(new PickCardResponse(1, tempPoint));



            for(int i=0;i<playerList.size();i++){
                if(i != pickAvatarIndex){
                    playerList.get(i).getSession().sendMsg(new OtherPickCardResponse(1,pickAvatarIndex));
                }else {
                    playerList.get(i).gangIndex.clear();//每次摸牌就先清除缓存里面的可以杠的牌下标
                }
            }
            //判断自己摸上来的牌自己是否可以胡
            StringBuffer sb = new StringBuffer();
            //摸起来也要判断是否可以杠,胡
            avatar.putCardInList(tempPoint);
            if (avatar.checkSelfGang()) {
                gangAvatar.add(avatar);
                sb.append("gang");
                for (int i : avatar.gangIndex) {
                    sb.append(":"+i);
                }
                sb.append(",");
                //avatar.gangIndex.clear();//9-18出牌了才清楚(在杠时断线重连后需要这里面的数据)
            }
            if(checkAvatarIsHuPai(avatar,100,"mo")){
                huAvatar.add(avatar);
                sb.append("hu,");
            }
            if(sb.length()>2){
                avatar.getSession().sendMsg(new ReturnInfoResponse(1, sb.toString()));
            }

        }


FR:海涛高软(hunk Xu) QQ技术交流群:386476712

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值