【发布时间】:2014-03-10 19:29:28
【问题描述】:
我的任务是创建一个 android 应用程序,向用户呈现四个级别的游戏难度。
有没有更简单的方法来制作这个项目以包含所有其他困难?
感谢您的帮助,马克
【问题讨论】:
标签: java android math random expression
我的任务是创建一个 android 应用程序,向用户呈现四个级别的游戏难度。
有没有更简单的方法来制作这个项目以包含所有其他困难?
感谢您的帮助,马克
【问题讨论】:
标签: java android math random expression
我想我会做这样的递归(伪代码):
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适合所选级别。 CompoundExpression 和 LiteralExpression 都将派生自抽象基类 Expression,并注意将它们的内容转换为字符串并计算所需的结果。
如果您想使用所需的最少括号数,特别是CompoundExpression 的字符串化将需要大量工作。为此,您可能还需要有关运营商的更多信息,例如它们的优先级以及它们是否具有关联性。这就是我选择将Operator 设为类(或者可能是enum)而不是简单的char 的原因。当然,你可以首先使用一个简单的字符串化,它总是将CompoundExpression 括在括号中,无论它是否需要它们。一旦基本功能到位,您就可以随时简化字符串,并且您实际上可以看到需要做更多工作的地方。
【讨论】:
Expression.eval() 评估它,可能调用OPerator.eval(int, int)。使用 Expression.toString() 计算文本,您必须按照我的帖子中所述实现该文本,然后将其分配给文本字段。这里没有魔法可以从你那里拿走这项工作。
从生成给出数字和整数的最基本方法开始。
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"
【讨论】: