Advertisement
Guest User

Untitled

a guest
Aug 27th, 2017
431
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.13 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Threading.Tasks;
  7.  
  8. namespace NumberWars
  9. {
  10.     class Startup
  11.     {
  12.         private static Queue<KeyValuePair<int, char>> playerOneDeck;
  13.         private static Queue<KeyValuePair<int, char>> playerTwoDeck;
  14.  
  15.         private static List<KeyValuePair<int, char>> board;
  16.  
  17.         private static bool hasWinner;
  18.  
  19.         static void Main()
  20.         {
  21.             board = new List<KeyValuePair<int, char>>();
  22.  
  23.             InitDeck(ref playerOneDeck);
  24.             InitDeck(ref playerTwoDeck);
  25.  
  26.             var turns = 0;
  27.  
  28.             while (turns <= 1000000 || hasWinner == false)
  29.             {
  30.                 if (playerOneDeck.Count == 0 ||
  31.                     playerTwoDeck.Count == 0)
  32.                 {
  33.                     hasWinner = true;
  34.                     break;
  35.                 }
  36.                 else
  37.                 {
  38.                     Turn();
  39.                     turns++;
  40.                 }
  41.             }
  42.  
  43.             var result = string.Empty;
  44.             if (playerOneDeck.Count == playerTwoDeck.Count)
  45.             {
  46.                 result = "Draw";
  47.             }
  48.             else
  49.             {
  50.                 result = $"{(playerOneDeck.Count > playerTwoDeck.Count ? "First" : "Second")} player wins";
  51.             }
  52.  
  53.             Console.WriteLine($"{result} after {turns} turns");
  54.         }
  55.  
  56.         private static void Turn()
  57.         {
  58.             board.Clear();
  59.  
  60.             var playerOneCard = GetCard(playerOneDeck);
  61.             var playerTwoCard = GetCard(playerTwoDeck);
  62.  
  63.             CompareScore(playerOneCard.Key, playerTwoCard.Key);
  64.         }
  65.  
  66.         private static void CompareScore(int playerOneScore, int playerTwoScore)
  67.         {
  68.             // player one takes
  69.             if (playerOneScore > playerTwoScore)
  70.             {
  71.                 TransferBoardCards(playerOneDeck);
  72.             }
  73.             // player two takes
  74.             else if (playerOneScore < playerTwoScore)
  75.             {
  76.                 TransferBoardCards(playerTwoDeck);
  77.             }
  78.             else
  79.             {
  80.                 // both have same score
  81.                 if(playerOneDeck.Count >= 3 && playerTwoDeck.Count >= 3)
  82.                 {
  83.                     War();
  84.                 }
  85.                 else
  86.                 {
  87.                     hasWinner = true;
  88.                 }
  89.             }
  90.         }
  91.  
  92.         private static void War()
  93.         {
  94.             var playerOneSum = 0;
  95.             var playerTwoSum = 0;
  96.  
  97.             for (int iter = 0; iter < 3; iter++)
  98.             {
  99.                 playerOneSum += (GetCard(playerOneDeck).Value - 'a' + 1);
  100.                 playerTwoSum += (GetCard(playerTwoDeck).Value - 'a' + 1);
  101.             }
  102.  
  103.             CompareScore(playerOneSum, playerTwoSum);
  104.         }
  105.  
  106.         private static void TransferBoardCards(Queue<KeyValuePair<int, char>> deck)
  107.         {
  108.             var ordered = board
  109.                 .OrderByDescending(x => x.Key)
  110.                 .ThenByDescending(x => x.Value);
  111.  
  112.             foreach (var item in ordered)
  113.             {
  114.                 deck.Enqueue(item);
  115.             }
  116.         }
  117.  
  118.         private static KeyValuePair<int, char> GetCard(Queue<KeyValuePair<int, char>> deck)
  119.         {
  120.             var card = deck.Dequeue();
  121.             board.Add(card);
  122.  
  123.             return card;
  124.         }
  125.  
  126.         private static void InitDeck(ref Queue<KeyValuePair<int, char>> deck)
  127.         {
  128.             deck = new Queue<KeyValuePair<int, char>>();
  129.  
  130.             var data = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
  131.  
  132.             var reg = new Regex(@"(?<number>\d+)(?<card>\w+)");
  133.  
  134.             foreach (var item in data)
  135.             {
  136.                 var match = reg.Match(item);
  137.  
  138.                 var number = int.Parse(match.Groups["number"].Value);
  139.                 var card = match.Groups["card"].Value[0];
  140.  
  141.                 var kvp = new KeyValuePair<int, char>(number, card);
  142.  
  143.                 deck.Enqueue(kvp);
  144.             }
  145.         }
  146.     }
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement