Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
        /// <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);
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 11
0
 /// <summary>
 /// 由計算結果推算出計算式
 /// </summary>
 /// <param name="parameter">計算式參數類</param>
 /// <param name="answer">計算結果</param>
 /// <returns>計算式對象</returns>
 public override Formula CreateFormulaWithAnswer(ArithmeticParameter parameter, int answer)
 {
     return(CreateFormula(parameter));
 }
Esempio n. 12
0
 /// <summary>
 /// 構造用於計算接龍題型(即:計算式左邊值等於上一個計算式的結果值)
 /// </summary>
 /// <param name="parameter">計算式參數類</param>
 /// <param name="previousFormula">前次推算的計算式對象</param>
 /// <returns>計算式對象</returns>
 public override Formula CreateFormula(ArithmeticParameter parameter, Formula previousFormula)
 {
     return(CreateFormula(parameter));
 }