/// <summary> /// 構造函數 /// </summary> /// <param name="parameter">計算式參數類</param> /// <returns>計算式對象</returns> public override Formula CreateFormula(ArithmeticParameter parameter) { Formula = base.CreateFormula(parameter); // 創建計算式 #pragma warning disable CA1062 // base.CreateFormula已對parameter進行NULL判定處理 var result = TryCreateFormula(parameter); #pragma warning restore CA1062 // 當前反推判定數 int _defeated = 0; while (_defeated < INVERSE_NUMBER) { if (!result) { result = TryCreateFormula(parameter); } else { break; } _defeated++; if (_defeated == INVERSE_NUMBER) { Formula.IsNoSolution = true; } } LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 構造函數 /// </summary> /// <param name="parameter">計算式參數類</param> /// <returns>計算式對象</returns> /// <remarks>如果未設定最大值則依據指定範圍進行推算</remarks> public override Formula CreateFormula(ArithmeticParameter parameter) { Formula = base.CreateFormula(parameter); Formula.Sign = SignOfOperation.Plus; if (parameter != null) { if (parameter.MaximumLimit == 0) { Formula.LeftParameter = GetParameterWithScope(parameter.LeftScope); Formula.RightParameter = GetParameterWithScope(parameter.RightScope); } else { Formula.LeftParameter = GetLeftParameter(parameter.MaximumLimit); Formula.RightParameter = GetRightParameter(parameter.MaximumLimit, Formula.LeftParameter); } } Formula.Answer = GetAnswer(Formula.LeftParameter, Formula.RightParameter); LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 由計算結果推算出計算式(使用場景:水果連連看) /// </summary> /// <param name="parameter">計算式參數類</param> /// <param name="answer">計算結果</param> /// <returns>計算式對象</returns> public override Formula CreateFormulaWithAnswer(ArithmeticParameter parameter, int answer) { Formula = base.CreateFormulaWithAnswer(parameter, answer); // 創建計算式 var result = TryCreateFormulaWithAnswer(answer); // 當前反推判定數 int _defeated = 0; while (_defeated < INVERSE_NUMBER) { if (!result) { result = TryCreateFormulaWithAnswer(answer); } else { break; } _defeated++; if (_defeated == INVERSE_NUMBER) { // 無解計算式(結果無法被整除) Formula.IsNoSolution = true; } } LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 構造用於計算接龍題型(即:計算式左邊值等於上一個計算式的結果值) /// </summary> /// <param name="parameter">計算式參數類</param> /// <param name="previousFormula">前次推算的計算式對象</param> /// <returns>計算式對象</returns> public override Formula CreateFormula(ArithmeticParameter parameter, Formula previousFormula) { Formula = base.CreateFormula(parameter, previousFormula); // TODO LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 構造函數 /// </summary> /// <param name="parameter">計算式參數類</param> /// <returns>計算式對象</returns> public override Formula CreateFormula(ArithmeticParameter parameter) { Formula = base.CreateFormula(parameter); #pragma warning disable CA1062 // base.CreateFormula已對parameter進行NULL判定處理 Formula.LeftParameter = parameter.MaximumLimit; #pragma warning restore CA1062 Formula.Sign = SignOfOperation.Subtraction; Formula.RightParameter = parameter.MinimumLimit; Formula.Answer = GetAnswer(Formula.LeftParameter, Formula.RightParameter); return(Formula); }
/// <summary> /// 由計算結果推算出計算式(使用場景:水果連連看) /// </summary> /// <param name="parameter">計算式參數類</param> /// <param name="answer">計算結果</param> /// <returns>計算式對象</returns> public override Formula CreateFormulaWithAnswer(ArithmeticParameter parameter, int answer) { // 加法运算的最大值就是算式的答案Answer值 Formula = base.CreateFormulaWithAnswer(parameter, answer); Formula.Answer = answer; Formula.Sign = SignOfOperation.Plus; Formula.LeftParameter = GetLeftParameter(answer); Formula.RightParameter = Formula.Answer - Formula.LeftParameter; LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 構造用於計算接龍題型(即:計算式左邊值等於上一個計算式的結果值) /// </summary> /// <param name="parameter">計算式參數類</param> /// <param name="previousFormula">前次推算的計算式對象</param> /// <returns>計算式對象</returns> public override Formula CreateFormula(ArithmeticParameter parameter, Formula previousFormula) { Formula = base.CreateFormula(parameter, previousFormula); // 如果当前是第一层计算式,需要随机获取计算式最左边的值 #pragma warning disable CA1062 // base.CreateFormula已對parameter進行NULL判定處理 Formula.LeftParameter = (previousFormula == null) ? GetLeftParameter(parameter.MaximumLimit) : previousFormula.Answer; #pragma warning restore CA1062 Formula.Sign = SignOfOperation.Plus; Formula.RightParameter = GetRightParameter(parameter.MaximumLimit, Formula.LeftParameter); Formula.Answer = GetAnswer(Formula.LeftParameter, Formula.RightParameter); LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 由計算結果推算出計算式(使用場景:水果連連看) /// </summary> /// <param name="parameter">計算式參數類</param> /// <param name="answer">計算結果</param> /// <returns>計算式對象</returns> public override Formula CreateFormulaWithAnswer(ArithmeticParameter parameter, int answer) { Formula = base.CreateFormulaWithAnswer(parameter, answer); Formula.Answer = answer; Formula.Sign = SignOfOperation.Subtraction; // 计算式左侧项目的取值范围(答案值至最大计算值) MinimumLimit = answer; #pragma warning disable CA1062 // base.CreateFormula已對parameter進行NULL判定處理 Formula.LeftParameter = GetLeftParameter(parameter.MaximumLimit); #pragma warning restore CA1062 Formula.RightParameter = Formula.LeftParameter - Formula.Answer; LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 創建計算式 /// </summary> /// <param name="parameter">計算書參數類</param> /// <returns>計算式成立: TRUE</returns> private bool TryCreateFormula(ArithmeticParameter parameter) { if (parameter.MaximumLimit == 0) { Formula.LeftParameter = GetParameterWithScope(parameter.LeftScope); Formula.RightParameter = GetParameterWithScope(parameter.RightScope); } else { Formula.LeftParameter = GetLeftParameter(parameter.MaximumLimit); Formula.RightParameter = GetRightParameter(Formula.LeftParameter); } Formula.Sign = SignOfOperation.Subtraction; Formula.Answer = GetAnswer(Formula.LeftParameter, Formula.RightParameter); if (Formula.Answer < 0) { return(false); } return(true); }
/// <summary> /// 構造函數 /// </summary> /// <param name="parameter">計算式參數類</param> /// <returns>計算式對象</returns> public override Formula CreateFormula(ArithmeticParameter parameter) { Formula = base.CreateFormula(parameter); Formula.LeftParameter = GetLeftParameter(9); Formula.Sign = SignOfOperation.Multiple; Formula.RightParameter = GetRightParameter(9); Formula.Answer = GetAnswer(Formula.LeftParameter, Formula.RightParameter); // 结果特殊处理(在乘法式中其中一个数值为零,那另一个值可以是任意一个数值) if (Formula.Gap == GapFilling.Left && Formula.RightParameter == 0) { Formula.LeftParameter = -999; } if (Formula.Gap == GapFilling.Right && Formula.LeftParameter == 0) { Formula.RightParameter = -999; } LogUtil.LogCalculate(Formula); return(Formula); }
/// <summary> /// 由計算結果推算出計算式 /// </summary> /// <param name="parameter">計算式參數類</param> /// <param name="answer">計算結果</param> /// <returns>計算式對象</returns> public override Formula CreateFormulaWithAnswer(ArithmeticParameter parameter, int answer) { return(CreateFormula(parameter)); }
/// <summary> /// 構造用於計算接龍題型(即:計算式左邊值等於上一個計算式的結果值) /// </summary> /// <param name="parameter">計算式參數類</param> /// <param name="previousFormula">前次推算的計算式對象</param> /// <returns>計算式對象</returns> public override Formula CreateFormula(ArithmeticParameter parameter, Formula previousFormula) { return(CreateFormula(parameter)); }