Exemplo n.º 1
0
 public void Play()
 {
     while (Player1Deck.Any() && Player2Deck.Any())
     {
         Move();
     }
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 public long CalculateScore(int lastWinner)
 {
     if (lastWinner == 1)
     {
         return(Player1Deck.FinishingScore());
     }
     return(Player2Deck.FinishingScore());
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        public long PlayGame()
        {
            int lastWinner = 0;

            while (!Finished)
            {
                lastWinner = PlayRound();
            }
            if (lastWinner == 1)
            {
                return(Player1Deck.FinishingScore());
            }
            return(Player2Deck.FinishingScore());
        }
Exemplo n.º 6
0
        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();
            }
        }
Exemplo n.º 7
0
        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();
                }
            }
        }
Exemplo n.º 8
0
        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();
            }
        }
Exemplo n.º 9
0
        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);
        }