0

したがって、私のプログラムは実行され、右上から始まるひし形の列を描画します。次に、行を下に移動して繰り返します。(キャンバスサイズのために)4行で停止する必要がありますが、停止しません!

最初のステートメントはダイヤモンドを描画します。ステートメントの2番目は、次のダイヤモンドに移動します。7回繰り返します。

3番目のforステートメント(これが問題であると私が想定している場所です..)は行を下に移動し、最初の2つを繰り返します。

すべてが完璧に実行されます!止まらないまで!

それは無期限に繰り返され続けるだけです!

import Media.*;
import static java.lang.Math.*;

public class DiamondTiles2 {

private TurtleDisplayer display;
private Turtle            steve;

public DiamondTiles2 (){

display = new TurtleDisplayer();
steve = new Turtle();
display.placeTurtle(steve);

steve.setSpeed(15);
steve.forward(140);             // Moves Steve to the furthest right he needs to be
steve.left(PI/2);
steve.forward((float)1.5*(40*sqrt(3.0)));  // Moves Steve to the top (up 1.5 times the height of a diamond)
steve.left(PI/6);
steve.penDown();

for (int j=1 ; j<=7 ; j++){  //Diamond Drawing
  steve.forward(40);
  steve.left(2*PI/3);        
  steve.forward(40);
  steve.left(PI/3);
  steve.forward(40);
  steve.left(2*PI/3);
  steve.forward(40);
  steve.left(PI/3);
  for (int i=1 ; i<=1 ; i++){ //Move to Next Diamond
    steve.penUp();
    steve.left(PI/3);
    steve.forward(40);
    steve.right(PI/3);
    steve.penDown();         
    for (int k=1 ; (j>=7)&&(k<=4) ; j=j-7 , k++){ //Move to next row
      steve.penUp();
      steve.right(7*PI/6);
      steve.forward((float)40*(sqrt(3.0)));
      steve.left(PI/2);
      steve.forward(280);
      steve.left(2*PI/3);
      steve.penDown();
    }
  }
}  
display.close();
};
public static void main ( String[] args ) { DiamondTiles2 d = new DiamondTiles2(); };
}

私の見方:最後のforループはk == 1として開始し、kを毎回1ずつ増やす必要があります。そしてそれは4を過ぎて繰り返されるべきではありません

for (int k=1 ; (j>=7)&&**(k<=4)** ; j=j-7 , k++)

助けてください!:)

編集:わかりました、それでjは間違いなく問題です...なぜ私がリセットするのかを説明するためにJ:私が7で7をリセットしなかったとき、それは最初の行を描画し、それから新しいに移動するステップを無限にループします行。したがって、描画を停止し、「下、右、下、右、下、右...など」を移動します。

j = j-7を追加すると、その問題は修正されましたが、この新しい問題が開始されました。k<= 4が真ではないため、どのiが修正されると思いますか...そのブール値を「無視」しているように見える理由は何ですか。

EDIT2:修正済み:最後のforステートメントをこのIFステートメントに変更しました:

 if ((j>=7)&&(x<=3)){ //Move to next row
      steve.penUp();
      steve.right(7*PI/6);
      steve.forward((float)40*(sqrt(3.0)));
      steve.left(PI/2);
      steve.forward(280);
      steve.left(2*PI/3);
      steve.penDown();
      j=j-7;
      x=x+1;

私を助けてくれたみんなに感謝します!このサイトで素晴らしい反応!

4

4 に答える 4

0

参照した行のj=j-7が、jの最初のforループで意図を台無しにしていない可能性はありますか?

于 2012-10-15T01:37:29.220 に答える
0

j最も外側のループでインクリメントし、j最も内側のループでリセットします。それはトラブルを求めているようです。j最も内側のループは、それが7以上になることはないことを保証します。したがって、最も外側のループは決して終了しません。

外側のステートメントj以外で変更しないようにリファクタリングします。for

また、デバッガーを使用して、何が起こっているかを確認することをお勧めします。

于 2012-10-15T01:37:54.300 に答える
0

問題は次のように見えj=j-7ます。ループは、jが7以上で、kが4未満の場合にのみ停止jします。反復ごとに7ずつデクリメントされるため、条件が満たされることはありません。

于 2012-10-15T01:38:31.280 に答える
0

そのループでは、 4を超えて繰り返されることはありません。問題は、最も内側のループが無限に実行されているため、1〜4、1〜4、1〜4などのループになっていることです。

そのループが無限に実行されるのはなぜですか?

最も内側のループと最も外側のループのターミネータが対立しているようです。7を超えるたびに最も内側のループでjから7を引くため、jが7以下である限り、最も外側のループが実行されます。jは、最も外側のループが終了するのに十分な大きさになることはありません。これは、最も内側のループが何度も何度も実行されることを意味します(最も外側のループは無限であるため)、1-4、1-4、1-4 ...

于 2012-10-15T01:39:26.080 に答える