/// <summary> /// 洗牌,设置地主牌 /// </summary> public void Shuffle() { this.landPks.Clear(); this.randHeap.Clear(); //随机出来的牌堆,不包含地主牌 List <NetPoker> theap = new List <NetPoker>(); theap.AddRange(this.heap); do { int rand = new Random(this.GetRandomSeed()).Next(0, theap.Count); NetPoker pk = theap[rand]; theap.RemoveAt(rand); this.randHeap.Add(pk); } while (theap.Count > 3); this.landPks.AddRange(theap); }
//超时触发 private void Clock_OverTime(Clock clock) { var ply = clock.TagPlayer; switch (this.gameStage) { case GameStage.叫分阶段: this.SomeoneJiaofen(ply, 0); break; case GameStage.出牌阶段: var pks = new NetPoker[] { clock.TagPlayer.handPk[0] }; ply.handPk.RemoveAt(0); this.SomeoneOutPoker(ply, pks); break; case GameStage.接牌阶段: this.SomeoneOutPoker(ply, new NetPoker[0]); break; } }
//有玩家出牌处理函数 private void SomeoneOutPoker(Player ply, NetPoker[] pks) { if (pks == null) { pks = new NetPoker[0]; } //向其他玩家给出出牌信息 string json = JsonConvert.SerializeObject(new { ply.PlayerID, OutPks = pks }); this.SendBase(GameOrderType.出牌, json, ply.LastPlayer); this.SendBase(GameOrderType.出牌, json, ply.NextPlayer); //在服务器端删除扑克 ply.RemoveHandPk(pks); if (ply.handPk.Count == 0) { this.gameStage = GameStage.结束阶段; this.SomeoneWin(ply); return; } //如果出牌了,则将其设置为上一个出牌的玩家 if (pks.Length > 0) { this.lastSendPly = ply; } //如果上一个出牌的玩家是出牌玩家的下一家,则下一个玩家进入出牌阶段 if (lastSendPly == ply.NextPlayer) { this.gameStage = GameStage.出牌阶段; } //否则下一个玩家还得继续接牌 else { this.gameStage = GameStage.接牌阶段; } //重新计时,绑定下家 this.clock.TagPlayer = ply.NextPlayer; this.clock.ReStart(); }