Esempio n. 1
0
        /// <summary>
        /// 分别随机符号位作成左边关系式和右边关系式
        /// </summary>
        /// <param name="maximumLimit">最大值</param>
        /// <param name="signFunc">運算符取得用的表達式</param>
        /// <returns>計算式</returns>
        private Formula GetFormulaForRandomNumber(int maximumLimit, Func <SignOfOperation> signFunc)
        {
            // 對四則運算符實例進行cache管理
            IArithmetic strategy = CalculateManager(signFunc());

            return(strategy.CreateFormula(new ArithmeticParameter()
            {
                MaximumLimit = maximumLimit,
                QuestionType = QuestionType.Default,
                MinimumLimit = 0
            }));
        }
Esempio n. 2
0
        /// <summary>
        /// 左側計算式集合作成并返回當前新作成的計算式
        /// </summary>
        /// <param name="maximumLimit">計算結果最大值</param>
        /// <param name="signFunc">運算符取得用的表達式</param>
        /// <returns>新作成的計算式</returns>
        private Formula MakeLeftFormulas(int maximumLimit, Func <SignOfOperation> signFunc)
        {
            IArithmetic strategy = CalculateManager(signFunc());

            // 計算式作成
            Formula formula = strategy.CreateFormula(new ArithmeticParameter()
            {
                MaximumLimit = maximumLimit,
                QuestionType = QuestionType.Default,
                MinimumLimit = 0
            });

            return(formula);
        }
        /// <summary>
        /// 算式作成
        /// </summary>
        /// <param name="p">題型參數</param>
        /// <param name="signFunc">運算符取得用的表達式</param>
        private void MarkFormulaList(ComputingConnectionParameter p, Func <SignOfOperation> signFunc)
        {
            // 當前反推判定次數(一次推算內次數累加)
            int defeated = 0;

            // 按照指定數量作成相應的數學計算式
            for (int i = 0; i < p.NumberOfQuestions; i++)
            {
                Formula         previousFormula = null;
                IList <Formula> formulas        = new List <Formula>();
                // 随机获取接龙层数
                for (int j = 0; j < p.SectionNumber; j++)
                {
                    // 指定運算符實例作成
                    IArithmetic strategy = CalculateManager(signFunc());
                    Formula     formula  = strategy.CreateFormula(new ArithmeticParameter()
                    {
                        MaximumLimit = p.MaximumLimit,
                        QuestionType = QuestionType.Default,
                        MinimumLimit = 0
                    }, previousFormula);

                    if (CheckIsNeedInverseMethod(p.Formulas, formula, p.MaximumLimit))
                    {
                        defeated++;
                        // 如果大於五次則認為此題無法作成繼續下一題
                        if (defeated == INVERSE_NUMBER)
                        {
                            // 當前反推判定次數復原
                            defeated = 0;
                            continue;
                        }
                        j--;
                        continue;
                    }
                    previousFormula = formula;

                    formulas.Add(formula);
                }
                // 當前反推判定次數復原
                defeated = 0;

                p.Formulas.Add(new ConnectionFormula()
                {
                    ConfixFormulas = formulas, ConfixNumber = formulas.Count
                });
            }
        }
        /// <summary>
        /// 算式作成
        /// </summary>
        /// <param name="p">題型參數</param>
        /// <param name="signFunc">運算符取得用的表達式</param>
        private void MarkFormulaList(ArithmeticOperationsParameter p, Func <SignOfOperation> signFunc)
        {
            // 當前反推判定次數(一次推算內次數累加)
            int defeated = 0;

            // 按照指定數量作成相應的數學計算式
            for (var i = 0; i < p.NumberOfQuestions; i++)
            {
                IArithmetic strategy = CalculateManager(signFunc());
                Formula     formula  = strategy.CreateFormula(new ArithmeticParameter()
                {
                    MaximumLimit = p.MaximumLimit,
                    QuestionType = p.QuestionType,
                    MinimumLimit = 0,
                    LeftScope    = p.LeftScope,
                    RightScope   = p.RightScope
                });

                // 填空項目設定
                formula.Gap = CommonUtil.GetRandomNumber(GapFilling.Left, GapFilling.Right);

                // 判定是否需要反推并重新作成計算式
                if (CheckIsNeedInverseMethod(p, formula))
                {
                    defeated++;
                    // 如果大於五次則認為此題無法作成繼續下一題
                    if (defeated == INVERSE_NUMBER)
                    {
                        // 當前反推判定次數復原
                        defeated = 0;
                        continue;
                    }
                    i--;
                    continue;
                }

                // 計算式作成
                p.Formulas.Add(new ArithmeticOperationsFormula
                {
                    // 四則運算式
                    Arithmetic = formula,
                    // 等式值是不是出現在右邊(如果未指定則隨機產生)
                    AnswerIsRight = p.AnswerIsRight ?? IsRight
                });

                defeated = 0;
            }
        }
