奇怪(对我来说)循环错误

时间:2014-11-30 22:15:27

标签: java loops infinite

我在这里得到了一些索引越界的帮助,你们很棒。我通过添加以下代码行来添加到我的战舰游戏中的方向更改

 if(direction == 1){    

和      }否则{

在以下代码中。它从完美地工作到不断循环,但你们能不能给我一个关于为什么会这样的想法?

 package outlab6;

 import java.util.Scanner;

 public class Battleship {
private int rows;
private int cols;
private Spot spot[][];
Scanner input = new Scanner(System.in);

public  Battleship(int rows, int cols){
    this.rows = rows;
    this.cols = cols;
}
public void setBoard(){
    spot = new Spot[rows][cols];
    for(int i = 0; i < rows; i++){
        for( int j = 0; j < cols; j++){
            spot[i][j] = new Spot();
        }
    }
    //setup board to be completely empty
    for(int i = 0; i < rows; i++){
        for(int j = 0; j < cols; j++){
            spot[i][j].setShip(0);
        }
    }
 //     //test code
 //     for(int i = 0; i < rows; i++){
 //         for(int j = 0; j < cols; j++){
 //             System.out.print(spot[i][j].getShip());
 //         }
 //         System.out.println();
 //     }
        setShips();
}
public void printBoard(boolean active){


}
public boolean over() {

    return false;
}
public void makeGuess() {
    input.nextInt();

}
public void printStatistics() {


}
public void setShips(){
    //this method creates and places the ships
    //start with carrier and move on down
    for(int i = 5; i > 1; i--){
        int col;
        int row;
        boolean valid = false;
        //set a direction
        int direction = (int)(Math.random()*2)+1;
        //System.out.println(direction);
        //get a valid spot
        while(!valid){
        //generate a location
        int chosenRow = (int)(Math.random()* rows);
        int chosenCol = (int)(Math.random()* cols);
        System.out.println("Row:" + chosenRow);
        System.out.println("Col:" + chosenCol);
        //check to see if spot is open
        if(direction == 1){ 
            //for horizontal ships
            if(chosenCol + i < cols){
            for(int j = 0; j < i; j++){
                if(spot[chosenRow][chosenCol + i].getShip() == 0){
                    valid = true;
                }else{
                    valid = false;
                }
            }
        }else{
         //go through again
        }
        }else{

        }
    }
}
 }
 }

2 个答案:

答案 0 :(得分:1)

想想你的while循环何时退出?一旦有效将成立,它将立即退出。现在想想它什么时候会成真。只有在方向等于1时才会发生这种情况。然后查看方向设置的位置以及可能的方向值。瞧,有你的infinte循环。

答案 1 :(得分:1)

如果你从方向上移除* 2就可以了。现在它被设置为2(尝试粘贴System.out.println("Dir:" + direction);

如果删除* 2,则会得到以下输出(打印方向时):

Row:2
Col:3
Dir:1
etc...

另外还有1个提示: 在你的setBoard()中你做2个循环:创建斑点并使它们为空。为什么不在构造函数中将它们创建为空或者在同一循环中将它们设置为空?

public void setBoard(){
spot = new Spot[rows][cols];
for(int i = 0; i < rows; i++){
    for( int j = 0; j < cols; j++){
      spot[i][j] = new Spot();
      spot[i][j].setShip(0);
    }
  }
}