Skip to content
This repository has been archived by the owner on Jul 27, 2018. It is now read-only.

Commit

Permalink
fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
Cyl18 committed Feb 18, 2018
1 parent 972c077 commit f9b1861
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 83 deletions.
16 changes: 15 additions & 1 deletion CardSharp.GUI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,23 @@ static void Main(string[] args)
{
while (true)
{
RunTest();
//RunTest();
RunAutoTest();
}
}

private static void RunAutoTest()
{
var desk = Desk.GetOrCreateDesk(Rng.NextDouble().ToString(CultureInfo.InvariantCulture));
desk.AddPlayer(new FakePlayer(desk));
desk.AddPlayer(new FakePlayer(desk));
desk.AddPlayer(new FakePlayer(desk));

desk.Start();
Console.WriteLine(desk.Message);
Console.ReadLine();
}

private static readonly Random Rng = new Random("fork you kamijoutoma".GetHashCode());
private static void RunTest()
{
Expand Down
1 change: 1 addition & 0 deletions CardSharp/GameComponents/IPlayerConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ public interface IPlayerConfig
{
DateTime LastTime { get; set; }
int Point { get; set; }
string PlayerID { get; }
}
}
183 changes: 102 additions & 81 deletions CardSharp/GameSteps/CommandParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,45 +29,65 @@ public void Parse(Desk desk, Player player, string command)

private bool ParseInternal(Desk desk, Player player, string command)
{
if (!desk.Players.Contains(player))
if (!desk.Players.Contains(player)) return true;

if (ParseStandardCommand(desk, player, command)) return true;

RefreshCurrentRule(desk);

if (!IsValidPlayer(desk, player))
return true;
if (desk.LastSuccessfulSender == desk.CurrentPlayer)

ParsePassCommand(desk, command);

ParsePlayerSubmitCard(desk, player, command);
RefreshCurrentRule(desk);
if (CheckPlayerWin(desk)) return true;

return false;
}

private void ParsePlayerSubmitCard(Desk desk, Player player, string command)
{
if (command.StartsWith(""))
{
desk.CurrentRule = null;
desk.LastCards = null;
var cardsCommand = command.Substring(1).ToUpper();
if (cardsCommand.IsValidCardString())
if (Rules.Rules.IsCardsMatch(cardsCommand.ToCards(), desk))
{
player.SendCards(desk);
if (CheckPlayerWin(desk)) return;
if (player.Cards.Count <= Constants.BoardcastCardNumThreshold)
desk.AddMessageLine($"{player.ToAtCode()} 只剩{player.Cards.Count}张牌啦~");

if (desk.SuddenDeathEnabled) desk.AddMessageLine("WARNING: SUDDEN DEATH ENABLED");

if (player.PublicCards) desk.AddMessageLine($"明牌:{player.Cards.ToFormatString()}");

AnalyzeGiveUpAndMoveNext(desk);

desk.BoardcastCards();
}
else
{
desk.AddMessage("你似乎不能出这些牌哟~");
}
}
}

switch (command)
private static bool CheckPlayerWin(Desk desk)
{
if (desk.CurrentPlayer.Cards.Count == 0 && desk.State != GameState.Unknown)
{
case "结束游戏":
desk.AddMessage("CNM");
desk.FinishGame();
return true;
case "记牌器":
desk.AddMessage(CardCounter.GenerateCardString(desk));
return true;
case "全场牌数":
desk.AddMessage(string.Join(Environment.NewLine,
desk.PlayerList.Select(p => $"{p.ToAtCode()}: {p.Cards.Count}")));
return true;
case "弃牌":
player.GiveUp = true;
desk.AddMessage("弃牌成功");
return true;
case "托管":
player.HostedEnabled = true;
desk.AddMessage("托管成功");
RunHostedCheck(desk);
return true;
case "结束托管":
player.HostedEnabled = false;
desk.AddMessage("结束成功");
return true;
PlayerWin(desk, desk.CurrentPlayer);
return true;
}

if (!IsValidPlayer(desk, player))
return true;
return false;
}

private void ParsePassCommand(Desk desk, string command)
{
switch (command)
{
case "":
Expand Down Expand Up @@ -108,54 +128,49 @@ private bool ParseInternal(Desk desk, Player player, string command)
else
{
AnalyzeGiveUpAndMoveNext(desk);
player = desk.CurrentPlayer;
desk.BoardcastCards();
}

break;
}
}

if (desk.CurrentPlayer.Cards.Count == 0)
{
PlayerWin(desk, player);
return true;
}

