0

我的程序中有一个关于无限循环和不正确响应的问题。在我的程序中,我试图为战舰游戏随机设置船只,但在放置船只部件时遇到问题。我已经对其进行了编码,但我遇到了 2 个问题,一个是我在某处有一个无限循环,但我不知道在哪里,下一个是这些碎片没有正确设置在网格上。我已经查看了这段代码很长时间,但我还没有找到解决方法。这里是 :

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

无论如何,这不会是完整的解决方案(您的代码还有其他问题),但尝试一次理解一个问题很重要。

(接下来要考虑的是,您需要在一个点检查一艘船的所有值-您需要选择一个点,然后尝试一艘船在该点占据的所有方格,如果您失败,您需要重新开始,而不是仅仅为 的值尝试不同的点i。)

于 2013-02-21T07:50:01.197 回答