/// <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); }
/// <summary> /// 检查玩家是否超时 /// </summary> /// <param name="obj"></param> private void CheckPlayOverTime(object obj) { //超时62秒 int overSeconds = 63; do { overSeconds = Math.Abs(overSeconds); Thread.Sleep(TimeSpan.FromSeconds(overSeconds)); overSeconds = OverTimeSpan(overSeconds); //if (0<=overSeconds&&overSeconds<5) { // overSeconds = 5; //} } while (overSeconds < 2); if (InningeGame.NotEmptySeats().Count > 1 && !(CurrentSeat.IPlayer is null)) { int currentPlayerId = CurrentSeat.IPlayer.Id; do { NotifyRoomPlayers(WebscoketSendObjs.RoomMessage(0, "有玩家超时,将被自动踢出")); RemoveCurrentPlayer(); } while (currentPlayerId == CurrentSeat.IPlayer.Id); } CheckPlayOverTime(obj); }
public IActionResult CreateRoom(IFormCollection createRoom) { if (session.Keys.Contains("RoomId")) { throw new Exception("已经在一个房间里,不能再建"); } if (!decimal.TryParse(createRoom["TicketPrice"].ToString(), out decimal ticketPrice_)) { ticketPrice_ = 0; } string gameName_ = createRoom["gameProject"].ToString(); IGameProject gameProject_ = LoadGameProject(gameName_); IInningeGame inningeGame_ = new InningeGame(gameProject_); if (!int.TryParse(createRoom["PlayerCountTopLimit"].ToString(), out int limitCount_)) { limitCount_ = 1; } IRoomConfig roomConfig_ = new RoomConfig(inningeGame_) { Affiche = createRoom["Affiche"], Name = createRoom["Name"], PlayerCountTopLimit = limitCount_, SecretKey = createRoom["SecretKey"], TicketPrice = ticketPrice_ }; IRoom room_ = new Room(player, roomConfig_); BoundingEventOfRoom(room_); var gameCityId = createRoom["gameCityId"]; WriteToSeeion(gameCityId, room_); return(RedirectToAction("RoomsList")); }
public void PlayerChipin(int playerId) { // if (IsChipinClose) { if (CurrentStage != EStage.CanChipIning && CurrentStage != EStage.Computed) { NotifySinglePlayer(WebscoketSendObjs.RoomMessage(0, "未开局或结束,不能押底!"), playerId); return; } Seat seat = GetRoomSeatByPlayerId(playerId); if (seat.IsChipIned) { NotifySinglePlayer(WebscoketSendObjs.RoomMessage(0, "已经押底!"), playerId); NotifyRoomPlayers(new FreshGameFace(0)); return; } if (InningeGame.NotEmptySeats().Count < 2) { NotifySinglePlayer(WebscoketSendObjs.RoomMessage(0, "房间人数少于两人,不能押底"), playerId); NotifyRoomPlayers(new FreshGameFace(0)); return; } lock (seat) { if (seat.PlayerChipin(ChipInAmount, IsDecutMoneySuccess)) { AddPlaySeat(seat); AddCurrentTotal(ChipInAmount); } } CheckDateTime = DateTime.Now; NotifyRoomPlayers(new FreshGameFace(0)); NotifySinglePlayer(WebscoketSendObjs.RoomMessage(0, "已押底,等待庄家发牌!"), playerId); }
public ABCard PlayerGetOnePoker(int playerId) { Seat seat = GetSeatByPlayerId(playerId); var player = seat.IPlayer; int opponentId = GetOpponentId(playerId); Seat opponentSeat = GetSeatByPlayerId(opponentId); if (player.AccountNotEnough(ChipInAmount)) { NotifySinglePlayer(WebscoketSendObjs.Alert(player.Id, "账户余额不足"), player.Id); } if (null == seat.PlayOutPokers && null != seat.GetPoker) { return(null); } player.DecutMoney(ChipInAmount); lock (Locker) { if (Poker.RemaindCount > 0) { if (null == seat.PlayOutPokers) { var card = Poker.TackOut(1)[0]; seat.GetPoker = card; seat.CompareResult = null; NotifySinglePlayer(WebscoketSendObjs.FreshGameFace(player.Id), player.Id); return(card); } return(null); } InningeGame.GameOver();//触发游戏结束事件 return(null); } }
/// <summary> /// 满足最大轮次等条件时自动开牌 /// </summary> private void CompareAll() { if (CurrentStage != EStage.Running) { return; } CheckDateTime = DateTime.Now; List <Seat> notGaveupSeats = new List <Seat>(); if (JoinSeats.Count != 0) { CheckDateTime = DateTime.Now; for (int i = 0; i < JoinSeats.Count; i++) { if (JoinSeats[i].IsGaveUp) { continue; } notGaveupSeats.Add(JoinSeats[i]); } WinnerSeat = (notGaveupSeats.OrderByDescending(s => s.Pokers).ToList())[0]; } decimal playerWinAmount = 0; playerWinAmount = SystemTax(playerWinAmount); WinnerSeat.IPlayer.DecutMoney(playerWinAmount); FirstSeat = WinnerSeat;//新庄家 CurrentSeat = WinnerSeat; CurrentStage = EStage.Computed; NotifyRoomPlayers(new FreshGameFace(0)); InningeGame.GameOver(false, false);//触发游戏结束事件 }
public void GetEmptySeats() { IInningeGame inningeGame = new InningeGame(); List <ISeat> Seats = inningeGame.EmptySeats(); Assert.Empty(Seats); }
/// <summary> /// 清理双方出的牌 /// </summary> /// <param name="opponentPayOut_"></param> /// <param name="mePayOut_"></param> private void ClearPayOut() { var seats = InningeGame.NotEmptySeats(); foreach (var item in seats) { item.GameDateObj["playOutPokers"].Clear(); } }
private IInningeGame _IInningeGameCreator() { IInningeGame inningeGame = new InningeGame() { IGameProject = _gameProject }; return(inningeGame); }
public void ConnectIInngeGameAndIGameProject_startCheck() { IInningeGame inningeGame = new InningeGame(_gameProject); inningeGame.AddSet(1); inningeGame.Start(); _gameProjectFactory.Verify(g => g.CheckStart(It.IsNotNull <IInningeGame>())); }
public void Compare(int playerId) { if (CurrentStage != EStage.Running) { return; } Seat seat = (Seat)GetJionSeatByPlayerId(playerId); if (IsNotPassedCheck(seat)) { return; } bool iHadLook = seat.IsLooked; Seat opponetSeat = GetOnlyOpponentSeat(); if (null == opponetSeat) { return; } CheckDateTime = DateTime.Now; decimal chipInAmount = PreSeatAmount; if (iHadLook != PreSeatIsLook) { if (PreSeatIsLook) { chipInAmount = chipInAmount / 2; } else { chipInAmount = chipInAmount * 2; } } if (chipInAmount > LimitAmount) { chipInAmount = LimitAmount; } if (!IsDecutMoneySuccess(seat.IPlayer, chipInAmount)) { return; } AddCurrentTotal(chipInAmount); seat.PreChipInAmount = chipInAmount; seat.PreChipType = EChipinType.Compare; WinnerSeat = GetWinner(seat, opponetSeat); decimal playerWinAmount = 0; playerWinAmount = SystemTax(playerWinAmount); WinnerSeat.IPlayer.DecutMoney(-playerWinAmount); // IsWinnerStage = true;//? FirstSeat = WinnerSeat;//新庄家 CurrentSeat = WinnerSeat; CurrentStage = EStage.Computed; NotifyRoomPlayers(new ChipinAnimation(0, chipInAmount, playerId, EChipinType.Compare)); NotifyRoomPlayers(new FreshGameFace(0)); InningeGame.GameOver(false, false); }
public void ConnectIInngeGameAndIGameProject_AddSet() { IInningeGame inningeGame = new InningeGame(_gameProject); inningeGame.AddSet(1); _gameProjectFactory.Verify(g => g.BeforAddSeat(It.IsNotNull <IInningeGame>(), It.IsNotNull <EventArgs>()), "添加座位前"); _gameProjectFactory.Verify(p => p.AfterAddSeat(It.IsNotNull <object>(), It.IsNotNull <EventArgs>()), "添加座位后"); }
/// <summary> /// 清理双方出的牌 /// </summary> /// <param name="opponentPayOut_"></param> /// <param name="mePayOut_"></param> private void ClearPayOut() { var seats = InningeGame.NotEmptySeats(); foreach (var item in seats) { ((Seat)item).PlayOutPokers = null; } }
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); }
public void ConnectIInngeGameAndIGameProject_startDelegate() { IInningeGame inningeGame = new InningeGame(_gameProject); _gameProjectFactory.Setup(g => g.CheckStart(It.IsNotNull <IInningeGame>())).Returns(true); inningeGame.AddSet(1); inningeGame.Start(); _gameProjectFactory.Verify(g => g.GameStart(It.IsNotNull <IInningeGame>(), It.IsNotNull <EventArgs>())); }
/// <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; }
public void PlayerPlayOutOnePoker(int playerId) { Seat meSeat = GetSeatByPlayerId(playerId); int opponentId = GetOpponentId(playerId); Seat opponentSeat = GetSeatByPlayerId(opponentId); var opponentPayOut = opponentSeat.PlayOutPokers; var opponentCompareResult = opponentSeat.CompareResult; ABCard card = null; if (null == meSeat.GetPoker) { return; } card = meSeat.GetPoker; var meCompareResult = meSeat.CompareResult; ISeat winPlayer = null; if (card != null) { lock (Locker) { meSeat.GetPoker = null; meSeat.PlayOutPokers = card; if (opponentPayOut != null) { if (meSeat.PlayOutPokers.ComparedValue > opponentSeat.PlayOutPokers.ComparedValue) { winPlayer = meSeat; } else { winPlayer = opponentSeat; } meSeat.PlayOutPokers = null; meSeat.CompareResult = card; opponentSeat.CompareResult = opponentSeat.PlayOutPokers; opponentSeat.PlayOutPokers = null; winPlayer.IPlayer.DecutMoney(-ChipInAmount); foreach (var item in InningeGame.NotEmptySeats())//通知全部客户端刷新 { NotifySinglePlayer(WebscoketSendObjs.FreshGameFace(item.IPlayer.Id), item.IPlayer.Id); } } NotifySinglePlayer(WebscoketSendObjs.FreshGameFace(playerId), playerId); return; } } return; }
/// <summary> /// 获得对手的Id /// </summary> /// <param name="id_">自己的Id</param> /// <returns>对手Id</returns> public int GetOpponentId(int id_) { int opponentid = 0; var Seats = InningeGame.NotEmptySeats(); foreach (ISeat seat in Seats) { if (seat.IPlayer.Id != id_) { opponentid = seat.IPlayer.Id; break; } } return(opponentid); }
/// <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); }
public override void Stoped(object inningeGame, EventArgs e) { // if (!IsChipinClose) { if (CurrentStage == EStage.CanChipIning) { for (int i = 0; i < JoinSeats.Count(); i++) { var seat = JoinSeats[0]; if (seat.IsChipIned) { seat.IPlayer.DecutMoney(-seat.ChipinAmount); } } } InningeGame.GameOver(); base.Stoped(inningeGame, e); }
/// <summary> /// 开始游戏 /// </summary> /// <param name="sender">IInngineGame</param> /// <param name="e"></param> public override void GameStart(object inngineGame, EventArgs e) { InningeGame = (IInningeGame)inngineGame; Poker = new Poker(); //foreach (var seat in InningeGame.NotEmptySeats()) //{ // seat.GameDataObj.Add("getPokers", new List<object>()); // seat.GameDataObj.Add("playOutPokers", new List<object>()); // seat.GameDataObj.Add("compareResult", new List<object>()); //} foreach (var item in InningeGame.NotEmptySeats()) { PlayerGetOnePoker(item.IPlayer.Id); } base.GameStart(InningeGame, e); }
/// <summary> /// 开始游戏 /// </summary> /// <param name="sender">IInngineGame</param> /// <param name="e"></param> public override void GameStart(object inngineGame, EventArgs e) { InningeGame = (IInningeGame)inngineGame; Poker = new Poker(); foreach (var seat in InningeGame.NotEmptySeats()) { seat.GameDateObj.Add("getPokers", new List <object>()); seat.GameDateObj.Add("playOutPokers", new List <object>()); seat.GameDateObj.Add("compareResult", new List <object>()); } foreach (var item in InningeGame.NotEmptySeats()) { PlayerGetOnePoker(item.IPlayer.Id); } //Notify?.Invoke(WebscoketSendObjs.RoomMessage(0, "游戏开始了!")); base.GameStart(inngineGame, e); }
/// <summary> /// 获得房间下一个有玩家的座位 /// </summary> /// <param name="seat"></param> /// <returns></returns> private Seat GetNextRoomSeat(Seat seat) { var notEmptySeats = InningeGame.NotEmptySeats(); for (int i = 0; i < notEmptySeats.Count; i++) { if (notEmptySeats[i] == seat) { if (i == notEmptySeats.Count - 1) { return((Seat)notEmptySeats[0]); } else { return((Seat)notEmptySeats[i + 1]); } } } return(null); }
/// <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); }
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); }
public override void AfterSitDown(object inningeGame, EventArgs e) { NotifyRoomPlayers(new FreshSeatIco(InningeGame.NotEmptySeats().Count())); base.AfterSitDown(inningeGame, e); NotifyRoomPlayers(new FreshGameFace(0)); }
public IActionResult CreateRoom(IFormCollection createRoom) { if (session.Keys.Contains("RoomId")) { ViewBag.result = ""; return(View("Index_CreateRoom")); // throw new Exception("已经在一个房间里,不能再建"); } if (!decimal.TryParse(createRoom["TicketPrice"].ToString(), out decimal ticketPrice_)) { ticketPrice_ = 0; } if (ticketPrice_ > 0) { if (player.AccountNotEnough(ticketPrice_ * TOOMTICKETPRICEMULTIPLE)) { return(RedirectToRoute("default", new { controller = "Player", action = "Index_recharge" })); } } string gameName_ = createRoom["gameProject"].ToString(); IGameProject gameProject_ = LoadGameProject(gameName_); IInningeGame inningeGame_ = new InningeGame(gameProject_) { DCreatSeat = gameProject_.CreatSeat }; gameProject_.InningeGame = inningeGame_; if (!int.TryParse(createRoom["PlayerCountTopLimit"].ToString(), out int limitCount_)) { limitCount_ = 1; } if (ticketPrice_ > TOPTICKETPRICE) { ticketPrice_ = TOPTICKETPRICE; } if (ticketPrice_ < 0) { ticketPrice_ = 0; } var affiche = createRoom["Affiche"].ToString(); if (affiche.Length >= 150) { affiche = affiche.Substring(0, 150); } var name = createRoom["Name"].ToString(); if (name.Length >= 6) { name.Substring(0, 6); } IRoomConfig roomConfig_ = new RoomConfig(inningeGame_) { Affiche = affiche, Name = name, PlayerCountTopLimit = limitCount_, SecretKey = createRoom["SecretKey"], TicketPrice = ticketPrice_ }; player.DecutMoney(ticketPrice_ * TOOMTICKETPRICEMULTIPLE, "开房"); IRoom room_ = new Room(player, roomConfig_); BoundingEventOfRoom(room_); var gameCityId = createRoom["gameCityId"]; WriteToSeeion(gameCityId, room_); if (inningeGame_.IGameProject.PlayerCountLimit == 1) { return(RedirectToAction("JoinRoom")); } return(RedirectToAction("RoomsList")); }
/// <summary> /// 根据玩家Id获得对应座位 /// </summary> /// <param name="playerId"></param> /// <returns></returns> private Seat GetSeatByPlayerId(int playerId) { return((Seat)InningeGame.GetSeatByPlayerId(playerId)); }
/// <summary> /// 找到玩家座位 /// </summary> /// <param name="playerId"></param> /// <returns></returns> private Seat GetSeatByPlayerId(int playerId) { Seat seat = (Seat)InningeGame.GetSeatByPlayerId(playerId); return(seat); }