bugfix> java > 投稿

forループ内でifステートメントを使用する必要があるとしましょう。forループは特定の条件で起動し、ifステートメントはforループが特定の段階に達したときにのみ起動します。

たとえば、条件は、ボールが画面から落ちるなど、特定のことが発生したときにカウントアップするカウンターです。ボールが画面を横切るたびに円が1つずつ描画されます。最初の行の円が画面の終わりに達すると、最初の行の下の2番目の行に円が表示され始めます。ただし、2行目は機能しません。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 件
  • 最初のアドバイス:適切な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);
       }
    }
    
    

  • この文

    i = 0; //reset i to be 0
    
    

    ループインデックスをリセットするため、無限ループが発生する可能性があります。

  • i を設定しています   0 へ  毎回 ScoreX + i * 80 > width 、 正しい? ScoreX に変更はありません  または width 、ループは i の値にカウントアップすることを意味します  その条件が真になり、無限ループに陥ります。

  • あなたの質問への答えを見つけたことを願っています。 オブジェクト指向プログラミングを含む可能な答えを提供します。

    あなたの質問は基本的なものより少し上です。

    可能な答え:

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

    これは機能しますが、時間の経過とともに遅くなります。理由を見つける必要があります。

    これが、一般的な処理とプログラミングの学習を続けるのに役立つことを願っています。

    平和。

あなたの答え