我目前正在使用开关/案例分组来为我的刽子手游戏添加身体部位。随着不正确的猜测增加,添加肢体。这是一个很长的开关块,并想知道我是否可以将每个案例添加到某种类型的数组,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;
}
}
答案 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
的检查会使它不那么好。
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
。
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]);