using System.Collections.Generic;
public static void Main()
var zenynoDie = new ZenynoDie();
var goolingjoDie = new GoolingjoDie();
var zenynoRoller = new SixDieRoller(zenynoDie, goolingjoDie);
var goolingjoRoller = new SixDieRoller(goolingjoDie, zenynoDie);
while(zenynoRoller.SixDie.HP > 0 && goolingjoRoller.SixDie.HP > 0)
Console.WriteLine("ROUND " + round);
Console.WriteLine("-----");
var goolingjoDieFace = goolingjoRoller.Roll();
Console.WriteLine(goolingjoRoller.SixDie.Name + " has rolled [" + goolingjoDieFace.Name + "]");
var zenynoDieFace = zenynoRoller.Roll();
Console.WriteLine(zenynoRoller.SixDie.Name + " has rolled [" + zenynoDieFace.Name + "]");
var everyRoundP1DieFace = goolingjoRoller.Roll();
goolingjoRoller.PerformEveryRoundActions(everyRoundP1DieFace);
var everyRoundP2DieFace = zenynoRoller.Roll();
zenynoRoller.PerformEveryRoundActions(everyRoundP2DieFace);
everyRoundP1DieFace = goolingjoRoller.Roll();
goolingjoRoller.PerformEveryRoundActions(everyRoundP1DieFace);
everyRoundP2DieFace = zenynoRoller.Roll();
zenynoRoller.PerformEveryRoundActions(everyRoundP2DieFace);
goolingjoRoller.PerformOpeningActions(goolingjoDieFace);
zenynoRoller.PerformOpeningActions(zenynoDieFace);
goolingjoRoller.PerformClosingActions(goolingjoDieFace);
zenynoRoller.PerformClosingActions(zenynoDieFace);
goolingjoRoller.PerformBonusActions(goolingjoDieFace);
zenynoRoller.PerformBonusActions(zenynoDieFace);
Console.WriteLine(goolingjoRoller.SixDie.Name + " HP: " + goolingjoRoller.SixDie.HP);
Console.WriteLine(zenynoRoller.SixDie.Name + " HP: " + zenynoRoller.SixDie.HP);
Console.WriteLine("-----");
if(zenynoRoller.SixDie.HP == 0 && goolingjoRoller.SixDie.HP == 0)
Console.WriteLine("It's a draw!");
else if(zenynoRoller.SixDie.HP > 0)
Console.WriteLine("[" + zenynoRoller.SixDie.Name + "] wins the game!");
Console.WriteLine("[" + goolingjoRoller.SixDie.Name + "] wins the game!");
Console.WriteLine("~~THE END!~~");
public interface IDieRoller
void PerformOpeningActions(DieFace dieFace);
void PerformClosingActions(DieFace dieFace);
void PerformEveryRoundActions(DieFace dieFace);
void PerformBonusActions(DieFace dieFace);
public class SixDieRoller : IDieRoller
private static readonly Random _random = new Random();
public SixDieRoller(ISixDie sixDie, ISixDie targetDie)
TargetSixDie = targetDie;
public ISixDie SixDie { get; set; }
public ISixDie TargetSixDie { get; set; }
int rolledNumber = _random.Next(1,7);
return rolledNumber switch
_ => throw new Exception("Current die face does not exist!")
public void ResetNewRound()
SixDie.HasDefence = false;
TargetSixDie.HasDefence = false;
public void PerformOpeningActions(DieFace dieFace)
if(dieFace == null || dieFace.Actions == null)
foreach(var action in dieFace.Actions)
(SixDie, TargetSixDie) = action.ActionSkill switch{
ActionType.Defend => dieFace.Defend(SixDie, TargetSixDie),
_ => (SixDie, TargetSixDie)
public void PerformClosingActions(DieFace dieFace)
if(dieFace == null || dieFace.Actions == null)
foreach(var action in dieFace.Actions)
(SixDie, TargetSixDie) = action.ActionSkill switch{
ActionType.Attack => dieFace.Attack(SixDie, action.SelfDamage, TargetSixDie, action.AttackDamage),
ActionType.Heal => dieFace.Heal(SixDie, TargetSixDie, action.HealPoints),
_ => (SixDie, TargetSixDie)
public void PerformEveryRoundActions(DieFace dieFace)
if(dieFace == null || dieFace.Actions == null)
foreach(var action in dieFace.Actions)
(SixDie, TargetSixDie) = action.ActionSkill switch{
ActionType.HealOnAnyRound => dieFace.HealOnAnyRound(SixDie, TargetSixDie, action.HealPoints),
_ => (SixDie, TargetSixDie)
public void PerformBonusActions(DieFace dieFace)
if(dieFace == null || dieFace.Actions == null)
foreach(var action in dieFace.Actions)
(SixDie, TargetSixDie) = action.ActionSkill switch{
ActionType.BonusRoll => dieFace.BonusRoll(SixDie, TargetSixDie, action.BonusRolls, this),
_ => (SixDie, TargetSixDie)
public int RollNumber { get; set; }
public string Name { get; set; }
public ICollection<Action> Actions { get; set; } = new List<Action>();
public (ISixDie currDie, ISixDie targDie) Attack(ISixDie currentDie, int selfDamage, ISixDie targetDie, int damage)
currentDie.HP = currentDie.HP - selfDamage < 0 ? 0 : currentDie.HP - selfDamage;
Console.WriteLine("[DEFEND] " + targetDie.Name + " evaded the attack");
targetDie.HP = targetDie.HP - damage < 0 ? 0 : targetDie.HP - damage;
string actionText = "[ATTACK] " + currentDie.Name + " attacked " + targetDie.Name + " and dealt " + damage + " damage";
actionText += " / received " + selfDamage + " damage";
Console.WriteLine(actionText);
return (currentDie, targetDie);
public (ISixDie currDie, ISixDie targDie) Defend(ISixDie currentDie, ISixDie targetDie) {
currentDie.HasDefence = true;
return (currentDie, targetDie);
public (ISixDie currDie, ISixDie targDie) Heal(ISixDie currentDie, ISixDie targetDie, int healPoints) {
int totalHitPointsHealed = currentDie.HP + healPoints;
currentDie.HP = totalHitPointsHealed > 20? currentDie.HP : totalHitPointsHealed;
Console.WriteLine("[HEAL] " + currentDie.Name + " healed " + healPoints + " hitpoints");
return (currentDie, targetDie);
public (ISixDie currDie, ISixDie targDie) HealOnAnyRound(ISixDie currentDie, ISixDie targetDie, int healPoints) {
int totalHitPointsHealed = currentDie.HP + healPoints;
currentDie.HP = totalHitPointsHealed > 20? currentDie.HP : totalHitPointsHealed;
Console.WriteLine("[HEAL ANY ROUND] " + currentDie.Name + " healed " + healPoints + " hitpoints");
return (currentDie, targetDie);
public (ISixDie currDie, ISixDie targDie) BonusRoll(ISixDie currentDie, ISixDie targetDie, int bonusRolls, SixDieRoller sixDieRoller) {
for(int i = 0; i < bonusRolls; i++)
var dieFace = sixDieRoller.Roll();
Console.WriteLine("[BONUS ROLL] " + sixDieRoller.SixDie.Name + " has rolled [" + dieFace.Name + "]");
sixDieRoller.PerformOpeningActions(dieFace);
sixDieRoller.PerformClosingActions(dieFace);
return (currentDie, targetDie);
public ActionType ActionSkill { get; set; }
public int AttackDamage { get; set; }
public int SelfDamage { get; set; }
public int HealPoints { get; set; }
public int BonusRolls { get; set; }
string Name { get; set; }
bool HasDefence { get; set; }
DieFace Face1 { get; set; }
DieFace Face2 { get; set; }
DieFace Face3 { get; set; }
DieFace Face4 { get; set; }
DieFace Face5 { get; set; }
DieFace Face6 { get; set; }
public class ZenynoDie() : ISixDie
public string Name { get; set; } = "Zenyno";
public int HP { get; set; } = 20;
public bool HasDefence { get; set; } = false;
public DieFace Face1 { get; set; } = new DieFace { RollNumber = 1, Name = "Lucky", Actions = new List<Action> { new Action { ActionSkill = ActionType.Defend }}};
public DieFace Face2 { get; set; } = new DieFace { RollNumber = 2, Name = "Heart and Soul", Actions = new List<Action> { new Action { ActionSkill = ActionType.Attack, AttackDamage = 8, SelfDamage = 3 }}};
public DieFace Face3 { get; set; } = new DieFace { RollNumber = 3, Name = "Chowa", Actions = new List<Action> { new Action { ActionSkill = ActionType.Attack, AttackDamage = 3, SelfDamage = 0 }}};
public DieFace Face4 { get; set; } = new DieFace { RollNumber = 4, Name = "Inspire", Actions = new List<Action> { new Action { ActionSkill = ActionType.BonusRoll, BonusRolls = 2 }}};
public DieFace Face5 { get; set; } = new DieFace { RollNumber = 5, Name = "Heal", Actions = new List<Action> { new Action { ActionSkill = ActionType.Heal, HealPoints = 5 }, new Action { ActionSkill = ActionType.HealOnAnyRound, HealPoints = 1 }}};
public DieFace Face6 { get; set; } = new DieFace { RollNumber = 6, Name = "SAGA" };
public class GoolingjoDie() : ISixDie
public string Name { get; set; } = "Goolingjo";
public int HP { get; set; } = 20;
public bool HasDefence { get; set; } = false;
public DieFace Face1 { get; set; } = new DieFace { RollNumber = 1, Name = "Meteor Rain", Actions = new List<Action> { new Action { ActionSkill = ActionType.Attack, AttackDamage = 3, SelfDamage = 0 }}};
public DieFace Face2 { get; set; } = new DieFace { RollNumber = 2, Name = "Fireball", Actions = new List<Action> { new Action { ActionSkill = ActionType.Attack, AttackDamage = 6, SelfDamage = 0 }}};
public DieFace Face3 { get; set; } = new DieFace { RollNumber = 3, Name = "Teleport", Actions = new List<Action> { new Action { ActionSkill = ActionType.Defend }}};
public DieFace Face4 { get; set; } = new DieFace { RollNumber = 4, Name = "Animate" };
public DieFace Face5 { get; set; } = new DieFace { RollNumber = 5, Name = "Hurricane", Actions = new List<Action> { new Action { ActionSkill = ActionType.Attack, AttackDamage = 4, SelfDamage = 0 }}};
public DieFace Face6 { get; set; } = new DieFace { RollNumber = 6, Name = "SAGA" };