针对不同对象的for-each循环

时间:2012-10-12 08:27:41

标签: java foreach

我创建了一个包含所有内容的pacman游戏,但问题是幽灵及其动画需要大量代码。

示例:

每个幽灵需要3个if语句,即每个幽灵有20行代码,如果我在游戏中有3个幽灵是3 x 20 = 60行无用编码......

用我的PHP经验我会说..使用foreach循环或类似的东西..但我应该如何用Java做到这一点?有人可以举个例子吗?我现在这样做的方式发表在下面:

创建鬼对象;

DrawPacMan ghost1 = new DrawPacMan();
DrawPacMan ghost2 = new DrawPacMan();

这幅画如下:

int g1x = 0;
boolean g1r = true;
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // pacman movement
    diameter = 75;   
    pacman.drawPacMan(g, getHorPlaats(), getVerPlaats(), diameter, getView(), Color.yellow);
    // ghosts movement
    if(g1r == true) {
        g1x += ghostSpeed;          
    }       
    if(g1r == false) {          
        g1x -= ghostSpeed;
    }
    if(g1x == 500 || g1x == 0) {
        g1r = !g1r;
    }
    System.out.println(g1r);
    ghost1.drawGhost(g, g1x, 40, diameter, Color.red);
    ghost2.drawGhost(g, 170, 70, diameter, Color.blue);
}

3 个答案:

答案 0 :(得分:7)

在我看来,你并不是以面向对象的方式接近这一点。为什么不使用鬼魂的集合,例如。 List<Ghost>并使用它的位置,颜色等定义Ghost对象?

这一行:

  ghost1.drawGhost(g, g1x, 40, diameter, Color.red);

然后将替换为

  ghost.draw(g);

并且您将遍历列表,为每个列表调用draw()

  for(Ghost ghost : ghosts) {
     ghost.draw(g); // pass in the graphics context
  }

每个幽灵知道它的位置,颜色,状态等,你可以创建任意多个:

  List<Ghost> ghosts = new ArrayList<Ghost>();
  for (int i = 0; i < 10; i++) {  
      ghosts.add(new Ghost());
  }

答案 1 :(得分:2)

既然你似乎是Java的新手并且仍然了解最好的习语,我会建议一些不能直接回答你问题的东西,但是在更一般的意义上是这样。你的代码

if(g1r == true) {
    g1x += ghostSpeed;          
}       
if(g1r == false) {          
    g1x -= ghostSpeed;
}

可以改写为

g1x += ghostSpeed * (g1r? 1 : -1);

一般说明:永远不要将布尔值与文字值进行比较。 b == trueb相同,b == false!b相同。

此代码

if (g1x == 500 || g1x == 0) {
    g1r = !g1r;
}

可能会在运行时导致错误,因为您不会在其前面添加fencing-in代码:g1x可以轻松超越您的限制。你应该写一下

if (g1x >= 500) { g1x = 500; g1r = false; }
else if (g1x <= 0) { g1x = 0; g1r = true; }

答案 2 :(得分:0)

  1. 将ghost对象作为另一个参数传递给相同的函数paintComponent(Graphics g,Ghost gr)
  2. 您可以内联条件语句,例如g1r == true? g1x + = ghostSpeed:g1x - = ghostSpeed