public void Play() { while (Player1Deck.Any() && Player2Deck.Any()) { Move(); } }
public int PlayRound() { int roundWinner = 0; if (Finished) { return(roundWinner); } var player1Card = Player1Deck.Draw(); var player2Card = Player2Deck.Draw(); if (player1Card > player2Card) { Player1Deck.Return(player1Card, player2Card); roundWinner = 1; } else { Player2Deck.Return(player2Card, player1Card); roundWinner = 2; } if (Player1Deck.Count == 0 || Player2Deck.Count == 0) { Finished = true; } return(roundWinner); }
public long CalculateScore(int lastWinner) { if (lastWinner == 1) { return(Player1Deck.FinishingScore()); } return(Player2Deck.FinishingScore()); }
public int PlayRound() { Console.WriteLine($"Playing round {RoundId} of game {GameId}"); RoundId++; int roundWinner = 0; if (Finished) { return(roundWinner); } if (RecursiveCheck()) { //the game instantly ends in a win for player 1 Finished = true; return(1); } var player1Card = Player1Deck.Draw(); var player2Card = Player2Deck.Draw(); //If both players have at least as many cards remaining in their deck as the value of the card they just drew, //the winner of the round is determined by playing a new game of Recursive Combat (see below). if (player1Card <= Player1Deck.Count && player2Card <= Player2Deck.Count) { var innerGame = new RecursiveCombatGame(Player1Deck.CopyOfDeck(player1Card), Player2Deck.CopyOfDeck(player2Card), GameId + 1); var winnerInner = innerGame.PlayGame(); if (winnerInner == 1) { Player1Deck.Return(player1Card, player2Card); roundWinner = 1; } else { Player2Deck.Return(player2Card, player1Card); roundWinner = 2; } } else { //at least one player must not have enough cards left in their deck to recurse; the winner of the round is the player with the higher-value card if (player1Card > player2Card) { Player1Deck.Return(player1Card, player2Card); roundWinner = 1; } else { Player2Deck.Return(player2Card, player1Card); roundWinner = 2; } } if (Player1Deck.Count == 0 || Player2Deck.Count == 0) { Finished = true; } return(roundWinner); }
public long PlayGame() { int lastWinner = 0; while (!Finished) { lastWinner = PlayRound(); } if (lastWinner == 1) { return(Player1Deck.FinishingScore()); } return(Player2Deck.FinishingScore()); }
public void PlayRecursive() { HashSet <string> previous = new(); while (Player1Deck.Any() && Player2Deck.Any()) { var state = GetState(); if (previous.Contains(state)) { Player2Deck.Clear(); break; } else { previous.Add(state); } MoveRecursive(); } }
public void MoveRecursive() { var p1 = Player1Deck.Dequeue(); var p2 = Player2Deck.Dequeue(); if (p1 <= Player1Deck.Count && p2 <= Player2Deck.Count) { var subGame = new CombatGame(new Queue <int>(Player1Deck.Take(p1)), new Queue <int>(Player2Deck.Take(p2))); subGame.PlayRecursive(); if (!subGame.Player2Deck.Any()) { Player1Deck.Enqueue(p1); Player1Deck.Enqueue(p2); } else if (!subGame.Player1Deck.Any()) { Player2Deck.Enqueue(p2); Player2Deck.Enqueue(p1); } else { throw new NotImplementedException(); } } else { if (p1 > p2) { Player1Deck.Enqueue(p1); Player1Deck.Enqueue(p2); } else if (p2 > p1) { Player2Deck.Enqueue(p2); Player2Deck.Enqueue(p1); } else { throw new NotImplementedException(); } } }
public void Move() { var p1 = Player1Deck.Dequeue(); var p2 = Player2Deck.Dequeue(); if (p1 > p2) { Player1Deck.Enqueue(p1); Player1Deck.Enqueue(p2); } else if (p2 > p1) { Player2Deck.Enqueue(p2); Player2Deck.Enqueue(p1); } else { throw new NotImplementedException(); } }
private bool RecursiveCheck() { //Before either player deals a card, if there was a previous round in this game that had exactly the same cards in the same order in the same players' decks var player1Cards = string.Join("-", Player1Deck.CopyOfDeck()); if (Player1History.Contains(player1Cards)) { return(true); } var player2Cards = string.Join("-", Player2Deck.CopyOfDeck()); if (Player2History.Contains(player2Cards)) { return(true); } Player1History.Add(player1Cards); Player2History.Add(player2Cards); return(false); }