Esempio n. 5
0
        /// <summary>
        /// 算式作成
        /// </summary>
        /// <param name="p">題型參數</param>
        public override void MarkFormulaList(HowMuchMoreParameter p)
        {
            // 指定單個運算符實例(此題只能用減法運算符)
            IArithmetic strategy = CalculateManager(SignOfOperation.Subtraction);

            // 按照指定數量作成相應的數學計算式
            for (var i = 0; i < p.NumberOfQuestions; i++)
            {
                // 計算式作成
                Formula formula = strategy.CreateFormula(new ArithmeticParameter()
                {
                    // 10以內計算
                    MaximumLimit = (p.MaximumLimit > 10) ? 10 : p.MaximumLimit,
                    QuestionType = QuestionType.Default,
                    MinimumLimit = 0
                });

                if (CheckIsNeedInverseMethod(p.Formulas, formula))
                {
                    i--;
                    continue;
                }

                // 運算式作成
                HowMuchMoreFormula howMuchMoreFormula = new HowMuchMoreFormula()
                {
                    DefaultFormula = formula,
                    // 選擇左邊作為題目的條件還是右邊(隨機獲取)
                    DisplayLeft = CommonUtil.GetRandomNumber(LeftOrRight.Left, LeftOrRight.Right) == LeftOrRight.Left,
                    // 題型選擇:是表示多的題還是少的題(隨機獲取)
                    ChooseMore = CommonUtil.GetRandomNumber(MoreOrLess.More, MoreOrLess.Less) == MoreOrLess.More
                };
                // 文字表述部分內容作成
                howMuchMoreFormula.MathWordProblem = CreateMathWordProblem(howMuchMoreFormula);
                // 答案值(如果顯示的是左邊值,那麼答案就是右邊的值)
                howMuchMoreFormula.Answer = ((howMuchMoreFormula.DisplayLeft) ? howMuchMoreFormula.DefaultFormula.RightParameter : howMuchMoreFormula.DefaultFormula.LeftParameter);

                // 計算式作成
                p.Formulas.Add(howMuchMoreFormula);
            }

            // 智能提示作成
            VirtualHelperBase <HowMuchMoreFormula> helper = new HowMuchMoreDialogue();

            p.BrainpowerHint = helper.CreateHelperDialogue(p.Formulas);
        }
Esempio n. 6
0
        /// <summary>
        /// 算式作成
        /// </summary>
        /// <param name="p">題型參數</param>
        /// <param name="signFunc">運算符取得用的表達式</param>
        private void MarkFormulaList(MathUprightParameter p, Func <SignOfOperation> signFunc)
        {
            // 當前反推判定次數(一次推算內次數累加)
            int defeated = 0;

            // 按照指定數量作成相應的數學計算式
            for (var i = 0; i < p.NumberOfQuestions; i++)
            {
                IArithmetic strategy = CalculateManager(signFunc());
                // 運算式作成
                Formula formula = strategy.CreateFormula(new ArithmeticParameter()
                {
                    MaximumLimit = p.MaximumLimit,
                    QuestionType = p.QuestionType,
                    MinimumLimit = 1
                });

                // 判定是否需要反推并重新作成計算式
                if (CheckIsNeedInverseMethod(p, formula))
                {
                    defeated++;
                    // 如果大於八次則認為此題無法作成繼續下一題
                    if (defeated == INVERSE_NUMBER)
                    {
                        // 當前反推判定次數復原
                        defeated = 0;
                        continue;
                    }
                    i--;
                    continue;
                }

                // 計算式作成
                p.Formulas.Add(new MathUprightFormula
                {
                    Arithmetic = formula,
                    // 如果是標準題型則將等式結果項目作為填空項目,以外的情況則隨機產生一個填空項目位置
                    FillPosition = (p.QuestionType == QuestionType.Standard) ? FillPositions.Last() : CommonUtil.GetRandomNumber(FillPositions),
                    // 計算式數據鏈作成
                    FormulaDataLink = CreatFormulaDataLink(formula)
                });

                defeated = 0;
            }
        }
