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(); }