if (command.StartsWith(""))
{
var cardsCommand = command.Substring(1).ToUpper();
if (cardsCommand.IsValidCardString())
if (Rules.Rules.IsCardsMatch(cardsCommand.ToCards(), desk))
{
player.SendCards(desk);
if (player.Cards.Count <= Constants.BoardcastCardNumThreshold)
desk.AddMessageLine($"{player.ToAtCode()} 只剩{player.Cards.Count}张牌啦~");

if (desk.SuddenDeathEnabled) desk.AddMessageLine("WARNING: SUDDEN DEATH ENABLED");

if (player.PublicCards) desk.AddMessageLine($"明牌:{player.Cards.ToFormatString()}");

AnalyzeGiveUpAndMoveNext(desk);
player = desk.CurrentPlayer;

desk.BoardcastCards();
}
else
{
desk.AddMessage("无法匹配到你想出的牌哟~");
}
}

private static void RefreshCurrentRule(Desk desk)
{
if (desk.LastSuccessfulSender == desk.CurrentPlayer)
{
desk.CurrentRule = null;
desk.LastCards = null;
}
}

if (desk.CurrentPlayer.Cards.Count == 0)
private bool ParseStandardCommand(Desk desk, Player player, string command)
{
switch (command)
{
PlayerWin(desk, player);
return true;
case "结束游戏":
desk.AddMessage("CNM");
desk.FinishGame();
return true;
case "记牌器":
desk.AddMessage(CardCounter.GenerateCardString(desk));
return true;
case "全场牌数":
desk.AddMessage(string.Join(Environment.NewLine,
desk.PlayerList.Select(p => $"{p.ToAtCode()}: {p.Cards.Count}")));
return true;
case "弃牌":
player.GiveUp = true;
desk.AddMessage("弃牌成功");
return true;
case "托管":
player.HostedEnabled = true;
desk.AddMessage("托管成功");
RunHostedCheck(desk);
return true;
case "结束托管":
player.HostedEnabled = false;
desk.AddMessage("结束成功");
return true;
}

return false;
Expand All @@ -164,33 +179,24 @@ private bool ParseInternal(Desk desk, Player player, string command)
private void RunAutoPassCheck(Desk desk)
{
var cp = desk.CurrentPlayer;
if (desk.State == GameState.Unknown) return;

var (exists, _) = Rules.Rules.FirstMatch(cp, desk);

if (!exists)
{
desk.AddMessageLine($"{cp.ToAtCode()} 没有检测到你能出的牌, 已为你自动pass.");
Parse(desk, cp, "pass");
cp.AddMessage("没有检测到你能出的牌, 你可以pass.");
}
}

private bool RunHostedCheck(Desk desk)
{
var cp = desk.CurrentPlayer;
if (!cp.HostedEnabled) return false;
if (!cp.HostedEnabled || desk.State == GameState.Unknown) return false;

if (desk.LastSuccessfulSender == cp)
{
desk.CurrentRule = null;
desk.LastCards = null;
}
RefreshCurrentRule(desk);

var (exists, cards) = Rules.Rules.FirstMatch(cp, desk);
#if DEBUG
if (new StackTrace().FrameCount > 500)
{
Debugger.Break();
}
#endif
switch (exists)
{
case true:
Expand Down Expand Up @@ -223,10 +229,25 @@ private void AnalyzeGiveUpAndMoveNext(Desk desk)
MoveNext();
} while (desk.CurrentPlayer.GiveUp);

CheckGameFinished(desk);
}

private static bool CheckGameFinished(Desk desk)
{
var farmers = desk.Players.Where(p => p.Type == PlayerType.Farmer);
var landlords = desk.Players.Where(p => p.Type == PlayerType.Landlord);
if (farmers.All(p => p.GiveUp) || landlords.All(p => p.GiveUp))
{
desk.FinishGame(desk.Players.First(p => !p.GiveUp));
return true;
}

if (desk.CurrentPlayer.Cards.Count == 0) {
PlayerWin(desk, desk.CurrentPlayer);
return true;
}

return false;
}
}
}
2 changes: 1 addition & 1 deletion CardSharp/GameSteps/LandlordDiscuss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public void Parse(Desk desk, Player player, string command)
if (!IsValidPlayer(desk, player))
return;

if (_count > 4)
if (_count >= 3)
{
desk.AddMessage("你们干嘛呢 我...我不干了!(╯‵□′)╯︵┻━┻");
desk.FinishGame();
Expand Down

0 comments on commit f9b1861

Please sign in to comment.