From 8c4c138676ad31dfb6336b4bf4e0ddc302e853af Mon Sep 17 00:00:00 2001 From: Cyl18 Date: Sun, 18 Feb 2018 02:50:07 +0800 Subject: [PATCH] update fakeplayer --- CardSharp.GUI/Program.cs | 34 ++++++++++++-------------- CardSharp/GameComponents/FakePlayer.cs | 12 ++++++--- CardSharp/GameSteps/CommandParser.cs | 19 +++++++------- CardSharp/GameSteps/LandlordDiscuss.cs | 4 +-- CardSharp/GameSteps/WaitingParser.cs | 2 +- 5 files changed, 37 insertions(+), 34 deletions(-) diff --git a/CardSharp.GUI/Program.cs b/CardSharp.GUI/Program.cs index 3ecb947..457fe30 100644 --- a/CardSharp.GUI/Program.cs +++ b/CardSharp.GUI/Program.cs @@ -14,31 +14,26 @@ class Program { static void Main(string[] args) { - var count = 0; - //Parallel.For(0, 2000, (i) => { RunTest(ref count); }); - for (int i = 0; i < 25000; i++) - { - RunTest(ref count); - } + + RunTest(); + + } private static readonly Random Rng = new Random("fork you kamijoutoma".GetHashCode()); - private static void RunTest(ref int count) + private static void RunTest() { - var sw = Stopwatch.StartNew(); var desk = Desk.GetOrCreateDesk(Rng.NextDouble().ToString(CultureInfo.InvariantCulture)); - desk.AddPlayer(new FakePlayer()); - desk.AddPlayer(new FakePlayer()); - desk.AddPlayer(new FakePlayer()); + desk.AddPlayer(new Player("1")); + desk.AddPlayer(new Player("2")); + desk.AddPlayer(new Player("3")); - //Task.Run(() => { ShowMessage(desk); }); - - //ParseMessage(desk); desk.Start(); - Console.WriteLine($"Test successful: {count} / 20000, used {sw.ElapsedMilliseconds}ms"); - //Console.WriteLine(desk.Message); - - Interlocked.Increment(ref count); + Task.Run(() => { ShowMessage(desk); }); + + ParseMessage(desk); + + } private static void ParseMessage(Desk desk) @@ -47,6 +42,7 @@ private static void ParseMessage(Desk desk) { var line = Console.ReadLine(); desk.ParseCommand(desk.CurrentPlayer.PlayerId, line); + Thread.Sleep(10); } } @@ -60,7 +56,7 @@ private static void ShowMessage(Desk desk) foreach (var player in desk.Players) ShowMessage(player, $"[{player.PlayerId}]: "); - //Thread.Sleep(10); + Thread.Sleep(10); } } diff --git a/CardSharp/GameComponents/FakePlayer.cs b/CardSharp/GameComponents/FakePlayer.cs index b5c6b68..ddba465 100644 --- a/CardSharp/GameComponents/FakePlayer.cs +++ b/CardSharp/GameComponents/FakePlayer.cs @@ -8,15 +8,21 @@ namespace CardSharp.GameComponents { public class FakePlayer : Player { - public FakePlayer() : base(GenerateName()) + public FakePlayer(Desk desk) : base(GenerateName(desk)) { HostedEnabled = true; } private static readonly Random Rng = new Random("fork you kamijoutoma".GetHashCode()); - private static string GenerateName() + + private static string GenerateName(Desk desk) { - return $"机器人{Rng.Next(100)}"; + while (true) + { + var name = $"机器人{Rng.Next(100)}"; + if (desk.Players.Any(p => p.PlayerId == name)) continue; + return name; + } } public override string ToAtCode() diff --git a/CardSharp/GameSteps/CommandParser.cs b/CardSharp/GameSteps/CommandParser.cs index 1d1da7b..677d7ff 100644 --- a/CardSharp/GameSteps/CommandParser.cs +++ b/CardSharp/GameSteps/CommandParser.cs @@ -98,6 +98,7 @@ public void Parse(Desk desk, Player player, string command) else { AnalyzeGiveUpAndMoveNext(desk); + player = desk.CurrentPlayer; desk.BoardcastCards(); } @@ -119,12 +120,7 @@ public void Parse(Desk desk, Player player, string command) if (player.PublicCards) desk.AddMessageLine($"明牌:{player.Cards.ToFormatString()}"); AnalyzeGiveUpAndMoveNext(desk); - - if (desk.LastSuccessfulSender == desk.CurrentPlayer) - { - desk.CurrentRule = null; - desk.LastCards = null; - } + player = desk.CurrentPlayer; desk.BoardcastCards(); } @@ -139,10 +135,15 @@ public void Parse(Desk desk, Player player, string command) return; } + if (desk.LastSuccessfulSender == desk.CurrentPlayer) { + desk.CurrentRule = null; + desk.LastCards = null; + } + if (RunHostedCheck(desk)) return; - - RunAutoPassCheck(desk); + if (desk.CurrentRule != null) + RunAutoPassCheck(desk); } private void RunAutoPassCheck(Desk desk) @@ -152,7 +153,7 @@ private void RunAutoPassCheck(Desk desk) if (!exists) { - desk.AddMessageLine($"{cp.ToAtCode()} 没有检测到你想要出的牌, 已为你自动pass."); + desk.AddMessageLine($"{cp.ToAtCode()} 没有检测到你能出的牌, 已为你自动pass."); Parse(desk, cp, "pass"); } } diff --git a/CardSharp/GameSteps/LandlordDiscuss.cs b/CardSharp/GameSteps/LandlordDiscuss.cs index b26fab4..f9b0519 100644 --- a/CardSharp/GameSteps/LandlordDiscuss.cs +++ b/CardSharp/GameSteps/LandlordDiscuss.cs @@ -85,10 +85,10 @@ public void Parse(Desk desk, Player player, string command) case "抢这个鸡毛掸子": // 应irol的要求. 开心就好啦. player.Cards.AddRange(_landlordCards); player.Cards.Sort(); - desk.SetLandlord(player); - desk.SendCardsMessage(); desk.AddMessage( $"{player.ToAtCode()}抢地主成功. 为{string.Join("", _landlordCards.Select(card => $"[{card}]"))}"); + desk.SetLandlord(player); + desk.SendCardsMessage(); break; case "不抢": case "抢你妈": diff --git a/CardSharp/GameSteps/WaitingParser.cs b/CardSharp/GameSteps/WaitingParser.cs index 4b4a6c6..41cce60 100644 --- a/CardSharp/GameSteps/WaitingParser.cs +++ b/CardSharp/GameSteps/WaitingParser.cs @@ -28,7 +28,7 @@ public void Parse(Desk desk, Player player, string command) desk.AddMessage("人数不够."); break; case "添加机器人": - desk.AddPlayer(new FakePlayer()); + desk.AddPlayer(new FakePlayer(desk)); break; case "移除机器人": if (desk.Players.Any(p => p is FakePlayer))