首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >洪水决堤的二维模型

洪水决堤的二维模型
EN

Code Review用户
提问于 2012-11-28 18:44:53
回答 2查看 138关注 0票数 2

对于作业作业,我们必须编写一个模拟洪水冲破洪水的类(非常简单的2D模拟)。

我的实现工作得很好,但我发现有很多缺点(在我看来,Greenfoot的API中有一个缺陷,它应该使用泛型函数,而不是以类作为参数的函数,但我不确定这在Java中是否可行,因为这是我第一次编写Java代码)。

SandstoneSand都来源于Actor,后者来自格林弗特。

代码语言:javascript
复制
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代码包含许多下位转换是正常的?我还能改进什么?

EN

回答 2

Code Review用户

回答已采纳

发布于 2012-11-29 03:27:34

通常可以通过在抽象类型中使用常见的方法来避免下播。

代码语言:javascript
复制
    if (((DoorbraakWorld)getWorld()).stopped) return;

这和getWorld().stopped()一样吗?

代码语言:javascript
复制
    // 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)

代码语言:javascript
复制
    Sand sand = (Sand)getOneObjectAtOffset(0, 1, Sand.class);

这里也是:Actor sand = getOneObjectAtOffset(0, 1, Sand.class);

代码语言:javascript
复制
    ((DoorbraakWorld)getWorld()).stopped = true;

greenfoot.stop()怎么样?

票数 3
EN

Code Review用户

发布于 2012-11-29 03:50:26

我建议您尝试删除转换(每次一个),看看代码是否还在编译。

  • 如果是的话你已经回答了你的问题。
  • 如果没有,你就没什么办法了.特别是如果根本原因是第三方库中的API设计很差。

(如果getOneObjectAtOffset被声明为泛型函数,则其声明的返回类型可以是Class对象的类型,并且不需要向下转换。但是: 1)您仍然需要Class参数,2)在分配结果时,仍然会在幕后进行类型转换。)

然而,有一个地方是绝对不能移除的:

代码语言:javascript
复制
switch ((int)(3.0 * Math.random())) {

如果没有(int)强制转换,switch将打开double值,这在Java中是不合法的。(但我想你指的不是那个演员.因为它可以说不是传统意义上的“沮丧”。)

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/19119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档