Использование оператора if внутри циклов?- обработка - PullRequest
0 голосов
/ 25 мая 2018

Допустим, я должен использовать оператор if внутри цикла for, а цикл 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 голосов
/ 01 июня 2018

Надеюсь, вы нашли ответ на свой вопрос.Я даю вам возможный ответ, который включает в себя объектно-ориентированное программирование.

Ваш вопрос немного выше базового.

Итак, возможный ответ:

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);
  }
}

Этоработает, но со временем становится медленнее.Вам нужно выяснить, почему.

Надеюсь, это поможет вам продолжить изучение обработки и программирования в целом.

PEACE.

0 голосов
/ 25 мая 2018

Вы устанавливаете i на 0 каждый раз ScoreX + i * 80 > width, верно?Нет никаких изменений в ScoreX или width, что означает, что цикл просто обратный отсчет до любого значения i делает это условие истинным, ставя вас в бесконечный цикл.

0 голосов
/ 25 мая 2018

Первый совет: изучите правильное соглашение 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);
   }
}
0 голосов
/ 25 мая 2018

Этот оператор

i = 0; //reset i to be 0

сбрасывает индекс цикла и поэтому может вызвать бесконечный цикл.

...