Esempio n. 7
0
        /// <summary>
        /// 題型構築
        /// </summary>
        /// <param name="p"></param>
        public override void MarkFormulaList(CombinatorialEquationParameter p)
        {
            for (var i = 0; i < p.NumberOfQuestions; i++)
            {
                // 對四則運算符實例進行cache管理
                IArithmetic strategy = CalculateManager(p.Signs[CommonUtil.GetRandomNumber(0, p.Signs.Count - 1)]);
                // 計算式作成
                Formula formula = strategy.CreateFormula(new ArithmeticParameter()
                {
                    MaximumLimit = p.MaximumLimit,
                    QuestionType = QuestionType.Default,
                    MinimumLimit = 1
                });
                // 獲得無效參數
                int invalidParameter = GetInvalidParameter(formula);

                // 判定是否需要反推并重新作成計算式
                if (CheckIsNeedInverseMethod(p, formula.LeftParameter, formula.RightParameter, formula.Answer))
                {
                    i--;
                    continue;
                }

                p.Formulas.Add(new CombinatorialFormula()
                {
                    ParameterA = formula.LeftParameter,
                    ParameterB = formula.Answer,
                    ParameterC = formula.RightParameter,
                    ParameterD = invalidParameter
                });
                if (formula.Sign == SignOfOperation.Plus)
                {
                    // 加法算式組合序列
                    p.Formulas.Last().CombinatorialFormulas = new List <Formula>()
                    {
                        new Formula()
                        {
                            LeftParameter = formula.LeftParameter, RightParameter = formula.RightParameter, Answer = formula.Answer, Gap = GapFilling.Default, Sign = SignOfOperation.Plus
                        },
                        new Formula()
                        {
                            LeftParameter = formula.RightParameter, RightParameter = formula.LeftParameter, Answer = formula.Answer, Gap = GapFilling.Default, Sign = SignOfOperation.Plus
                        },
                        new Formula()
                        {
                            LeftParameter = formula.Answer, RightParameter = formula.LeftParameter, Answer = formula.RightParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Subtraction
                        },
                        new Formula()
                        {
                            LeftParameter = formula.Answer, RightParameter = formula.RightParameter, Answer = formula.LeftParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Subtraction
                        }
                    };
                }
                else if (formula.Sign == SignOfOperation.Subtraction)
                {
                    // 減法算式組合序列
                    p.Formulas.Last().CombinatorialFormulas = new List <Formula>()
                    {
                        new Formula()
                        {
                            LeftParameter = formula.LeftParameter, RightParameter = formula.RightParameter, Answer = formula.Answer, Gap = GapFilling.Default, Sign = SignOfOperation.Subtraction
                        },
                        new Formula()
                        {
                            LeftParameter = formula.LeftParameter, RightParameter = formula.Answer, Answer = formula.RightParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Subtraction
                        },
                        new Formula()
                        {
                            LeftParameter = formula.Answer, RightParameter = formula.RightParameter, Answer = formula.LeftParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Plus
                        },
                        new Formula()
                        {
                            LeftParameter = formula.RightParameter, RightParameter = formula.Answer, Answer = formula.LeftParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Plus
                        }
                    };
                }
                else if (formula.Sign == SignOfOperation.Multiple)
                {
                    // 乘法算式組合序列
                    p.Formulas.Last().CombinatorialFormulas = new List <Formula>()
                    {
                        new Formula()
                        {
                            LeftParameter = formula.LeftParameter, RightParameter = formula.RightParameter, Answer = formula.Answer, Gap = GapFilling.Default, Sign = SignOfOperation.Multiple
                        },
                        new Formula()
                        {
                            LeftParameter = formula.RightParameter, RightParameter = formula.LeftParameter, Answer = formula.Answer, Gap = GapFilling.Default, Sign = SignOfOperation.Multiple
                        },
                        new Formula()
                        {
                            LeftParameter = formula.Answer, RightParameter = formula.LeftParameter, Answer = formula.RightParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Division
                        },
                        new Formula()
                        {
                            LeftParameter = formula.Answer, RightParameter = formula.RightParameter, Answer = formula.LeftParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Division
                        }
                    };
                }
                else
                {
                    // 除法算式組合序列
                    p.Formulas.Last().CombinatorialFormulas = new List <Formula>()
                    {
                        new Formula()
                        {
                            LeftParameter = formula.RightParameter, RightParameter = formula.Answer, Answer = formula.LeftParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Multiple
                        },
                        new Formula()
                        {
                            LeftParameter = formula.Answer, RightParameter = formula.RightParameter, Answer = formula.LeftParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Multiple
                        },
                        new Formula()
                        {
                            LeftParameter = formula.LeftParameter, RightParameter = formula.RightParameter, Answer = formula.Answer, Gap = GapFilling.Default, Sign = SignOfOperation.Division
                        },
                        new Formula()
                        {
                            LeftParameter = formula.LeftParameter, RightParameter = formula.Answer, Answer = formula.RightParameter, Gap = GapFilling.Default, Sign = SignOfOperation.Division
                        }
                    };
                }

                // 將參數亂序排列
                DisorganizeParameter(p.Formulas.Last());
            }
        }
