fork download
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. public class Test
  5. {
  6. public static MulliganStatus DEFAULT_MULLIGAN_STATUS = MulliganStatus.KEEP;
  7.  
  8. public static List<CardMulliganRule> cardKeepingRules;
  9. public static List<CardMulliganRule> cardDiscardingRules;
  10.  
  11. public class KeepMalGanisRule : CardMulliganRule {
  12. public Boolean appliesTo(Card card) {
  13. if (card.getId() == "Mal'Ganis") {
  14. return true;
  15. }
  16.  
  17. return false;
  18. }
  19. }
  20.  
  21. public class KeepDefenderOfArgusRule : CardMulliganRule {
  22. public Boolean appliesTo(Card card) {
  23. if (card.getId() == "Defender of Argus") {
  24. return true;
  25. }
  26.  
  27. return false;
  28. }
  29. }
  30.  
  31. public class DiscardPitLordRule : CardMulliganRule {
  32. public Boolean appliesTo(Card card) {
  33. if (card.getId() == "Pit Lord") {
  34. return true;
  35. }
  36.  
  37. return false;
  38. }
  39. }
  40.  
  41. public class KeepCost123MinionsRule : CardMulliganRule {
  42. public Boolean appliesTo(Card card) {
  43. if (card.getCost() < 4) {
  44. return true;
  45. }
  46.  
  47. return false;
  48. }
  49. }
  50.  
  51. public interface CardMulliganRule {
  52. Boolean appliesTo(Card card);
  53. }
  54.  
  55. public enum MulliganStatus {
  56. KEEP,
  57. DISCARD,
  58. UNKNOWN
  59. }
  60.  
  61. public class Card
  62. {
  63. string id;
  64. int cost;
  65. MulliganStatus mulliganStatus;
  66.  
  67. public Card(string id, int cost) {
  68. setId(id);
  69. setCost(cost);
  70. setMulliganStatus(MulliganStatus.UNKNOWN);
  71. }
  72.  
  73. public void setId(string id) {
  74. this.id = id;
  75. }
  76.  
  77. public string getId() {
  78. return this.id;
  79. }
  80.  
  81. public void setCost(int cost) {
  82. this.cost = cost;
  83. }
  84.  
  85. public int getCost() {
  86. return this.cost;
  87. }
  88.  
  89. public void setMulliganStatus(MulliganStatus mulliganStatus) {
  90. this.mulliganStatus = mulliganStatus;
  91. }
  92.  
  93. public MulliganStatus getMulliganStatus() {
  94. return this.mulliganStatus;
  95. }
  96.  
  97. public override string ToString() {
  98. return id + "(" + cost + ") - " + mulliganStatus;
  99. }
  100. }
  101.  
  102. public static void Main()
  103. {
  104. createMulliganRules();
  105. Card[] openingHand = createOpeningHand();
  106. Console.WriteLine("Before Mulligan");
  107. foreach (Card card in openingHand) {
  108. Console.WriteLine(card.ToString());
  109. }
  110.  
  111. mulligan(openingHand);
  112.  
  113. Console.WriteLine("After Mulligan");
  114. foreach (Card card in openingHand) {
  115. Console.WriteLine(card.ToString());
  116. }
  117. }
  118.  
  119. public static void createMulliganRules() {
  120. cardKeepingRules = new List<CardMulliganRule>();
  121. cardKeepingRules.Add(new KeepMalGanisRule());
  122. cardKeepingRules.Add(new KeepDefenderOfArgusRule());
  123. cardKeepingRules.Add(new KeepCost123MinionsRule());
  124.  
  125. cardDiscardingRules = new List<CardMulliganRule>();
  126. cardDiscardingRules.Add(new DiscardPitLordRule());
  127. }
  128.  
  129. public static Card[] createOpeningHand() {
  130. Card[] openingHand = new Card[4];
  131. openingHand[0] = new Card("Blood Imp", 1);
  132. openingHand[1] = new Card("Mal'Ganis", 9);
  133. openingHand[2] = new Card("Defender of Argus", 4);
  134. openingHand[3] = new Card("Pit Lord", 3);
  135.  
  136. return openingHand;
  137. }
  138.  
  139. public static void mulligan(Card[] openingHand) {
  140. initializeMulliganState(openingHand);
  141.  
  142. applyCardDiscardingRules(openingHand);
  143. applyCardKeepingRules(openingHand);
  144. applyDefaultRules(openingHand);
  145. }
  146.  
  147. public static void applyCardKeepingRules(Card[] openingHand) {
  148. foreach (Card card in openingHand) {
  149. if (card.getMulliganStatus() == MulliganStatus.UNKNOWN) {
  150. foreach (CardMulliganRule rule in cardKeepingRules) {
  151. Boolean appliesTo = rule.appliesTo(card);
  152. if (appliesTo == true) {
  153. card.setMulliganStatus(MulliganStatus.KEEP);
  154. break;
  155. }
  156. }
  157. }
  158. }
  159. }
  160.  
  161. public static void applyCardDiscardingRules(Card[] openingHand) {
  162. foreach (Card card in openingHand) {
  163. if (card.getMulliganStatus() == MulliganStatus.UNKNOWN) {
  164. foreach (CardMulliganRule rule in cardDiscardingRules) {
  165. Boolean appliesTo = rule.appliesTo(card);
  166. if (appliesTo == true) {
  167. card.setMulliganStatus(MulliganStatus.DISCARD);
  168. break;
  169. }
  170. }
  171. }
  172. }
  173. }
  174.  
  175. public static void applyDefaultRules(Card[] openingHand) {
  176. foreach (Card card in openingHand) {
  177. if (card.getMulliganStatus() == MulliganStatus.UNKNOWN) {
  178. card.setMulliganStatus(getDefaultMulliganStatus());
  179. }
  180. }
  181. }
  182.  
  183. public static void initializeMulliganState(Card[] openingHand) {
  184. foreach (Card card in openingHand) {
  185. card.setMulliganStatus(MulliganStatus.UNKNOWN);
  186. }
  187. }
  188.  
  189. public static MulliganStatus getDefaultMulliganStatus() {
  190. return DEFAULT_MULLIGAN_STATUS;
  191. }
  192.  
  193.  
  194. }
Success #stdin #stdout 0.04s 24344KB
stdin
Standard input is empty
stdout
Before Mulligan
Blood Imp(1) - UNKNOWN
Mal'Ganis(9) - UNKNOWN
Defender of Argus(4) - UNKNOWN
Pit Lord(3) - UNKNOWN
After Mulligan
Blood Imp(1) - KEEP
Mal'Ganis(9) - KEEP
Defender of Argus(4) - KEEP
Pit Lord(3) - DISCARD