我一直致力于制作我自己版本的太空入侵者,除了允许我的外星人射击之外,我确实有一切工作,问题是现在我有一个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));
}
}
}
}
}
}
}
答案 0 :(得分:0)
为什么不使用内置java随机数生成器来激活具有随机索引值的入侵者。 如果你喜欢编码,那么尝试使用任何随机数生成算法生成伪随机数,如线性结果方法或中方方法。这些是基于简短数学公式的非常简单的算法。
答案 1 :(得分:0)
你可以生成两个randoms:
int row = (int) random(numRows);
int col = (int) random(numCols);
但是,您需要检查该位置是否为null
,然后重试 - 重复直到row
,col
不是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));
}
}
}
}