0

プログラムで、無限ループと誤った応答に関する問題が発生しています。私のプログラムでは、戦艦ゲーム用に船をランダムに設定しようとしていますが、船のパーツの配置に問題があります。私はそれをコーディングしましたが、2 つの問題が発生しています。1 つはどこかに無限ループがあることですが、どこにあるのかわかりません。次は、ピースがグリッド上で適切に設定されていないことです。このコードを長い間調べましたが、修正が見つかりませんでした。ここにあります :

    public void placeAllShips() {
  int direction = (int) Math.random()*2 ; 
  int p1 = 0 ; 
  int p2 = 0 ; 
  for(int ships = 1 ; ships < 6 ; ships ++ ) { 
   p1 = (int)(Math.random()*10); 
   p2 = (int)(Math.random()*10);  
   if ( p1 !=0 && p2!= 0 && direction == 0 /* Horizontal Direction*/ ){ 
    for(int i= 0; i < ships ; i ++ ){ 
     while(board[p1][p2+i].hasShip() == true || p2 + i > 10 && p2 - i < 0 ){  
      randomize(p1,p2) ;
     }
    }
    for(int j = 0 ; j < ships ; j ++ ) {
     board[p1][p2+j].setHasShip(true) ; 
    }

   } 
   else if ( p1 !=0 && p2!= 0 && direction == 1 /*Vertical Direction*/ ){ 
    for(int i= 0; i < ships ; i ++ ){ 
     while(board[p1+i][p2].hasShip() == true || p1 + i > 10 && p1 - i < 0 ){  
      randomize(p1,p2) ;
     }
    }
    for(int j = 0 ; j < ships ; j ++ ) {
     board[p1+j][p2].setHasShip(true) ; 
    }

   }
  }
 } 

 public void randomize( int x , int y ) { 
  //Generates random numbers.
  x = (int)Math.random()*10 ;
  y = (int)Math.random()*10 ;
 }

助けてくれてありがとう !

4

1 に答える 1

2

無限ループは、Java でパラメーターの受け渡しがどのように機能するかを理解していないことが原因であると思われます。このコードを見てください:

// You're calling this if you're trying to use a point which is already taken
randomize(p1,p2) ;

public void randomize( int x , int y ) {
    //Generates random numbers.
    x = (int)Math.random()*10 ;
    y = (int)Math.random()*10 ;
}

Randomの代わりに の単一のインスタンスを使用する方がクリーンであるという事実は別としてMath.random()randomize()メソッドは基本的に、期待どおりに機能していません。

それを呼び出すと、とのがパラメーターにコピーされ、初期randomize(p1, p2)値としてコピーされます。への変更と変更は変更されません...したがって、そのループにまったく入ると、無限になり、すべての反復で同じになります。p1p2xyxyp1p2p1p2

まず、ループを次のように変更する必要があります。

// Put this *outside* the top level loop so you only create a single instance
Random random = new Random();

...

while(p2 + i > 10 || p2 - i < 0 || board[p1][p2+i].hasShip()) {
    p1 = random.nextInt(10);
    p2 = random.nextInt(10);
}

これは決して完全な解決策ではありません (コードには他にも問題があります) が、一度に 1 つの問題を理解しようとすることが重要です。

(次に考えるべきことは、船のすべての値を1点で確認する必要があるという事実です。点を選択し、その点で船が占有するすべての正方形を試してください。失敗した場合は、その値の別のポイントを試すのではなく、最初からやり直す必要がありますi。)

于 2013-02-21T07:50:01.197 に答える