gpt4 book ai didi

c# - 是否有可能减少重复的基于排列的 if 语句?

转载 作者:行者123 更新时间:2023-12-04 00:50:57 25 4
gpt4 key购买 nike

你好,我正在做这个数学游戏,在我的最后一个场景中,我做了很多重复的代码,但我不确定是否有办法简化它,我在下面链接了所以也许更老练程序员可能有一些更优雅的解决方案!例如,我试图生成类似 (a[]b)²[]c[]d 的每个排列,其中括号将替换为 +、-、* 或/。我一直在做的只是创建随机百分比 if 语句来选择特定版本,如“(a+b)²/c-d” 是否可能有比我一直在做的更少的“蛮力”和可读性方法?

if(UnityEngine.Random.Range(0,101)>50){
// 50% of being (a+b)²(c)+d
if(UnityEngine.Random.Range(0,101)>50){
ans = ((int) Mathf.Pow((float) a+ (float) b, 2))*c+d;
input.text = "("+a+"+"+b+")"+"²"+"("+c+")"+"+"+d+"=";
Debug.Log("Problem ID: 78");
// 50% of being (a+b)²(c)-d
} else {
ans = ((int) Mathf.Pow((float) a+ (float) b, 2))*c-d;
input.text = "("+a+"+"+b+")"+"²"+"("+c+")"+"-"+d+"=";
Debug.Log("Problem ID: 79");
}
// 50% of being (a-b)²(c)[]d
} else {
// 50% of being (a-b)²(c)+d
if(UnityEngine.Random.Range(0,101)>50){
ans = ((int) Mathf.Pow((float) a- (float) b, 2))*c+d;
input.text = "("+a+"-"+b+")"+"²"+"("+c+")"+"+"+d+"=";
Debug.Log("Problem ID: 80");
// 50% of being (a-b)²(c)-d
} else {
ans = ((int) Mathf.Pow((float) a- (float) b, 2))*c-d;
input.text = "("+a+"-"+b+")"+"²"+"("+c+")"+"-"+d+"=";
Debug.Log("Problem ID: 81");
}

(下面的 Pastebin 以获取更多上下文) https://pastebin.pl/view/d1bfb99e

最佳答案

我赞赏您希望使您的代码更具可读性的愿望。基本思想是拆分 (a) 定义、(b) 选择和 (c) 应用您的运算符。

  • 第 1 步:定义 Operator。每个 Operator 结合了数学运算(例如 Add 将是 (a, b) => a + b)和符号(例如 Add 将是 "+").

    class Operator
    {
    public Func<int, int, int> Calculate { get; }
    public string Symbol { get; }

    public Operator(Func<int, int, int> calculate, string symbol)
    {
    Calculate = calculate;
    Symbol = symbol;
    }
    }

    private Operator Add = new Operator((a, b) => (a + b), "+");
    private Operator Subtract = new Operator((a, b) => (a - b), "-");
  • 第 2 步:然后您随机选择您的运算符(我使用 System.Random,因为我不熟悉 Unity,但可以随意将其替换为随机数生成器您的选择):

    var rnd = new Random();

    private (Operator op1, Operator op2, int problemId) RandomlyChooseProblem()
    {
    switch (rnd.Next(4))
    {
    case 0: return (Add, Add, 78);
    case 1: return (Add, Subtract, 79);
    case 2: return (Subtract, Add, 80);
    case 3: return (Subtract, Subtract, 81);
    default: throw new InvalidOperationException("This should not happen.");
    }
    }
  • 第 3 步:应用它们:

    var (op1, op2, problemId) = RandomlyChooseProblem();

    ans = op2.Calculate((int)Math.Pow(op1.Calculate(a, b), 2) * c, d);
    input.text = $"(a{op1.Symbol}b)²*c{op2.Symbol}d");
    Debug.Log($"Problem ID: {problemId}");

添加新运算符(例如 Multiply)或新问题变体(例如 (Add, Multiply, 82))现在只需一行代码。

关于c# - 是否有可能减少重复的基于排列的 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66730726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com