我可以在阵列中添加不同的画布笔划吗?

时间:2016-10-15 23:35:49

标签: java arrays arraylist javafx switch-statement

我目前正在使用开关/案例分组来为我的刽子手游戏添加身体部位。随着不正确的猜测增加,添加肢体。这是一个很长的开关块,并想知道我是否可以将每个案例添加到某种类型的数组,ArrayList,TreeMap等,并根据它们的索引号调用正文部分?有些是strokeLines,有些是strokeOvels。​​

我不是学生,但正在帮助一位正在我自己编码的朋友,我被困在一个带有丑陋代码的骑行街区。也就是说,由于这被用于许多CS类(基于谷歌搜索),我将数字改为X和Y。我在这里寻求帮助,而不是向他人提交一份备忘单给他们的作业。

public void paint(){
    GraphicsContext g = gameCanvas.getGraphicsContext2D();

    switch (newGame.getIncGuessMade()){
        case 0:{
            //gallows...
            g.strokeLine(X,Y,X,Y);
            g.strokeLine(X,Y,X,Y);
            g.strokeLine(X,Y,X,Y);
            g.strokeLine(X,Y,X,Y);
            g.strokeLine(X,Y,X,Y);
            g.strokeLine(X,Y,X,Y);
            g.strokeLine(X,Y,X,Y);
        }
        break;
        case 1: g.strokeOval(X,Y,X,Y);     //head
            break;
        case 2: g.strokeLine(X,Y,X,Y);     //chest
            break;
        case 3: g.strokeLine(X,Y,X,Y);     //Right Arm
            break;
        case 4: g.strokeLine(X,Y,X,Y);     //Left Arm
            break;
        case 5: g.strokeLine(X,Y,X,Y);     //Right Leg
            break;
        case 6: g.strokeLine(X,Y,X,Y);     //Left Leg
            break;
        case 7: g.strokeOval(X,Y,X,Y);     //Right Eye
            break;
        case 8: g.strokeOval(X,Y,X,Y);     //Left Eye
            break;
    }

}

1 个答案:

答案 0 :(得分:1)

选项1:您可以执行二维数组。

double[][] strokes = new double[][] {
    { ... },
    ...
    { ... }
};

然后,

public void paint(){
    GraphicsContext g = gameCanvas.getGraphicsContext2D();
    int i = newGame.getIncGuessMade();
    g.strokeLine(strokes[i][0], ..., strokes[i][3]);
}

当然,您需要使用不同的方法来处理绞架和其他方法,而i的检查会使它不那么好。

<小时/> 选项2:我会选择Gallows draw(g)方法,该方法使用值构建并存储在那里。对于所有绘图组件也可以进行相同的论证。

public interface Drawable {
    void draw(GraphicsContext g);
}

public class Gallows implements Drawable {
    @Override
    public void draw(GraphicsContext g) {
        // call what you need to draw the gallows.
    }
}

public class Head implements Drawable {
    @Override
    public void draw(GraphicsContext g) {
        // call what you need to draw the head.
    }
}

这些drawable中的每一个都将在本地具有坐标。调用代码不需要知道draw对每个函数的含义的任何细节;它只需要知道在它们上面调用draw

<小时/> 选项3:如果您不喜欢这种方式而且您使用的是Java 8,则可以使用与之前相同的2d双数组并编写BiConsumer<GraphicsContext, double[]>并将它们存储在数组中或列表也是如此。例如:

BiConsumer<GraphicsContext, double[]> chest = (g, strokes) -> {
    g.strokeLine(strokes[0], ..., strokes[3]); 
};

然后你会这样称呼:

chest.accept(g, strokes[i]);

或者,假设它在一个数组中,如下所示:

consumers[i].accept(g, strokes[i]);