Exemplo n.º 1
0
    /// <summary>
    /// 服务端接收到计算机系协议
    /// </summary>
    /// <param name="msgBase"></param>
    public void ProcessComputerScience(MsgComputerScience msg)
    {
        int paiIndex = msg.paiIndex; //牌在这个玩家的索引
        int id       = msg.id;       //出牌的玩家id

        doSkillTime[msg.id]++;
        msg.canSkill = doSkillTime[msg.id] < maxSkillTime[msg.id] ? true : false;
        Broadcast(msg);

        MsgChuPai msgChuPai = new MsgChuPai();

        msgChuPai.id       = msg.id;
        msgChuPai.paiIndex = msg.paiIndex;
        Broadcast(msgChuPai);
        if (paiIndex == -1)
        {
            //服务端执行胡的操作,清空数据,写入数据库等
            Over(msg.id, false);
            return;
        }

        int      paiId    = paiManager.ChuPai(paiIndex, id);
        MsgFaPai msgFaPai = new MsgFaPai();

        turn = (turn + 1) % 4;

        msgFaPai = ProcessMsgFaPai(msgFaPai);
        //广播
        Broadcast(msgFaPai);
    }
Exemplo n.º 2
0
    public MsgFaPai ProcessMsgFaPai(MsgFaPai msg)
    {
        msg.id       = turn;
        msg.turnNum  = turnNum;
        msg.canSkill = doSkillTime[turn] < maxSkillTime[turn] ? true : false;//表示对于当前玩家能否使用技能
        turnCount++;
        if (turnCount % 4 == 0)
        {
            turnCount = 0;
            turnNum++;
        }//判断下一次出牌是在第几轮
        int paiIdx = paiManager.FaPai(turn);

        if (paiIdx == -1)
        {
            //没牌了,结束游戏
            Over(-1, false);
        }

        msg.paiId = paiIdx;
        if (paiManager.HasHu(turn))
        {
            msg.isHu = true;
        }
        else
        {
            msg.isHu = false;
        }
        //广播
        return(msg);
    }
Exemplo n.º 3
0
    public static void MsgFaPai(ClientState c, MsgBase msgBase)
    {
        MsgFaPai msg    = (MsgFaPai)msgBase;
        Player   player = c.player;

        if (player == null)
        {
            return;
        }
        Room room = RoomManager.GetRoom(player.roomId);

        if (room == null)
        {
            return;
        }
        GameManager gameManager = room.gameManager;

        if (gameManager == null)
        {
            return;
        }
        msg = gameManager.ProcessMsgFaPai(msg);
        //广播
        gameManager.Broadcast(msg);
    }
Exemplo n.º 4
0
    /// <summary>
    /// 服务端接收到吃碰杠的协议,将本轮吃碰杠的结果进行广播,同时将服务端的牌进行同步
    /// 如果本轮没有进行吃碰杠,就轮到下一个玩家判断
    /// 如果有人进行了吃碰杠,就轮到下一个人进行发牌
    /// </summary>
    /// <param name="msgBase"></param>
    public void ProcessChiPengGang(MsgChiPengGang msg)
    {
        Broadcast(msg);//对得到的本轮结果进行广播
        //取消操作,就发送下一个吃碰杠协议
        if (msg.result == 0 && queueChiPengGang.Count > 0)
        {
            MsgChiPengGang msgChiPengGang = queueChiPengGang.Dequeue();
            Broadcast(msgChiPengGang);
            return;
        }

        switch (msg.result)
        {
        case 0:    //这里的queue一定为空,不需要进行任何的改变
            break;

        case 1:    //更新牌库
            if (paiManager.OnChi(msg.id, msg.paiId) == false)
            {
                Console.WriteLine("更新牌库吃出现了bug");
            }
            break;

        case 2:
            if (paiManager.OnPeng(msg.id, msg.paiId) == false)
            {
                Console.WriteLine("更新牌库碰出现了bug");
            }
            break;

        case 3:
            if (paiManager.OnGang(msg.id, msg.paiId) == false)
            {
                Console.WriteLine("更新牌库杠出现了bug");
            }
            break;
        }
        MsgFaPai msgFaPai = new MsgFaPai();

        turn     = (turn + 1) % 4;
        msgFaPai = ProcessMsgFaPai(msgFaPai);
        //广播
        Broadcast(msgFaPai);
    }