Esempio n. 8
0
        /// <summary>
        /// 加減算式作成
        /// </summary>
        /// <param name="p">題型參數</param>
        public override void MarkFormulaList(CurrencyOperationParameter p)
        {
            // 標準題型(指定單個運算符)
            if (p.FourOperationsType == FourOperationsType.Standard)
            {
                // 考虑乘除法接龙答题结果会超出限制,所以只随机加减法策略
                if (p.Signs[0] == SignOfOperation.Division || p.Signs[0] == SignOfOperation.Multiple)
                {
                    p.Signs[0] = SignOfOperation.Plus;
                }

                // 指定單個運算符實例
                IArithmetic strategy = CalculateManager(p.Signs[0]);
                // 按照指定數量作成相應的數學計算式
                for (var i = 0; i < p.NumberOfQuestions; i++)
                {
                    Formula formula = strategy.CreateFormula(new ArithmeticParameter()
                    {
                        MaximumLimit = p.MaximumLimit,
                        QuestionType = p.QuestionType,
                        MinimumLimit = 0
                    });
                    if (CheckIsNeedInverseMethod(p.Formulas, formula))
                    {
                        i--;
                        continue;
                    }
                    // 計算式作成
                    p.Formulas.Add(new CurrencyOperationFormula
                    {
                        // 貨幣運算方程式
                        CurrencyArithmetic = formula,
                        // 等式值是不是出現在右邊
                        AnswerIsRight = IsRight
                    });
                }
            }
            else
            {
                // 按照指定數量作成相應的數學計算式
                for (var i = 0; i < p.NumberOfQuestions; i++)
                {
                    // 混合題型(加減運算符實例隨機抽取)
                    SignOfOperation sign = CommonUtil.GetRandomNumber(SignOfOperation.Plus, SignOfOperation.Subtraction);
                    // 對運算符實例進行cache管理
                    IArithmetic strategy = CalculateManager(sign);

                    var formula = strategy.CreateFormula(new ArithmeticParameter()
                    {
                        MaximumLimit = p.MaximumLimit,
                        QuestionType = p.QuestionType,
                        MinimumLimit = 0
                    });

                    if (CheckIsNeedInverseMethod(p.Formulas, formula))
                    {
                        i--;
                        continue;
                    }

                    // 計算式作成
                    p.Formulas.Add(new CurrencyOperationFormula
                    {
                        // 貨幣運算方程式
                        CurrencyArithmetic = formula,
                        // 等式值是不是出現在右邊
                        AnswerIsRight = IsRight
                    });
                }
            }
        }