Example #1
0
        public void StartNewGame()
        {
            mahjongLogic = new MahjongLogic();
            mahjongLogic.StartGamingThread();
            mahjongLogic.NewGame_Handle(25000, 4);
            mahjongLogic.NextScene();

            // Set callback
            mahjongLogic.PlayerActionResponseCallback += PlayerActionResponseCallback;
            mahjongLogic.PlayerActionAcceptedCallback += PlayerActionAcceptedCallback;

            // Initialize the players
            grdsHandcard     = new Grid[] { grdHandcardSelf, grdHandcardDownwind, grdHandcardOppositewind, grdHandcardUpwind };
            grdsRivercard    = new Grid[] { grdRiverSelf, grdRiverDownwind, grdRiverOppositewind, grdRiverUpwind };
            lblsPlayerPoint  = new Label[] { lblPointSelf, lblPointDownwind, lblPointOppsitewind, lblPointUpwind };
            lblsPlayerWind   = new Label[] { lblWindSelf, lblWindDownwind, lblWindOppositewind, lblWindUpwind };
            grdsPlayerAction = new Grid[] { grdActionSelf, grdActionDownwind, grdActionOppositewind, grdActionUpwind };
            grdsFuru         = new Grid[] { grdFuruEast, grdFuruSouth, grdFuruWest, grdFuruNorth };

            // Clear
            foreach (Grid panel in grdsPlayerAction)
            {
                panel.Children.Clear();
            }
        }
        public void TestFuruRon()
        {
            Semaphore semaphore = new Semaphore(0, 4);

            LoveLive_MahjongClass.InitializeMahjongClass();

            MahjongLogic mahjongLogic = new MahjongLogic();

            // 反射,强行配置玩家顺序
            FieldInfo field = mahjongLogic.GetType().GetField("order", BindingFlags.NonPublic | BindingFlags.Instance);

            field.SetValue(mahjongLogic, new int[] { 0, 1, 2, 3 });
            field = mahjongLogic.GetType().GetField("playing", BindingFlags.NonPublic | BindingFlags.Instance);
            field.SetValue(mahjongLogic, 3);

            // 配置一些可以副露和荣和的牌组
            // 玩家A(等待杠Ruby)
            mahjongLogic.player_info[0].card_onhand = new List <MahjongCard>()
            {
                LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby),
                LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby),
                LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby),
            };

            // 玩家B(等待吃Ruby(年级))
            mahjongLogic.player_info[1].card_onhand = new List <MahjongCard>()
            {
                LoveLive_MahjongClass.GetCard(MahjongCardName.Yoshiko),
                LoveLive_MahjongClass.GetCard(MahjongCardName.Hanamaru),
            };

            // 玩家C(等待荣Ruby)
            mahjongLogic.player_info[2].waiting.Add(LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby));

            // 当前D (打出了Ruby)
            mahjongLogic.player_info[3].card_played.Add(LoveLive_MahjongClass.GetCard(MahjongCardName.Ruby));

            // 设置回调
            mahjongLogic.PlayerActionResponseCallback = delegate(List <PlayerAction> actions)
            {
                foreach (PlayerAction act in actions)
                {
                    Trace.WriteLine(act.ToString());
                }
                semaphore.Release();
            };

            mahjongLogic.PlayerActionAcceptedCallback = delegate(int playerId, bool accept)
            {
                Trace.WriteLine($"ID = {playerId}, Accept = {accept}");
                semaphore.Release();
            };

            // 强行设定状态机
            mahjongLogic.StartGamingThread();
            mahjongLogic.gameStateMachine.SetState(MahjongLogic.GameStateMachine.State.SendPlayerAction);
            mahjongLogic.gameStateMachine.ReleaseSemaphore();

            // 等待回调执行完毕后再继续
            semaphore.WaitOne();

            // 模拟发送消息
            mahjongLogic.SendPlayerAction(new PlayerAction(2)
            {
                actionType = PlayerActionType.Cancel
            });
            //mahjongLogic.SendPlayerAction(new PlayerAction(1) { actionType = PlayerActionType.Cancel });
            mahjongLogic.SendPlayerAction(new PlayerAction(0)
            {
                actionType = PlayerActionType.Pong
            });

            // 等待回调执行完毕后再继续
            semaphore.WaitOne();
            semaphore.WaitOne();
            semaphore.WaitOne();
        }