Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApplication4
- {
- class Program
- {
- const int total = 470;
- const int cardsPerPack = 5;
- static Random rand = new Random();
- static int[] cardCounts = new int[4] { 100, 70, 50, 30 };
- static int[] disenchant = new int[4] { 2, 10, 100, 400 };
- static int[] craft = new int[4] { 10, 100, 400, 1600 };
- static double[] dropChance = new double[5] {0, .87, .97, .995,1 };
- static int[] maxCards = new int[4] { 2, 2, 2, 1 };
- const int maxRarity = 4;
- static void Main(string[] args)
- {
- var collection = new Dictionary<Card, int>();
- for (int rarity = 0; rarity < maxRarity; rarity++)
- {
- for (int cardNum = 0; cardNum < cardCounts[rarity]; cardNum++)
- {
- collection.Add(new Card(rarity, cardNum), 0);
- }
- }
- for (int trials = 0; trials < 100; trials++)
- {
- var keys = collection.Keys.ToArray();
- for (int k = 0; k < keys.Length; k++)
- {
- collection[keys[k]] = 0;
- }
- int packs = 0;
- int dust = 0;
- while (collection.Values.Sum() < total)
- {
- var pack = CreatePack();
- packs++;
- for (int i = 0; i < pack.Count; i++)
- {
- Card c = pack[i];
- if (collection[c] < maxCards[c.rarity])
- {
- collection[c]++;
- }
- else
- {
- dust += disenchant[c.rarity];
- for (int rarity = maxRarity; rarity >= 0; rarity--)
- {
- Card card = collection.Where(a => a.Key.rarity == rarity && a.Value < maxCards[rarity]).Select(a => a.Key).FirstOrDefault();
- if (card == null) continue;
- if (dust >= craft[rarity])
- {
- // Console.WriteLine("crafted " + card.rarity + " " + card.cardNumber);
- collection[card]++;
- dust -= craft[rarity];
- }
- break;
- }
- }
- }
- }
- Console.WriteLine(packs + " " + dust);
- }
- Console.ReadLine();
- }
- static List<Card> CreatePack()
- {
- int commons = 0;
- var pack = new List<Card>();
- for (int i = 0; i < 5; i++)
- {
- var chance = rand.NextDouble();
- for (int j = 1; j < dropChance.Length;j++)
- {
- if (chance >= dropChance[j - 1] && chance < dropChance[j])
- {
- if (j == 1) commons++;
- var cardNumber = rand.Next(cardCounts[j-1]);
- pack.Add(new Card(j - 1, cardNumber));
- break;
- }
- }
- }
- if (commons == cardsPerPack)
- {
- var cardNumber = rand.Next(cardCounts[1]);
- var replace = rand.Next(cardsPerPack);
- pack[replace] = new Card(1, cardNumber);
- }
- return pack;
- }
- }
- class Card
- {
- public readonly int rarity;
- public readonly int cardNumber;
- public readonly int hash;
- public Card(int rarity, int cardNumber)
- {
- this.rarity = rarity;
- this.cardNumber = cardNumber;
- this.hash = (rarity<<8) + cardNumber;
- }
- public override bool Equals(object obj)
- {
- Card c = (Card)obj;
- if (c.cardNumber == this.cardNumber && c.rarity == this.rarity) return true;
- return false;
- }
- public override int GetHashCode()
- {
- return hash;
- }
- public override string ToString()
- {
- return rarity.ToString() + " " + cardNumber;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement