我怎样才能让一个随机空间入侵者射击?

时间:2017-04-26 16:44:57

标签: java processing

我一直致力于制作我自己版本的太空入侵者,除了允许我的外星人射击之外,我确实有一切工作,问题是现在我有一个2D阵列的外星人(15比3),我想拍摄导弹,每次射击,我都希望它来自一个随机的外星人,而不是一下子。

目前我的导弹是随机射击的,但是所有的外星人都会立即射击,因此几乎无法进行游戏。

以下是我的代码片段,其中我将绘制外星人并拍摄:

for (int j = 0; j < 3; j++) { //Adds aliens on the screen (15 by 3)
  for (int i = 0; i < 15; i++) {
    if (alien[i][j] != null) {
      alien[i][j].updateAlien();
      if (alien[i][j].edgeDetection() == true) { //If the edge is hit 
        for (int k = 0; k < 3; k++) {
          for (int l = 0; l < 15; l++) {
            if (alien[l][k] != null) {
              alien[l][k].deltaX = - alien[l][k].deltaX; //the aliens move the opposite direction
              alien[l][k].y = alien[l][k].y + 25; //the aliens move down a little
            }
          }
        }
      }
      for (int k = 0; k < 3; k++) {
        for (int l = 0; l < 15; l++) {
          if (alien[l][k] != null) {
            if (alienMissileCounter % 75 == 0) { //If the random int is divisible by 75 then the Aliens shoot a missile
              missileAlien.add(new MissileAlien(alien[l][k].x, alien[l][k].y, 10));
            }
          }
        }
      }
    }
  }
}

我在我的导弹上添加了[l] [k]位,认为只有一个会射击,但反之亦然。

这里也是用于添加导弹数量的for循环:

    for (int m = missileAlien.size()-1; m >= 0; m--) { //This adds one missile each time
  MissileAlien missilesalien = missileAlien.get(m); //This gets the number of missile i.e. 1
  missilesalien.updateMissile(); //This draws and moves the missile

  if (missilesalien.hitDefender(player) == true) { //If the defender is hit it loses a life
    missileAlien.remove(m);
    lives -= 1;
  }
}

如果您需要我粘贴您认为可能有帮助的任何其他代码,我将非常乐意这样做,这并不是什么大不了的事,因为我完成了游戏的其余部分,所以如果它不是& #39; t可解决然后不用担心。

更新:在这里发表评论之后,我的代码就像现在一样:

    alienMissileCounter = int(random(0, 100));


//Adds Aliens
for (int j = 0; j < 3; j++) { //Adds aliens on the screen (15 by 3)
  for (int i = 0; i < 15; i++) {
    if (alien[i][j] != null) {
      alien[i][j].updateAlien();
      if (alien[i][j].edgeDetection() == true) { //If the edge is hit 
        for (int k = 0; k < 3; k++) {
          for (int l = 0; l < 15; l++) {
            if (alien[l][k] != null) {
              alien[l][k].deltaX = - alien[l][k].deltaX; //the aliens move the opposite direction
              alien[l][k].y = alien[l][k].y + 25; //the aliens move down a little
            }
          }
        }
      }
      for (int k = 0; k < 3; k++) {
        for (int l = 0; l < 15; l++) {
          if (alien[l][k] != null) {
            if (alienMissileCounter == 75) { //If the random int is divisible by 75 then the Aliens shoot a missile
              alienMissileCounter = 0;
              missileAlien.add(new MissileAlien(alien[l][k].x, alien[l][k].y, 10));
            }
          }
        }
      }
    }
  }
}

3 个答案:

答案 0 :(得分:0)

为什么不使用内置java随机数生成器来激活具有随机索引值的入侵者。 如果你喜欢编码,那么尝试使用任何随机数生成算法生成伪随机数,如线性结果方法中方方法。这些是基于简短数学公式的非常简单的算法。

答案 1 :(得分:0)

你可以生成两个randoms:

int row = (int) random(numRows);
int col = (int) random(numCols);

但是,您需要检查该位置是否为null,然后重试 - 重复直到rowcol不是null。但是如果在2d阵列中没有外星人,则存在进入无限循环的危险 - 或者需要100次尝试才能找到非null外星人(例如,45个点中只剩下两个)。

如果你没有完全嫁给你的二维数组数据结构,我建议使用一种Java集合类型 - 也许是一个ArrayList。最大的卖点是它们是动态阵列。

您只需.add()预先设置所有外星人,并在击中时.remove()(而不是将该地点设置为null)。您的ArrayList将包含屏幕上可见的外星人数。然后随机选择一个非常简单:

// Assuming:
//  your alien class is Alien
//  your list is created like:
ArrayList<Alien> aliens = new ArrayList<Alien>();
//  aliens are added at some point, like:
aliens.add( new Alien() );

// in your loop that wants to drop a missile:
if ( aliens.size() > 0 ) {
  int randomIndex = (int) random( aliens.size() );
  Alien theAlien = aliens.get( randomIndex );
  // drop a missile from `alien`
}

顺便说一句,你的绘制循环也会简单得多:

boolean hitEdge = false;
for ( Alien alien : aliens ) {
  alien.updateAlien();
  hitEdge = hitEdge || alien.edgeDetection();
}
if ( hitEdge ) {
  for ( Alien alien : aliens ) {
    // do your bounced-off-the-edge stuff here
  }
}

答案 2 :(得分:0)

for (int k = 0; k < 3; k++) {
    for (int l = 0; l < 15; l++) {
        if (alien[l][k] != null) {
            if (alienMissileCounter == 75) { //If the random int is divisible by 75 then the Aliens shoot a missile
            //This area of code will only be reached if the initial value of 
            //alienMissileCounter is equal to 75 initially. If it is not, then no alien 
            //will have any missile. Also once this area is reached for the first time, 
            //only the first alien will shoot a missile and no subsequent alien can 
            //shoot a missile
                alienMissileCounter = 0;
                missileAlien.add(new MissileAlien(alien[l][k].x, alien[l][k].y, 10));
            }
        }
    }
}

在上面的代码中,您将遍历整个区域(15 * 3)并根据是否存在外星人来更新导弹。因此,每当您为该地区的每个外星人更新您的游戏时。所以你需要在循环中生成随机数,而不是像你做的那样。我还在代码本身中添加了一些注释

你应该在你的代码中使用这样的东西:

for (int k = 0; k < 3; k++) {
    for (int l = 0; l < 15; l++) {
        if (alien[l][k] != null) {
            alienMissileCounter = int(random(0, 100)); 
            //Every time an alien is detected, a new random number is 
            //generated. Now if it's equal to 75 as you want, this alien 
            //will shoot a missile otherwise not
            if (alienMissileCounter == 75) { //If the random int is divisible by 75 then the Aliens shoot a missile
                alienMissileCounter = 0;
                missileAlien.add(new MissileAlien(alien[l][k].x, alien[l][k].y, 10));
            }
        }
    }
}