Ejemplo n.º 1
0
    /// <summary>
    /// 客户端接收到吃碰杠的协议
    /// 第一次收到协议,就让玩家操作是否进行吃碰杠,并将结果传给服务端
    /// 第二次收到协议,同步结果
    /// 这两次协议都需要服务端广播
    /// </summary>
    /// <param name="msgBase"></param>
    public void OnMsgChiPengGang(MsgBase msgBase)
    {
        MsgChiPengGang msg = (MsgChiPengGang)msgBase;

        if (msg.result == -1)//第一次收到协议
        {
            StartTimeCount();
            nowTurnid = msg.id;
            isChuPai  = false;
            players[nowTurnid].msgChiPengGang = msg;
            gamePanel.TurnLight(nowTurnid);
            if (nowTurnid == client_id)
            {
                bool[] isChiPengGang = msg.isChiPengGang;
                if (isChiPengGang[1])
                {
                    gamePanel.ChiButton = true;
                }
                if (isChiPengGang[2])
                {
                    gamePanel.PengButton = true;
                }
                if (isChiPengGang[3])
                {
                    gamePanel.GangButton = true;
                }
            }
            gamePanel.PlayerStateText = "玩家" + (msg.id + 1) + "吃碰杠";
        }
        else
        {
            switch (msg.result)
            {
            case 0:    //取消操作,不需要任何改变
                break;

            case 1:
                players[msg.id].OnChi(msg.paiId);
                break;

            case 2:
                players[msg.id].OnPeng(msg.paiId);
                break;

            case 3:
                players[msg.id].OnGang(msg.paiId);
                break;
            }
            gamePanel.HandPaiCount = new int[] { (int)gamePanel.numToDir[msg.id], players[msg.id].handPai.Count };
        }
    }
Ejemplo n.º 2
0
 /// <summary>
 /// 没有参数代表强制执行吃碰杠操作
 /// </summary>
 /// <param name="index">0代表什么都不做,1代表吃,2代表碰,3代表杠</param>
 public void ChiPengGang(int index = 0)
 {
     if (msgChiPengGang.isChiPengGang[index])//代表相关操作允许
     {
         msgChiPengGang.result = index;
     }
     else
     {//异常情况
         msgChiPengGang.result = 0;
         Debug.Log("非法操作!!!!!");
     }
     gamePanel.ChiButton        = false;
     gamePanel.PengButton       = false;
     gamePanel.GangButton       = false;
     gameManager.startTimeCount = false;
     NetManager.Send(msgChiPengGang);
     msgChiPengGang = null;
 }
Ejemplo n.º 3
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);
    }
Ejemplo n.º 4
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);
        }
    }
Ejemplo n.º 5
0
    public static void MsgChiPengGang(ClientState c, MsgBase msgBase)
    {
        MsgChiPengGang msg    = (MsgChiPengGang)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;
        }
        gameManager.ProcessChiPengGang(msg);
    }
Ejemplo n.º 6
0
    /// <summary>
    /// 判断是否触发碰杠胡的条件
    /// </summary>
    /// <param name="paiId">这个牌的索引</param>
    /// <param name="id">打出这张牌的玩家的id</param>
    /// <returns>null代表没有触发条件,</returns>
    public Queue <MsgChiPengGang> HasEvent(int paiId, int id)
    {
        Queue <MsgChiPengGang> queue = new Queue <MsgChiPengGang>();

        for (int i = id + 1; i < id + 4; i++)
        {
            int    panId = i % 4;
            bool[] res   = new bool[4];
            res[0] = true;                  //代表永远可以取消吃碰杠操作
            res[1] = HasChi(paiId, panId);  //检测吃
            res[2] = HasPeng(paiId, panId); //检测碰
            res[3] = HasGang(paiId, panId); //检测杠
            if (res[1] | res[2] | res[3])   //至少有一个为true,就可以发送消息
            {
                MsgChiPengGang msg = new MsgChiPengGang();
                msg.isChiPengGang = res;
                msg.id            = panId;
                msg.paiId         = paiId;
                msg.result        = -1;
                queue.Enqueue(msg);
            }
        }
        return(queue);
    }