2011-05-19 21 views
3

私の友人のバグを見つけることができませんし、私はJavaでテトリスのようなゲームを作って、それは、総作品数が同じ毎回付近で突然、その後のバグをしばらくの間、正常に動作します。たとえば、42回1回、46回、次回44回、それ以降にバグが発生する可能性があります。は私のJavaのテトリスゲーム

[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][2][2][ ][ ][ ][ ][ ][ ][7] 
[ ][2][2][2][3][3][ ][4][ ][7] 
[2][2][1][3][3][1][ ][4][ ][7] 

上記は、バグが発生する直前の例です。バグのようにあまりにも多くの上記のサンプルに読み込むしようとしないでください...

ここ

は、バグが発生した後、グリッドが右のように見えるものであるなど、ピース位置に依存しない

[ ][ ][ ][2][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][2][ ][ ][ ][ ][ ][ ] 
[ ][2][2][ ][ ][ ][ ][ ][ ][7] 
[ ][2][2][2][3][3][ ][4][ ][7] 
[2][2][1][3][3][1][ ][4][ ][7] 

2つの列がグリッドの一番上まで届いていますか?それが起こっていることです。

ここでは面白いことがあります。特定の関数と特定のコード行に限定しています。

grid[x+legend[piece.type].fetch(i, 0, piece.rotate)] 
    [y+legend[piece.type].fetch(i, 1, piece.rotate)] 
    .type = piece.type+1; 

上記のコード行は、問題を引き起こしていると思われるコード行です。問題は、そのコード行に間違いがないことです。私は約1週間、プログラム全体をデバッグしていましたが、毎回の後にのグリッドをログに記録しました。

上記の2つのグリッドの違いは、その行への1回の呼び出しでした。グリッド内の他のすべてのセルが割り当てられている必要はありません。デバッグログには次の変数があります。

これらは、上記の2番目のグリッドに影響を与えた変数です。コードのバグのラインは読んだことがあるでしょう:

grid[3+0][6+0].type = 1+1; 

それは、私たちは、Java自体のバグを発見していることは可能ですか?私はこのコードをデバッグする時間を費やしてきたと私は私が見つけることができなかったバグを持っていたことがありません。また

(私は通常のコードはPythonで、しかし... Javaは私にはかなり新しいです)、それはバグと思われますグリッドの大きさの影響を受けます。グリッドの高さを低い数値に設定すると、バグの原因が少なくなります。私は背の高いグリッドを作る場合、同じトークンで、それはより多くの部分を必要とします。

うまくいけば、Javaのエキスパートが、その状況を明らかにしてくれることを願ってください。

P.S.私はJRE JVM 1.6を使ってMacでEclipseでプログラミングしています。私もJRE JVM 1.4を試しました。同じことが起こります。

追加情報:

private Grid grid[][] = new Grid[dimx][dimy]; 

グリッドが作成されたときに上記のコードはあります。グリッドはクラスです:

public class Grid { 
    int type; 

    public Grid(int type) { 
    } 
} 

ここは、広範なデバッグログコードの一部です。これは、テキストベースのグリッドを印刷する関数です。

public void printGrid(int line) { 
    System.out.print("\n\n\n"+line+":\n"); 
    for (int y = 0;y < grid[0].length;y++) { 
     for (int x = 0;x < grid.length;x++) { 
      if (grid[x][y].type == 0) { 
       System.out.print("[ ]"); 
      } else { 
       System.out.print("["+grid[x][y].type+"]"); 
      } 

     } 
     System.out.println(); 
    } 
    System.out.println("\n\n"); 
} 

変数「ライン」

は重要ではなく、単に機能printGridが()から呼ばれていたものを行番号を教えてくれる。

は、あなたたちはどんなより多くの情報が必要なら、私に教えてください。

詳細追加情報:

ここでは、このプログラムのためのすべてのファイルがあります。

ああ、ここではより多くの情報を与えるためにデバッグログからの抜粋です。

http://pastebin.com/9VKhF8CR

それが正常に作品を配置することを含む(最後のピースは、バグの前に置か)と、それはバグが起こって表示されます。関数のすべての変数が出力され、いずれも適切な位置に表示されません。バグは、グリッド上の任意の場所に配置されている任意の部分に発生します。グリッドは、私が上で話した線を呼び出すたびに印刷されました。皆さんにもっと情報が必要な場合はお知らせください。私はこのバグを押しつぶして欲しい。

+6

は、「我々は、Java自体にバグが発見されていること、それは可能ですか?」 - そうは思わない。いつもあなた自身のコードをまず疑う.... –

+0

何かメッセージがありますか? NullPointerExceptionまたはそれ何か? IMHOログファイルは、作成したコードを知っているときに便利です。 –

+0

私は問題の他の場所を探すことを提案したいと思います。 (「不可能なものを取り除いてしまえば、残っているものは何でも、真実でなければなりません」)。グリッドの作成に使用されたコードとそれを表示するコードを表示できますか? –

答えて

4

あなたの問題の説明から、それはgrid[0]かのように表示され、grid[6]通じgrid[1]はすべて同じ行の配列への参照です(ただし、grid[7]以降は異なる配列への参照です)。これにより、記述した症状が発生します。単一の要素を変更すると、それらの行すべてが変更されて表示されます。

試してみてください。

System.err.println(grid[0] == grid[1]); 

とあなたがtruefalseを取得するかどうかを確認します。あなたはおそらくtrueになるでしょう。

+0

これは大きな仮説です。根本的な原因ではなくても、私はそれを投票しています。 –

+0

上記のコードを私のプログラムに追加しましたが、それはfalseを記録しています。私はまた、これが**しばらくしてから起こるという事実を繰り返し述べたいと思います**。バグがすぐには起こらず、バグが入り込むまでに時間がかかります。私は検索を続けて、あなたに私が新しい発見をするかどうかを知らせます。 – Bandit

+0

あなたはコード全体を表示していないので、「あとから」の部分は意味がありません。私たちができることは、あなたが何を記述したかを調べ、それがなぜ起こったのかというアイデアを思いつくことです。あなたのデータ構造がどのようになったのかはあなたの質問の一部ではありません。しかし、私は、Javaのデータ構造は、あなたが何かを実際に実行することなく、しばらくしてからランダムに変化するだけではないことを保証することができます。 –