using System;
using System.Collections.Generic;
public class Test
{
public static MulliganStatus DEFAULT_MULLIGAN_STATUS = MulliganStatus.KEEP;
public static List<CardMulliganRule> cardKeepingRules;
public static List<CardMulliganRule> cardDiscardingRules;
public class KeepMalGanisRule : CardMulliganRule {
public Boolean appliesTo(Card card) {
if (card.getId() == "Mal'Ganis") {
return true;
}
return false;
}
}
public class KeepDefenderOfArgusRule : CardMulliganRule {
public Boolean appliesTo(Card card) {
if (card.getId() == "Defender of Argus") {
return true;
}
return false;
}
}
public class DiscardPitLordRule : CardMulliganRule {
public Boolean appliesTo(Card card) {
if (card.getId() == "Pit Lord") {
return true;
}
return false;
}
}
public class KeepCost123MinionsRule : CardMulliganRule {
public Boolean appliesTo(Card card) {
if (card.getCost() < 4) {
return true;
}
return false;
}
}
public interface CardMulliganRule {
Boolean appliesTo(Card card);
}
public enum MulliganStatus {
KEEP,
DISCARD,
UNKNOWN
}
public class Card
{
string id;
int cost;
MulliganStatus mulliganStatus;
public Card(string id, int cost) {
setId(id);
setCost(cost);
setMulliganStatus(MulliganStatus.UNKNOWN);
}
public void setId(string id) {
this.id = id;
}
public string getId() {
return this.id;
}
public void setCost(int cost) {
this.cost = cost;
}
public int getCost() {
return this.cost;
}
public void setMulliganStatus(MulliganStatus mulliganStatus) {
this.mulliganStatus = mulliganStatus;
}
public MulliganStatus getMulliganStatus() {
return this.mulliganStatus;
}
public override string ToString() {
return id + "(" + cost + ") - " + mulliganStatus;
}
}
public static void Main()
{
createMulliganRules();
Card[] openingHand = createOpeningHand();
Console.WriteLine("Before Mulligan");
foreach (Card card in openingHand) {
Console.WriteLine(card.ToString());
}
mulligan(openingHand);
Console.WriteLine("After Mulligan");
foreach (Card card in openingHand) {
Console.WriteLine(card.ToString());
}
}
public static void createMulliganRules() {
cardKeepingRules = new List<CardMulliganRule>();
cardKeepingRules.Add(new KeepMalGanisRule());
cardKeepingRules.Add(new KeepDefenderOfArgusRule());
cardKeepingRules.Add(new KeepCost123MinionsRule());
cardDiscardingRules = new List<CardMulliganRule>();
cardDiscardingRules.Add(new DiscardPitLordRule());
}
public static Card[] createOpeningHand() {
Card[] openingHand = new Card[4];
openingHand[0] = new Card("Blood Imp", 1);
openingHand[1] = new Card("Mal'Ganis", 9);
openingHand[2] = new Card("Defender of Argus", 4);
openingHand[3] = new Card("Pit Lord", 3);
return openingHand;
}
public static void mulligan(Card[] openingHand) {
initializeMulliganState(openingHand);
applyCardDiscardingRules(openingHand);
applyCardKeepingRules(openingHand);
applyDefaultRules(openingHand);
}
public static void applyCardKeepingRules(Card[] openingHand) {
foreach (Card card in openingHand) {
if (card.getMulliganStatus() == MulliganStatus.UNKNOWN) {
foreach (CardMulliganRule rule in cardKeepingRules) {
Boolean appliesTo = rule.appliesTo(card);
if (appliesTo == true) {
card.setMulliganStatus(MulliganStatus.KEEP);
break;
}
}
}
}
}
public static void applyCardDiscardingRules(Card[] openingHand) {
foreach (Card card in openingHand) {
if (card.getMulliganStatus() == MulliganStatus.UNKNOWN) {
foreach (CardMulliganRule rule in cardDiscardingRules) {
Boolean appliesTo = rule.appliesTo(card);
if (appliesTo == true) {
card.setMulliganStatus(MulliganStatus.DISCARD);
break;
}
}
}
}
}
public static void applyDefaultRules(Card[] openingHand) {
foreach (Card card in openingHand) {
if (card.getMulliganStatus() == MulliganStatus.UNKNOWN) {
card.setMulliganStatus(getDefaultMulliganStatus());
}
}
}
public static void initializeMulliganState(Card[] openingHand) {
foreach (Card card in openingHand) {
card.setMulliganStatus(MulliganStatus.UNKNOWN);
}
}
public static MulliganStatus getDefaultMulliganStatus() {
return DEFAULT_MULLIGAN_STATUS;
}
}