Advertisement
Guest User

Untitled

a guest
Apr 1st, 2013
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.60 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ConsoleApplication4
  8. {
  9.     class Program
  10.     {
  11.         const int total = 470;
  12.         const int cardsPerPack = 5;
  13.         static Random rand = new Random();
  14.         static int[] cardCounts = new int[4] { 100, 70, 50, 30 };
  15.         static int[] disenchant = new int[4] { 2, 10, 100, 400 };
  16.         static int[] craft = new int[4] { 10, 100, 400, 1600 };
  17.         static double[] dropChance = new double[5] {0, .87, .97, .995,1 };
  18.         static int[] maxCards = new int[4] { 2, 2, 2, 1 };
  19.         const int maxRarity = 4;
  20.  
  21.  
  22.         static void Main(string[] args)
  23.         {
  24.  
  25.             var collection = new Dictionary<Card, int>();
  26.             for (int rarity = 0; rarity < maxRarity; rarity++)
  27.             {
  28.                 for (int cardNum = 0; cardNum < cardCounts[rarity]; cardNum++)
  29.                 {
  30.                     collection.Add(new Card(rarity, cardNum), 0);
  31.                 }
  32.             }
  33.  
  34.             for (int trials = 0; trials < 100; trials++)
  35.             {
  36.                 var keys =  collection.Keys.ToArray();
  37.                 for (int k = 0; k < keys.Length; k++)
  38.                 {
  39.                     collection[keys[k]] = 0;
  40.                 }
  41.  
  42.                 int packs = 0;
  43.                 int dust = 0;
  44.                 while (collection.Values.Sum() < total)
  45.                 {
  46.                     var pack = CreatePack();
  47.                     packs++;
  48.                     for (int i = 0; i < pack.Count; i++)
  49.                     {
  50.                         Card c = pack[i];
  51.                         if (collection[c] < maxCards[c.rarity])
  52.                         {
  53.                             collection[c]++;
  54.                         }
  55.                         else
  56.                         {
  57.                             dust += disenchant[c.rarity];
  58.                             for (int rarity = maxRarity; rarity >= 0; rarity--)
  59.                             {
  60.                                 Card card = collection.Where(a => a.Key.rarity == rarity && a.Value < maxCards[rarity]).Select(a => a.Key).FirstOrDefault();
  61.                                 if (card == null) continue;
  62.                                 if (dust >= craft[rarity])
  63.                                 {
  64.                                    // Console.WriteLine("crafted " + card.rarity + " " + card.cardNumber);
  65.                                     collection[card]++;
  66.                                     dust -= craft[rarity];
  67.                                 }
  68.                                 break;
  69.                             }
  70.                         }
  71.                        
  72.                     }
  73.                 }
  74.  
  75.  
  76.                 Console.WriteLine(packs + " " + dust);
  77.             }
  78.             Console.ReadLine();
  79.         }
  80.  
  81.         static List<Card> CreatePack()
  82.         {
  83.             int commons = 0;
  84.             var pack = new List<Card>();
  85.             for (int i = 0; i < 5; i++)
  86.             {
  87.                 var chance = rand.NextDouble();
  88.                 for (int j = 1; j < dropChance.Length;j++)
  89.                 {
  90.                     if (chance >= dropChance[j - 1] && chance < dropChance[j])
  91.                     {
  92.                         if (j == 1) commons++;
  93.                         var cardNumber = rand.Next(cardCounts[j-1]);
  94.                         pack.Add(new Card(j - 1, cardNumber));
  95.                         break;
  96.                     }
  97.                 }
  98.                
  99.             }
  100.             if (commons == cardsPerPack)
  101.             {
  102.                 var cardNumber = rand.Next(cardCounts[1]);
  103.                 var replace = rand.Next(cardsPerPack);
  104.                 pack[replace] = new Card(1, cardNumber);
  105.             }
  106.  
  107.             return pack;
  108.         }
  109.  
  110.  
  111.     }
  112.  
  113.     class Card
  114.     {
  115.         public readonly int rarity;
  116.         public readonly int cardNumber;
  117.         public readonly int hash;
  118.  
  119.         public Card(int rarity, int cardNumber)
  120.         {
  121.             this.rarity = rarity;
  122.             this.cardNumber = cardNumber;
  123.             this.hash = (rarity<<8) + cardNumber;
  124.  
  125.         }
  126.  
  127.         public override bool Equals(object obj)
  128.         {
  129.             Card c = (Card)obj;
  130.             if (c.cardNumber == this.cardNumber && c.rarity == this.rarity) return true;
  131.             return false;
  132.         }
  133.  
  134.         public override int GetHashCode()
  135.         {
  136.             return hash;
  137.         }
  138.  
  139.         public override string ToString()
  140.         {
  141.             return rarity.ToString() + " " + cardNumber;
  142.         }
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement