在循环中使用if语句? - 处理

时间:2018-05-25 03:31:14

标签: java loops if-statement conditional processing

假设我必须在for循环中使用if语句,并且for循环在某个条件下触发,而if语句仅在for循环达到某个阶段时触发。

例如,条件是一个计数器,当某个事情发生时,例如球从屏幕上掉下来,它会计数。每当球穿过屏幕时,一个接一个地绘制圆圈。当第一行中的圆圈到达屏幕的末尾时,圆圈开始出现在第一行下方的第二行。但是第二行对我来说不起作用,我用if语句实现了它。

float BallY = 50; // y value of the ball
float BallX = 260; // x value of the ball
float ScoreX = 52;
float ScoreY = 40;
int counter;


void setup()
{
  size(512, 348); //width and height of screen
  counter = 0;
}

void draw()
{
  frameRate(600);
  background(255);
  fill(0);
  ellipse(BallX, BallY, 15, 15); //ball that will fall 
  BallY++; //ball's y value increases each frame
  if (BallY > height) //if ball's y value is greater than the screen
  {
    BallY = 0; //reset the y value of the ball back to 0
    counter++;
  }

  for (int i = 0; i < counter; i++) { 
    ellipse(ScoreX + i * 80, 40, 40, 40); // draw circles in the first row one by one

     if( ScoreX + i * 80 > width) // if the circles cross the width
     {
     i = 0; //reset i to be 0
     ellipse(ScoreX + i * 80, 80, 40, 40); // draw circles in the second row
     }
  }}

if语句仅在第一行的球越过宽度时触发,但是整个游戏只是停止而不是触发该行,这似乎是什么问题?

4 个答案:

答案 0 :(得分:1)

第一个建议:学习正确的Java编码约定,学习如何缩进代码,并学习命名变量。

对代码进行轻微改写应该是一个可读的修复:

int scoreStartX = 52;
int scoreStartY = 40;
int scoreBallSize = 40;
// scorePosX/Y means the position the score-ball should be drawn
scorePosX = scoreStartX;  // scoreStartX/Y = starting position of score balls 
scorePosY = scoreStartY;

for (int i = 0; i < score; i++) { 
    ellipse(scorePosX , scorePosY , scoreBallSize , scoreBallSize);

    // increment the positions, and wrap to next col if over screen width
    scorePosX += scoreBallSize ;


   if( scorePosX  > screenWidth) { // next score ball position is beyond the screen
       scorePosX = scoreStartX;
       scorePosY += scoreBallSize;
   }
}

进一步重构代码以使用Point来表示坐标

Point scoreStartPos = new Point(52, 40);
int scoreBallSize = 40;
Point scorePos = new Point(scoreStartPos );

for (int i = 0; i < score; i++) { 
   drawCircle(scorePos, scoreBallSize); // a little helper method makes your code easier to read

    // increment the positions, and wrap to next col if over screen width
    scorePos.translate( +scoreBallSize, 0);


   if( scorePos.getX() > screenWidth) { // next score ball position is beyond the screen
       scorePos.setLocation(scoreStartPoint.getX(),
                            scorePos.getY() + scoreBallSize);
   }
}

答案 1 :(得分:0)

本声明

i = 0; //reset i to be 0

重置循环索引,因此可能导致无限循环。

答案 2 :(得分:0)

您每次i都将0设置为ScoreX + i * 80 > width,对吧?对ScoreXwidth没有任何更改,这意味着循环将简单地重新计算为i的任何值使该条件为真,从而使您处于无限循环中。

答案 3 :(得分:0)

希望您找到了问题的答案。 我给你一个可能的答案,涉及面向对象的编程。

你的问题略高于基本内容。

这是一个可能的答案:

float BallY = 50; // y value of the ball
float BallX = 260; // x value of the ball
int counter = 0;

score[] scores; // object oriented programming
int n = 50; // number of objects

void setup() {
  size(512, 348); //width and height of screen
  frameRate(600);

  scores = new score[n]; // object oriented
  float myx = 40;
  float myy = 40;

  for (int i = 0; i < n; i++) {
    // here we create our n score objects
    // here n = 50 so 50 objects are created.
    scores[i] = new score(myx, myy);
    // here we increase the x coordinate
    myx += 40;
    // here we check the boundaries and
    // if we go past we reset myx to 40
    // and we go one line down
    if (myx > width) {
      myx = 40;
      myy += 40;
    }
  }
}

void draw() {
  background(255);

  fill(0);
  ellipse(BallX, BallY, 15, 15); //ball that will fall 
  BallY++; //ball's y value increases each frame
  if (BallY > height) //if ball's y value is greater than the screen
  {
    BallY = 0; //reset the y value of the ball back to 0
    counter++;
  }

  // we set the color
  fill(255/1, 255/1, 255/2);
  for (int i = 0; i < counter; i++) {
    if (counter < n) {
      // we draw the object
      scores[i].score_draw();
    }
  }
}

// OBJECT ORIENTED : THE CLASS
class score {

  float myx, myy;

  score(float x, float y) {
    myx = x;
    myy = y;
  }

  void score_draw() {
    ellipse(myx, myy, 40, 40);
  }
}

这可行,但随着时间的推移会变慢。你必须找出原因。

希望这有助于您继续学习处理和编程。

和平。