对于作业作业,我们必须编写一个模拟洪水冲破洪水的类(非常简单的2D模拟)。
我的实现工作得很好,但我发现有很多缺点(在我看来,Greenfoot的API中有一个缺陷,它应该使用泛型函数,而不是以类作为参数的函数,但我不确定这在Java中是否可行,因为这是我第一次编写Java代码)。
Sandstone和Sand都来源于Actor,后者来自格林弗特。
import greenfoot.*;
public class Water extends Actor {
public Water() {
getImage().scale(64, 64);
}
public void act() {
if (((DoorbraakWorld)getWorld()).stopped) return;
if (Math.random() < 0.9) return;
int dx = 0, dy = 0;
switch ((int)(3.0 * Math.random())) {
case 0: dx = 0; dy = 1; break;
case 1: dx = 1; dy = 0; break;
case 2: dx = -1; dy = 0; break;
}
// The next line looks so incredibly ugly…
Sandstone sandstone = (Sandstone)getOneObjectAtOffset(dx, dy, Sandstone.class);
if (sandstone != null) {
getWorld().removeObject(sandstone);
getWorld().addObject(new Water(), getX() + dx, getY() + dy);
}
Sand sand = (Sand)getOneObjectAtOffset(0, 1, Sand.class);
if (sand != null) {
((DoorbraakWorld)getWorld()).stopped = true;
return;
}
}
}我可以减少降级的数量吗?或者Java代码包含许多下位转换是正常的?我还能改进什么?
发布于 2012-11-29 03:27:34
通常可以通过在抽象类型中使用常见的方法来避免下播。
if (((DoorbraakWorld)getWorld()).stopped) return;这和getWorld().stopped()一样吗?
// The next line looks so incredibly ugly…
Sandstone sandstone = (Sandstone)getOneObjectAtOffset(dx, dy, Sandstone.class);
if (sandstone != null) {
getWorld().removeObject(sandstone);
getWorld().addObject(new Water(), getX() + dx, getY() + dy);
}您可以使用Actor类型:Actor sandstone = getOneObjectAtOffset(dx, dy, Sandstone.class)
Sand sand = (Sand)getOneObjectAtOffset(0, 1, Sand.class);这里也是:Actor sand = getOneObjectAtOffset(0, 1, Sand.class);
((DoorbraakWorld)getWorld()).stopped = true;greenfoot.stop()怎么样?
发布于 2012-11-29 03:50:26
我建议您尝试删除转换(每次一个),看看代码是否还在编译。
(如果getOneObjectAtOffset被声明为泛型函数,则其声明的返回类型可以是Class对象的类型,并且不需要向下转换。但是: 1)您仍然需要Class参数,2)在分配结果时,仍然会在幕后进行类型转换。)
然而,有一个地方是绝对不能移除的:
switch ((int)(3.0 * Math.random())) {如果没有(int)强制转换,switch将打开double值,这在Java中是不合法的。(但我想你指的不是那个演员.因为它可以说不是传统意义上的“沮丧”。)
https://codereview.stackexchange.com/questions/19119
复制相似问题