2017-01-25 6 views
1

ゲームボードのいくつかのエントリを特定の順序で反復処理してチェックしようとしています。 私が気づいたのは、メソッドがjunitテストで呼び出されたときに、最初のforループでスタックされ、次のものと続くことなく、メソッドの最後にジャンプするfalseを返します。 最初の3つのループを必要とするテストを実行すると動作しますが、もう1つのテストでは2番目のループが必要ですが、これは実行されません。メソッドがループのために条件付きの場合

質問:他のループを最初に確認することなく、なぜ終了にジャンプしますか?

public boolean hasDiagonal(Mark m) { 

    for (int i = 0; i <= dimension-4; i++) { 
     for (int j = 0; j <= dimension-4; j++) { 
      for (int k = dimension-1; k == 3; k--) { 
       if (getField(i , j , k ) == m && 
        getField(i+1, j+1, k-1) == m && 
        getField(i+2, j+2, k-2) == m && 
        getField(i+3, j+3, k-3) == m) { 
         return true; 
        //Stops here, if this part doesn't yield true, 
        //it returns false immediately 
       } 
      } 
     } 
    } 

    //This doesn't get checked 
    for (int i = dimension-1; i == 3; i--) { 
     for (int j = 0; j <= dimension-4; j++) { 
      for (int k = dimension-1; k <= 3; k--) { 
       if (getField(i , j , k ) == m && 
        getField(i-1, j+1, k-1) == m && 
        getField(i-2, j+2, k-2) == m && 
        getField(i-3, j+3, k-3) == m) { 
         return true; 
       } 
      } 
     } 
    } 
    return false; 
} 
+0

デバッガでコードをステップ実行しようとしましたか? –

+0

何が起こっているのかを確認するために2つのprintステートメントを使用しましたが、2番目の部分の印刷は印刷されません。また、すべてのものをwhileループに入れます。これにより、上記のコードの最初のループ部分に固執します。 – ffritz

+0

デバッガーを使用し、印刷ステートメントに依存しないでください。ステップフィルタを使用すると、実行のすべての行をトレースして、コードの実行方法を示すことができます。デバッガを使用すると、問題のある場所を特定できます。 IDEは通常、EclipseやIDEAなどのデバッガにバンドルされています –

答えて

1

あなたのループの条件部は、ここで問題にする必要があります -

for (int i = 0; i <= dimension-4; i++) { 
    for (int j = 0; j <= dimension-4; j++) { 
     for (int k = dimension-1; k == 3; k--) 

最も内側のループはdimension == 4場合、この変数に、ループ内には変更がないので実行されます。

i/j <= dimension(4)-4i/j <= 0として解決する場合は、j++またはi++と同じ時間チェックイン時をすれば、最も外側の第二のループは、偶数(ブロックは一度だけ実行されます)を複数回反復しません。

確かに、ループは指定された寸法とそれに応じて修正された条件でより良い取り扱いを必要とします。

+0

ありがとう、問題は確かにk == 3です。私は「kが3になるまで」と誤解しています。 – ffritz

2

私はあなたのループ条件のi == 3k == 3は、少なくともあなたの問題に貢献していると思われます。これらの条件では、dimension == 4以外のループはスキップされます。

+1

私はこれらの2つのケースで==または=>と思わなければなりません。 – Shiping

+0

@Shipingこれで解決しました。どうもありがとう。それがどのようにしてよりきれいになるのか、まだ考えている。 – ffritz

関連する問題