Exemplo n.º 5
0
    //显示
    public override void OnShow(params object[] args)
    {
        //寻找组件
        GetUIComponent();
        //生成gameManager类
        gameManager               = GameManager.GetInstance();
        gameManager.GamePanel     = this;
        gameManager.PlayerFactory = new PlayerFactory();
        //GameManager处理发过来的数据,这个一定要放在生成gameManager类后面
        MsgInitData msgInitData = (MsgInitData)args[0];

        gameManager.OnMsgInitData(msgInitData);
        //对按钮添加点击事件
        AddButtonClick();

        //网络协议监听
        NetManager.AddMsgListener("MsgFaPai", gameManager.OnMsgFaPai);
        NetManager.AddMsgListener("MsgChat", gameManager.OnMsgChat);
        NetManager.AddMsgListener("MsgChuPai", gameManager.OnMsgChuPai);
        NetManager.AddMsgListener("MsgChiPengGang", gameManager.OnMsgChiPengGang);
        NetManager.AddMsgListener("MsgChemistry", gameManager.OnMsgChemistry);
        NetManager.AddMsgListener("MsgMath", gameManager.OnMsgMath);
        NetManager.AddMsgListener("MsgQuit", gameManager.OnMsgQuit);
        NetManager.AddMsgListener("MsgComputerScience", gameManager.OnMsgComputerScience);
        //发送查询,发动查询要在处理InitData之后
        if (gameManager.isZhuang)
        {
            MsgFaPai msgFaPai = new MsgFaPai();
            NetManager.Send(msgFaPai);
        }//第一次出牌,只有庄家发送发牌协议
        //隐藏各种UI,对他们进行初始化
        InitUI();

        //生成背景图片
        GameObject bg = ResManager.LoadSprite("bg_game", 0);

        bg.name = "background";
        bg.transform.localScale = new Vector3(2, 2, 2);

        Audio.PlayLoop(Audio.bgGamePanel);
    }
Exemplo n.º 6
0
    /// <summary>
    /// 客户端处理发牌协议
    /// </summary>
    /// <param name="msgBase"></param>
    public void OnMsgFaPai(MsgBase msgBase)
    {
        Debug.Log("can receive msgFaPai");
        MsgFaPai msg = (MsgFaPai)msgBase;

        nowTurnid = msg.id;
        if (msg.paiId == -1)
        {
            Debug.Log("没牌了,游戏结束");
            PanelManager.Open <GameoverPanel>(-1, client_id, -1);
            PanelManager.Close("GamePanel");
            return;
        }

        gamePanel.TurnText = msg.turnNum; //设置现在是第几轮了
        gamePanel.TurnLight(msg.id);      //切换灯光
        if (msg.id == client_id)          //如果是玩家,就显示出牌/发动技能/胡的按钮
        {
            gamePanel.ChuPaiButton = true;
            if (msg.isHu)
            {
                gamePanel.HuButton = true;
            }
            if (msg.canSkill)
            {
                gamePanel.SkillButton = true;
            }
        }

        CreatePai(msg.paiId, msg.id);
        players[msg.id].SynHandPai(); //调整牌的顺序
        players[msg.id].PlacePai();   //调整牌的位置
        gamePanel.HandPaiCount    = new int[] { (int)gamePanel.numToDir[msg.id], players[msg.id].handPai.Count };
        gamePanel.PlayerStateText = "玩家" + (msg.id + 1) + "出牌";

        isChuPai = true;
        //开始计时,玩家出牌
        StartTimeCount();
    }
Exemplo n.º 7
0
    /// <summary>
    /// 判断是否触发了吃碰杠,如果触发了,就发送吃碰杠协议
    /// 否则,发送发牌协议,并广播
    /// </summary>
    /// <param name="paiIndex"></param>
    /// <param name="id"></param>
    public void ProcessMsgChuPai(MsgChuPai msg)
    {
        int paiIndex = msg.paiIndex; //牌在这个玩家的索引
        int id       = msg.id;       //出牌的玩家id

        Broadcast(msg);              //对客户端广播出牌协议,对出牌进行同步

        if (paiIndex == -1)
        {
            //服务端执行胡的操作,清空数据,写入数据库等
            Over(msg.id, false);
            return;
        }

        int paiId = paiManager.ChuPai(paiIndex, id);

        queueChiPengGang = paiManager.HasEvent(paiId, id); //检测是否有吃碰杠这件事

        if (queueChiPengGang.Count != 0)                   //一直发送吃碰杠协议,直到发完或者有人同意吃碰杠为止
        {
            Console.WriteLine("存在吃碰杠!");
            foreach (MsgChiPengGang item in queueChiPengGang)
            {
                Console.WriteLine(item.ToString());
            }
            MsgChiPengGang chiPengGang = queueChiPengGang.Dequeue();
            Broadcast(chiPengGang);//广播吃碰杠协议
        }
        else
        {
            MsgFaPai msgFaPai = new MsgFaPai();
            turn = (turn + 1) % 4;

            msgFaPai = ProcessMsgFaPai(msgFaPai);
            //广播
            Broadcast(msgFaPai);
        }
    }