コード例 #1
0
        public ERoomUser PeekAvaliblePlayer(EGameInfo gi)
        {
            ERoomUser result = null;

            //只剩一个人时,比赛也是结束了
            if (PlayerQueue.Count + PlayerDoneQueue.Count == 1)
            {
                return(null);
            }

            while (PlayerQueue.Count > 0)
            {
                var Player = PlayerQueue.Peek();
                if (Player.PlayerStauts == PlayerStauts.PrepareBet)
                {
                    result = Player;
                    break;
                }
                else
                {
                    PlayerQuitQueue.Enqueue(PopPlayer(Player.PlayerStauts));
                }
            }


            return(null);
        }
コード例 #2
0
        public override List <IGameMessage> HandleData(GameUserSession session, dataPlayerAddCoins Data)
        {
            List <IGameMessage> msgList = new List <IGameMessage>();
            GameManager         gm      = session.GameManager;

            EGameInfo gi       = gm.GameDataHandle.GetGameInfo();
            var       nextUser = gm.PlayerAddCoins(gi, Data.OpenId, Data.Coins, 0);

            if (nextUser == null)
            {
                gi = gm.GameEndShowCard(gi, true);
            }

            var msg = gm.WaitNextPlayer(gi);

            if (msg != null)
            {
                msgList.Add(msg);
            }
            else
            {
                var passMsg = GameMessageHandle.CreateResultPlayerAddCoinsMsg(gm.RoomCode, Data.OpenId, gi.CurBetUserOpenId, Data.Coins);
                msgList.Add(passMsg);
            }
            return(msgList);
        }
コード例 #3
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public ERoomUser PlayerAddCoins(EGameInfo gi, string userOpenId, decimal coins, decimal diff)
        {
            //队列重新排列
            GameDataHandle.ReloadPlayer();

            //获取当前玩家,并修改状态
            var player = this.GameDataHandle.PopPlayer(PlayerStauts.AddCoins);

            player.PlayerStauts = PlayerStauts.AddCoins;
            RoomUserRedis.SetPlayer(RoomCode, player);

            //加注
            ECoinDetail cd = new ECoinDetail
            {
                Coins      = coins,
                Diff       = diff,
                PileNo     = (int)gi.GameTurn,
                UserOpenId = userOpenId,
                CoinType   = CoinType.Add
            };

            GameDataHandle.AddPlayerCoins(cd);

            //重新获取和设定下一个玩家(必须有下一个玩家,没有则直接结束?)
            var nextUser = GameDataHandle.PeekAvaliblePlayer(gi);

            if (nextUser != null)
            {
                gi.CurBetUserOpenId = nextUser.UserOpenId;
                GameDataHandle.SetGameInfo(gi);
            }

            return(nextUser);
        }
コード例 #4
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
 public IGameMessage WaitNextPlayer(EGameInfo gi)
 {
     if (gi.GameStatus == GameModel.Enums.GameStatus.GameEndShowingCard)
     {
         return(GameMessageHandle.CreateGameEndShowCardMsg(this.RoomCode));
     }
     else
     {
         UserWaitBetTask waitTask = UserWaitBetTask.CreateNewInstance(_Session.GameServer, gi.CurBetUserOpenId);
         waitTask.Run(GameConfig.Turn_Wait_Server);
     }
     return(null);
 }
コード例 #5
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public OutAPIResult SetGameInfo(EGameInfo gi)
        {
            OutAPIResult r = new OutAPIResult();

            try
            {
                r = GameDataHandle.SetGameInfo(gi);
            }
            catch (Exception ex)
            {
                r.ErrorMsg = ex.Message;
            }
            return(r);
        }
