Her er noget til inspiration:
using System;
namespace E
{
public struct Risk
{
public double MinorSetback;
public double MajorSetback;
public double MinorBreakthrough;
public double MajorBreakthrough;
}
public struct ExternalContext
{
public double EfficiencyFactor;
public double DifficultyFactor;
}
public struct InternalContext
{
public int EfficiencyFactor;
public int DifficultyFactor;
}
public interface FunctionGenerator
{
Calculation.ConvertFunction GetEfficiencyConvertFunction();
Calculation.ConvertFunction GetDifficultyConvertFunction();
}
public interface TableGenerator
{
double[,] GetMinorSetbackTable();
double[,] GetMajorSetbackTable();
double[,] GetMinorBreakthroughTable();
double[,] GetMajorBreakthroughTable();
}
public static class Calculation
{
public delegate int ConvertFunction(double x);
private static InternalContext External2Internal(ExternalContext extctx, ConvertFunction efficencyConvert, ConvertFunction difficultyConvert)
{
InternalContext res = new InternalContext();
res.EfficiencyFactor = efficencyConvert(extctx.EfficiencyFactor);
res.DifficultyFactor = difficultyConvert(extctx.DifficultyFactor);
return res;
}
private static Risk Context2Risk(ExternalContext extctx, ConvertFunction efficencyConvert, ConvertFunction difficultyConvert,
double[,] minorSetbackTable, double[,] majorSetbackTable, double[,] minorBreakthroughTable, double[,] majorBreakthroughTable)
{
InternalContext intctx = External2Internal(extctx, efficencyConvert, difficultyConvert);
Risk res = new Risk();
res.MinorSetback = minorSetbackTable[intctx.EfficiencyFactor, intctx.DifficultyFactor];
res.MajorSetback = majorSetbackTable[intctx.EfficiencyFactor, intctx.DifficultyFactor];
res.MinorBreakthrough = minorBreakthroughTable[intctx.EfficiencyFactor, intctx.DifficultyFactor];
res.MajorBreakthrough = majorBreakthroughTable[intctx.EfficiencyFactor, intctx.DifficultyFactor];
return res;
}
public static Risk Context2Risk(ExternalContext extctx, FunctionGenerator funcgen, TableGenerator tblgen)
{
return Context2Risk(extctx, funcgen.GetEfficiencyConvertFunction(), funcgen.GetDifficultyConvertFunction(),
tblgen.GetMinorSetbackTable(), tblgen.GetMajorSetbackTable(), tblgen.GetMinorBreakthroughTable(), tblgen.GetMajorBreakthroughTable());
}
}
public class Program
{
public class HardcodedFunctionGenerator : FunctionGenerator
{
public Calculation.ConvertFunction GetEfficiencyConvertFunction()
{
return exteff => { if(exteff < 0) return 0; else if(exteff < 1) return 1; else return 2; };
}
public Calculation.ConvertFunction GetDifficultyConvertFunction()
{
return extdif => { if(extdif < 0) return 0; else if(extdif < 5) return 1; else return 2; };
}
}
public class HardcodedTableGenerator : TableGenerator
{
public double[,] GetMinorSetbackTable()
{
return new double[,] { { 0.4, 0.45, 0.5 }, { 0.3, 0.35, 0.4 }, { 0.2, 0.25, 0.3 } };
}
public double[,] GetMajorSetbackTable()
{
return new double[,] { { 0.1, 0.15, 0.2 }, { 0.0, 0.05, 0.1 }, { 0.0, 0.0, 0.0 } };
}
public double[,] GetMinorBreakthroughTable()
{
return new double[,] { { 0.4, 0.35, 0.3 }, { 0.5, 0.45, 0.4 }, { 0.55, 0.5, 0.5 } };
}
public double[,] GetMajorBreakthroughTable()
{
return new double[,] { { 0.1, 0.05, 0.0 }, { 0.2, 0.15, 0.1 }, { 0.25, 0.25, 0.2 } };
}
}
public static void Main(string[] args)
{
ExternalContext extctx = new ExternalContext { EfficiencyFactor = 0.8, DifficultyFactor = 3.0 };
Risk risk;
risk = Calculation.Context2Risk(extctx, new HardcodedFunctionGenerator(), new HardcodedTableGenerator());
Console.WriteLine("{0:F2} {1:F2} {2:F2} {3:F2}", risk.MajorSetback, risk.MinorSetback, risk.MinorBreakthrough, risk.MajorBreakthrough);
extctx.EfficiencyFactor += 0.3;
risk = Calculation.Context2Risk(extctx, new HardcodedFunctionGenerator(), new HardcodedTableGenerator());
Console.WriteLine("{0:F2} {1:F2} {2:F2} {3:F2}", risk.MajorSetback, risk.MinorSetback, risk.MinorBreakthrough, risk.MajorBreakthrough);
extctx.DifficultyFactor += 3.0;
risk = Calculation.Context2Risk(extctx, new HardcodedFunctionGenerator(), new HardcodedTableGenerator());
Console.WriteLine("{0:F2} {1:F2} {2:F2} {3:F2}", risk.MajorSetback, risk.MinorSetback, risk.MinorBreakthrough, risk.MajorBreakthrough);
Console.ReadKey();
}
}
}