对于Java中不同对象的每个循环

对于Java中不同对象的每个循环,java,foreach,Java,Foreach,我创建了一个吃豆人游戏,里面有所有的东西,但问题是鬼魂和它们的动画需要很多代码 例如: 每个幽灵目前需要3条if语句,即每个幽灵20行代码,如果我在游戏中有3个幽灵,则3 x 20=60行无用代码 以我的php经验,我会说。。使用foreach循环或类似的东西。。但是我应该如何在Java中做到这一点呢?有人能给我举个例子吗?我现在的做法发布如下: 创造鬼物 DrawPacMan ghost1 = new DrawPacMan(); DrawPacMan ghost2 = new DrawPacM

我创建了一个吃豆人游戏,里面有所有的东西,但问题是鬼魂和它们的动画需要很多代码

例如:

每个幽灵目前需要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);
}

在我看来,您并没有以面向对象的方式处理这个问题。为什么不使用重影集合,例如
列表
,并用它的位置、颜色等定义一个
重影
对象

这一行:

  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());
  }
List ghosts=new ArrayList();
对于(int i=0;i<10;i++){
添加(新的Ghost());
}
  • 将重影对象作为同一函数组件(图形g、重影gr)中的另一个参数传递
  • 您可以使条件语句内联,例如g1r==true?g1x+=重影速度:g1x-=重影速度

  • 由于您似乎是Java新手,并且仍在了解最好的习惯用法,因此我将提供一些建议,这些建议不是直接回答您的问题,而是从更一般的意义上说。你的代码

    if(g1r == true) {
        g1x += ghostSpeed;          
    }       
    if(g1r == false) {          
        g1x -= ghostSpeed;
    }
    
    可以重写为

    g1x += ghostSpeed * (g1r? 1 : -1);
    
    一般注意事项:永远不要将布尔值与文字值进行比较
    b==true
    b
    相同,
    b==false
    相同!b

    此代码

    if (g1x == 500 || g1x == 0) {
        g1r = !g1r;
    }
    
    可能会在运行时导致错误,因为您没有在代码中设置围栏:
    g1x
    可以轻松超越您的限制。你应该改写

    if (g1x >= 500) { g1x = 500; g1r = false; }
    else if (g1x <= 0) { g1x = 0; g1r = true; }
    
    如果(g1x>=500){g1x=500;g1r=false;}
    
    否则如果(g1x您试图解决的问题到底是什么?代码行太多?代码重复使用效率低下?处理鬼魂移动的时间太长?@Dr.Dredel OP非常清楚地说明了他的问题:这是代码设计。@OP这是一种更好的方法……也许可以读一点关于策略模式的内容谢谢您的示例!但是我的lis应该如何处理t看起来像?我对Java非常陌生,我还不知道大多数函数。@Reshad-请看上面修改的答案,ghost的for循环进入了我的绘图类或面板类?你能告诉我什么方法必须放在什么类或位置吗?我有一个PacMan类,上面显示的代码来自于该类,还有一个DrawGhost类。因此,我一直尝试在我的PacMan类中使用你的方法,因为我认为它属于那里,但我只得到了错误..谢谢提示!第二个方法让我在思考时感到困惑,我编写的代码工作正常,所以我没有回头看..但这似乎更符合逻辑!要这样改变它:)