コード例 #6
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public EGameInfo GetGameBasic()
        {
            EGameInfo gi = null;

            try

            {
                return(GameDataHandle.GetGameInfo());
                //  gi = GameRedis.GetGameBasic(RoomCode).resultObj;
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
コード例 #7
0
        public EOneGame GetGameData(bool NeedRefrush = false)
        {
            if (NeedRefrush)
            {
                var       roomCode  = _OneGame.GameInfo.RoomCode;
                EGameInfo basicInfo = GameRedis.GetGameBasic(roomCode).resultObj;
                _OneGame.GameInfo = basicInfo;

                _OneGame.PlayerList = RoomUserRedis.GetAllPlayer(roomCode).resultList;


                _OneGame.TableCardList = _CardDataManager.TableCards;
            }
            return(_OneGame);
        }
コード例 #8
0
        public OutAPIResult SetGameInfo(EGameInfo gi)
        {
            OutAPIResult r = new OutAPIResult();

            try
            {
                GameRedis.SetGameBasic(gi);
                _OneGame.GameInfo = gi;
            }
            catch (Exception ex)
            {
                r.ErrorMsg = ex.Message;
            }
            return(r);
        }
コード例 #9
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        /// <summary>
        /// 获取下个游戏状态
        /// </summary>
        public GameStatus GetNextGameStatus(EGameInfo gi, bool NeedSave = false)
        {
            //检查游戏状态

            var gs = gi.GameStatus;

            GameStatus nextStatus = gs;

            switch (gs)
            {
            case GameStatus.NoGame:
                nextStatus = GameStatus.WaitPlayer;
                break;

            case GameStatus.WaitPlayer:
                nextStatus = GameStatus.StartShuffle;
                break;

            case GameStatus.StartShuffle:
                nextStatus = GameStatus.Shuffling;
                break;

            case GameStatus.Shuffling:
                nextStatus = GameStatus.ShuffleEnd;
                break;

            case GameStatus.ShuffleEnd:
                nextStatus = GameStatus.Playing;
                break;

            case GameStatus.Playing:
                nextStatus = GameStatus.GameEndSettlement;
                break;

            case GameStatus.GameEndSettlement:
                nextStatus = GameStatus.StartShuffle;
                break;
            }
            if (NeedSave)
            {
                gi.GameStatus = nextStatus;
                this.SetGameInfo(gi);
            }

            return(nextStatus);
        }
コード例 #10
0
        /// <summary>
        /// 一局开始缓存玩家,根据GameInfo需要对玩家重新排列
        /// </summary>
        /// <param name="PlayerList"></param>
        public void SetCachePlayer(List <ERoomUser> PlayerList, EGameInfo gi)
        {
            InitQueue();

            var p = PlayerList[gi.FirstPlayerIndex];

            PlayerQueue.Enqueue(p);
            int i = gi.FirstPlayerIndex + 1;

            while (PlayerQueue.Count < PlayerList.Count)
            {
                if (i == PlayerList.Count)
                {
                    i = 0;
                }
                p = PlayerList[i];
                PlayerQueue.Enqueue(p);
            }
        }
コード例 #11
0
        public void Run(int AfterSec, GameServer GameServer, EGameInfo gi)
        {
            if (gi.GameTurn == GameModel.Enums.GameTurn.Send3Card)
            {
                AfterSec = AfterSec * 3;
            }

            Task Task = new Task(() =>
            {
                // Thread.Sleep(AfterSec * 1000);
                SpinWait.SpinUntil(() =>
                {
                    return(false);
                }, AfterSec * 1000);

                GameTaskManager.WaitBetUser(GameServer, gi.CurBetUserOpenId);
            });

            Task.Start();
        }
コード例 #12
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public EGameInfo PrePareNewGameInfo(string RoomCode)
        {
            EGameInfo gi = new EGameInfo(RoomCode)
            {
                RoomCode           = RoomCode,
                BigBetUserOpenId   = "",
                DotUserOpenId      = "",
                CurBetUserOpenId   = "",
                FirstPlayerIndex   = -1,
                SmallBetUserOpenId = "",
                GameStatus         = GameStatus.NoGame,
                GameTurn           = GameTurn.NotStart,
                CurRequireCoins    = 0,
            };

            gi.FirstPlayerIndex = 0;
            gi.GameStatus       = GameStatus.Shuffling;
            gi.GameTurn         = GameTurn.NotStart;
            return(gi);
        }
コード例 #13
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public EGameInfo GameEndShowCard(EGameInfo gameInfo = null, bool NeedSave = false)
        {
            EGameInfo gi = null;

            if (gameInfo == null)
            {
                gi = this.GameDataHandle.GetGameInfo();
            }
            else
            {
                gi = gameInfo;
            }
            gi.CurBetUserOpenId = "";
            gi.GameStatus       = GameStatus.GameEndShowingCard;
            gi.GameTurn         = GameTurn.End;

            if (NeedSave)
            {
                this.GameDataHandle.SetGameInfo(gi);
            }
            return(gi);
        }
コード例 #14
0
        public EGameInfo MoveNextTurn(EGameInfo gi, bool needSave = false)
        {
            if (gi.GameTurn != GameTurn.End)
            {
                if (gi.GameTurn == GameTurn.FourthTurn)
                {
                    gi.GameTurn = GameTurn.End;
                }
                else
                {
                    gi.GameTurn++;
                }


                gi.CurRequireCoins = 0;
            }

            if (needSave)
            {
                this.SetGameInfo(gi);
            }
            return(gi);
        }
コード例 #15
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public void PlayerFollow(EGameInfo gi, string userOpenId, decimal FollowCoins)
        {
            try
            {
                var player = this.GameDataHandle.PopPlayer(PlayerStauts.Follow);
                player.PlayerStauts = PlayerStauts.Follow;
                RoomUserRedis.SetPlayer(RoomCode, player);

                //加注
                ECoinDetail cd = new ECoinDetail
                {
                    Coins      = FollowCoins,
                    Diff       = 0,
                    PileNo     = (int)gi.GameTurn,
                    UserOpenId = userOpenId,
                    CoinType   = CoinType.Follow,
                };
                GameDataHandle.AddPlayerCoins(cd);
            }
            catch (Exception ex)
            {
                //错误需要将改玩家剔除
            }
        }
コード例 #16
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public List <ECard> DealCard(EGameInfo gi)
        {
            List <ECard> list = null;

            if (gi.GameTurn == GameTurn.Send3Card)
            {
                list = new List <ECard>();
                for (int i = 0; i < 3; i++)
                {
                    list.Add(this.CardDataManager.TableCards[i]);
                }
            }
            else if (gi.GameTurn == GameTurn.Send4Card)
            {
                list = new List <ECard>();
                list.Add(this.CardDataManager.TableCards[3]);
            }
            else if (gi.GameTurn == GameTurn.Send5Card)
            {
                list = new List <ECard>();
                list.Add(this.CardDataManager.TableCards[4]);
            }
            return(list);
        }
コード例 #17
0
        public static ResultDealCard CreateDealCardMsg(string RoomCode, List <ECard> cardList, EGameInfo gi)
        {
            ResultDealCard msg = new ResultDealCard(RoomCode);

            msg.NextUserOpenId = gi.CurBetUserOpenId;
            msg.DealCardList   = cardList;
            return(msg);
        }
コード例 #18
0
        public static void SyncTask_DealCardDone(GameUserSession session, EGameInfo gi)
        {
            DealCardDoneTask syncTask = new DealCardDoneTask();

            syncTask.Run(GameConfig.Send_OneCard_Sec, session.GameServer, gi);
        }
コード例 #19
0
ファイル: GameManager.cs プロジェクト: flysnoopy1984/IQianBa
        public SResult <EGameInfo> GetFirstDotAndBet(string roomCode, List <ERoomUser> playerList)
        {
            SResult <EGameInfo> result = new SResult <EGameInfo>();

            try
            {
                var       CurDIndex = -1;
                var       bIndex    = -1;
                var       sIndex    = -1;
                var       cIndex    = -1;
                EGameInfo gi        = this.PrePareNewGameInfo(roomCode);


                if (gi == null || playerList == null)
                {
                    result.ErrorMsg = "没有获取玩家信息";
                    return(result);
                }

                if (string.IsNullOrEmpty(gi.DotUserOpenId))
                {
                    gi.DotUserOpenId = playerList[0].UserOpenId;
                }

                for (int i = 0; i < playerList.Count; i++)
                {
                    if (playerList[i].UserOpenId == gi.DotUserOpenId)
                    {
                        CurDIndex = i + 1;
                        if (CurDIndex == playerList.Count)
                        {
                            CurDIndex = 0;
                        }

                        sIndex = CurDIndex + 1;
                        if (sIndex == playerList.Count)
                        {
                            sIndex = 0;
                        }

                        bIndex = sIndex + 1;
                        if (bIndex == playerList.Count)
                        {
                            bIndex = 0;
                        }

                        cIndex = bIndex + 1;
                        if (cIndex == playerList.Count)
                        {
                            cIndex = 0;
                        }
                    }
                }
                gi.DotUserOpenId      = playerList[CurDIndex].UserOpenId;
                gi.BigBetUserOpenId   = playerList[bIndex].UserOpenId;
                gi.SmallBetUserOpenId = playerList[sIndex].UserOpenId;
                gi.CurBetUserOpenId   = playerList[cIndex].UserOpenId;

                gi.FirstPlayerIndex = cIndex;

                result.Instance = gi;
            }
            catch (Exception ex)
            {
                result.ErrorMsg = ex.Message;
            }
            return(result);
        }