/// <summary>
        /// 玩家获得一张牌
        /// </summary>
        /// <param name="playerId_">玩家Id</param>
        /// <returns>获得的牌</returns>
        public ABCard PlayerGetOnePoker(int playerId)
        {
            var seat         = InningeGame.GetSeatByPlayerId(playerId);
            var player       = seat.IPlayer;
            var opponentId   = GetOpponentId(playerId);
            var opponentSeat = InningeGame.GetSeatByPlayerId(opponentId);

            if (player.AccountNotEnough(ChipInAmount))
            {
                Notify?.Invoke(WebscoketSendObjs.Alert(player.Id, "账户余额不足"));
            }
            if (seat.GameDateObj["getPokers"].Count > 0)
            {
                return(null);
            }
            player.DecutMoney(ChipInAmount);
            if (Poker.RemaindCount > 0)
            {
                var card = Poker.TackOut(1)[0];
                seat.GameDateObj["getPokers"].Add(card);
                seat.GameDateObj["compareResult"].Clear();
                Notify?.Invoke(WebscoketSendObjs.FreshGameFace(player.Id));
                return(card);
            }
            InningeGame.GameOver();//触发游戏结束事件
            return(null);
        }
Beispiel #2
0
        public override void BeforPlayerLeave(object inningeGame, EventArgs e)
        {
            IPlayerJoinRoom player = ((PlayerEventArgs)e).Player;
            Seat            seat   = (Seat)InningeGame.GetSeatByPlayerId(player.Id);

            ChageRole(seat);
            RemoveFromJoinSeats(seat);
            base.BeforPlayerLeave(inningeGame, e);
        }
        /// <summary>
        /// 出牌或出牌后比较大小
        /// </summary>
        /// <param name="playerId">玩家Id</param>
        /// <param name="card_">一张牌</param>
        /// <returns>获胜玩家座位</returns>
        public void PlayerPlayOutOnePoker(int playerId)
        {
            var    meSeat                = InningeGame.GetSeatByPlayerId(playerId);
            var    opponentId            = GetOpponentId(playerId);
            var    opponentSeat          = InningeGame.GetSeatByPlayerId(opponentId);
            var    opponentPayOut        = opponentSeat.GameDateObj["playOutPokers"];
            var    opponentCompareResult = opponentSeat.GameDateObj["compareResult"];
            object card = null;

            //var card = CheckCardExist(playerId, card_);
            if (meSeat.GameDateObj["getPokers"].Count == 0)
            {
                return;
            }
            var mePoker = meSeat.GameDateObj["getPokers"];

            card = mePoker[0];
            var   mePayOut        = meSeat.GameDateObj["playOutPokers"];
            var   meCompareResult = meSeat.GameDateObj["compareResult"];
            ISeat winPlayer       = null;

            if (card != null)
            {
                mePoker.Remove(card);
                mePayOut.Add(card);
                if (opponentPayOut.Count > 0)
                {
                    if (((ABCard)mePayOut[0]).ComparedValue > ((ABCard)opponentPayOut[0]).ComparedValue)
                    {
                        winPlayer = meSeat;
                    }
                    else
                    {
                        winPlayer = opponentSeat;
                    }
                    mePayOut.Remove(card);
                    meCompareResult.Add(card);
                    opponentCompareResult.Add(opponentPayOut[0]);
                    opponentPayOut.Clear();
                    winPlayer.IPlayer.DecutMoney(-ChipInAmount);
                    foreach (var item in InningeGame.NotEmptySeats())//通知全部客户端刷新
                    {
                        // Notify?.Invoke(item.IPlayer.Id, "FreshGameFace");
                        Notify?.Invoke(WebscoketSendObjs.FreshGameFace(item.IPlayer.Id));
                    }// ClearPayOut(opponentPayOut, mePayOut);
                }
                Notify?.Invoke(WebscoketSendObjs.FreshGameFace(playerId));
                return;
            }
            return;
        }
        /// <summary>
        /// 检查玩家手里是否存在指定牌
        /// </summary>
        /// <param name="playerId_">玩家Id</param>
        /// <param name="card_">牌</param>
        /// <returns></returns>
        private ABCard CheckCardExist(int playerId_, ABCard card_)
        {
            var    seat = InningeGame.GetSeatByPlayerId(playerId_);
            ABCard card = null;

            foreach (ABCard item in seat.GameDateObj["getPokers"])
            {
                if (item.Name == card_.Name && item.CardColor == card_.CardColor)
                {
                    card = item;
                    break;
                }
            }
            return(card);
        }
        /// <summary>
        /// 刷新玩家数据
        /// </summary>
        /// <param name="playerId">玩家Id</param>
        /// <returns>发送到客户端玩家数据</returns>
        public object FreshGameFace(int playerId)
        {
            var seat = InningeGame.GetSeatByPlayerId(playerId);
            //var seats = InningeGame.NotMyEmtySteats(playerId);
            Dictionary <int, object> otherPlayerPokers = new Dictionary <int, object>();
            var    opponentId   = GetOpponentId(playerId);
            var    opponentSeat = InningeGame.GetSeatByPlayerId(opponentId);
            object opponetPoker = new { Name = "", CardColor = "" };

            if (opponentSeat.GameDateObj["compareResult"].Count == 1)
            {
                opponetPoker = opponentSeat.GameDateObj["compareResult"][0];
            }
            object myPoker_ = new { Name = "", CardColor = "" };

            if (seat.GameDateObj["getPokers"].Count == 1)
            {
                myPoker_ = seat.GameDateObj["getPokers"][0];
            }
            object myComparePoker_ = new { Name = "", CardColor = "" };

            if (seat.GameDateObj["compareResult"].Count == 1)
            {
                myComparePoker_ = seat.GameDateObj["compareResult"][0];
            }
            object myPayOutPoker_ = new { Name = "", CardColor = "" };

            if (seat.GameDateObj["playOutPokers"].Count == 1)
            {
                myPayOutPoker_ = seat.GameDateObj["playOutPokers"][0];
            }
            var GameFace = new
            {
                myPoker           = myPoker_,
                myPayOutPoker     = myPayOutPoker_,
                myComparePoker    = myComparePoker_,
                otherPlayersPoker = opponetPoker
            };

            return(GameFace);
        }
 /// <summary>
 /// 根据玩家Id获得对应座位
 /// </summary>
 /// <param name="playerId"></param>
 /// <returns></returns>
 private Seat GetSeatByPlayerId(int playerId)
 {
     return((Seat)InningeGame.GetSeatByPlayerId(playerId));
 }
        public object FreshGameFace(int playerId)
        {
            List <object> seats     = CreatClientSeatsInfo(playerId);
            decimal       myBalance = 0;
            var           mySeat    = InningeGame.GetSeatByPlayerId(playerId);

            if (!(mySeat is null || mySeat.IPlayer is null))
            {
                myBalance = mySeat.IPlayer.Account;
            }
            int winnerid = 0;

            if (!((this.WinnerSeat is null) || (WinnerSeat.IPlayer is null)))
            {
                winnerid = WinnerSeat.IPlayer.Id;
            }
            int joinSeatsCount = 0;

            if (!(JoinSeats is null))
            {
                joinSeatsCount = this.JoinSeats.Count();
            }
            int firstId   = 0;
            int currentId = 0;

            if (!(this.FirstSeat is null || FirstSeat.IPlayer is null))
            {
                firstId = FirstSeat.IPlayer.Id;
            }
            if (!(this.CurrentSeat is null || CurrentSeat.IPlayer is null))
            {
                currentId = this.CurrentSeat.IPlayer.Id;
            }
            int  waitSecond = 0;
            bool canCompare = false;

            if (CurrentStage == EStage.Running && GetActiveSeatCount() == 2)
            {
                canCompare = true;
            }
            waitSecond = (DateTime.Now - CheckDateTime).Seconds;
            var PublicInfo = new {
                MyId = playerId,
                /// 每次打底(入局)积分
                ChipInAmount = this.ChipInAmount,
                /// 封顶积分
                LimitAmount = this.LimitAmount,
                /// 每局游戏轮次
                DefaultTurnCount = this.DefaultTurnCount,
                /// 一局的起始位置
                FirstSeatPlayerId = firstId,
                /// 但前底池积分
                CurrentTotal = this.CurrentTotal,
                /// 当前轮次
                CurrentTurn = this.CurrentTurn,
                /// 上家是否看牌
                PreSeatIsLook = this.PreSeatAmount,
                /// 上家下注积分
                PreSeatAmount = this.PreSeatAmount,
                /// 当前座位
                CurrentSeatPlayId = currentId,
                /// 赢家座位
                WinnerSeatPlayerId = winnerid,
                ///是否结算后期间
                //  IsWinnerStage = this.IsWinnerStage,
                ///打底关闭
                //    IsChipinClose = this.IsChipinClose,

                //可以比牌
                CanCompare = canCompare,
                //阶段
                CurrentStage = this.CurrentStage,
                ///房价玩家总数
                playerCount = this.InningeGame.NotEmptySeats().Count(),
                ///已打底数
                playerChipinCount = joinSeatsCount,
                ///等待玩家操作秒数
                WaitSecond = waitSecond,
                //玩家余额
                Balance = myBalance
            };
            var GameFace = new {
                PublicInfo = PublicInfo,
                Seats      = seats
            };

            return(GameFace);
        }
Beispiel #8
0
        /// <summary>
        /// 找到玩家座位
        /// </summary>
        /// <param name="playerId"></param>
        /// <returns></returns>
        private Seat GetSeatByPlayerId(int playerId)
        {
            Seat seat = (Seat)InningeGame.GetSeatByPlayerId(playerId);

            return(seat);
        }