【问题标题】:Random Arithmetic Expressions (Android)随机算术表达式 (Android)
【发布时间】:2014-03-10 19:29:28
【问题描述】:

我的任务是创建一个 android 应用程序,向用户呈现四个级别的游戏难度。

有没有更简单的方法来制作这个项目以包含所有其他困难?

感谢您的帮助,马克

【问题讨论】:

    标签: java android math random expression


    【解决方案1】:

    我想我会做这样的递归(伪代码):

    private Random rnd;
    
    Expression randomExpression(int numTerms) {
        if (numTerms == 1)
          return LiteralExpression(rnd.nextInt(40 - 1) + 1)
        int split = rnd.nextInt(numTerms - 1) + 1;
        Expression left = randomExpression(split);
        Expression right = randomExpression(numTerms - split);
        Operator op = operators[rnd.nextInt(operators.length)];
        return CompoundExpression(left, op, right);
    }
    

    然后顶级调用可以随机选择numTerms适合所选级别。 CompoundExpressionLiteralExpression 都将派生自抽象基类 Expression,并注意将它们的内容转换为字符串并计算所需的结果。

    如果您想使用所需的最少括号数,特别是CompoundExpression 的字符串化将需要大量工作。为此,您可能还需要有关运营商的更多信息,例如它们的优先级以及它们是否具有关联性。这就是我选择将Operator 设为类(或者可能是enum)而不是简单的char 的原因。当然,你可以首先使用一个简单的字符串化,它总是将CompoundExpression 括在括号中,无论它是否需要它们。一旦基本功能到位,您就可以随时简化字符串,并且您实际上可以看到需要做更多工作的地方。

    【讨论】:

    • 有什么方法可以评估表达式吗?以及如何相应地设置我的文本字段?非常感谢,马克
    • 通过您必须实现的方法Expression.eval() 评估它,可能调用OPerator.eval(int, int)。使用 Expression.toString() 计算文本,您必须按照我的帖子中所述实现该文本,然后将其分配给文本字段。这里没有魔法可以从你那里拿走这项工作。
    【解决方案2】:

    从生成给出数字和整数的最基本方法开始。

    public String number(){
      return ""+(r.nextInt(40-1)+1);  
    }
    
    public String operator(){
      return ""+(operators[new Random().nextInt(operators.length)]); 
    }
    

    现在您可以使用此方法构建方程式。

    0 级很容易。可以看到是number() + operator() + number();

    public String level0(){
      return number() + operator() + number();
    }
    

    下一级是number() + operator() + number() + operator() + number();

    public String level1(){
      return number() + operator() + number() + operator() + number();
    }
    

    但是,正如您所见,很难为每个级别都创建这个。但是,正如您所见,级别 1 的第一部分与级别 0 (number() + operator() + number()) 相同。您所做的只是添加另一个运算符和数字来结束。其实可以这样写。

    public String level1(){
      return level0() + operator() + number();
    }
    

    但这也将成为负担,因为有很多级别。更简单的方法是使用递归。每一层其实就是“上一层的结果”+算子+数字;所以第n级是第(n-1)级+算子+数字;

    public String level(int n){
      return level(n-1) + operator() + number();
    }
    

    如果你运行这个,你会得到一个堆栈溢出。因为 n 将低于 1 并且您的递归没有退出条件。

    public String level(int n){
      if(n==1) return number() + operator() + number();
      else return level(n-1) + operator() + number();
    }
    

    现在,如果您调用 level(1),它只会返回类似“2*3”的内容。 level(2) 将返回 level(1)+operator()+number() 即 "2*3"+"-"+"5" 这将是 "2*3-5"

    【讨论】:

    • 感谢@taytay 的建议。有什么方法可以评估这种方法来产生和回答吗?我已经实现了一种方法,但是我无法将 String 表达式解析为 Int。再次感谢您的帮助,马克
    • 我重新检查了我的代码,它有很多语法错误,抱歉。我现在正在编辑它
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2015-07-02
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多