放置战舰'位置到数组[java]

时间:2016-09-21 02:08:09

标签: java arrays

我的战舰计划遇到了这个小问题。在我的测试仪中,我创建了一个船只对象[一个与pos1的起始位置垂直的驱逐舰(保持2个点)]以及一些测试人员:

public class BoatTester {

    public static void main(String[] args) {
        Position pos1 = new Position(4, 5);
        Position pos2 = new Position(3, 5);
        Boat ship1 = new Boat("Destroyer", pos1, "vertical");

        //Hits the starting position as it is a definite hit
        System.out.println("Hitting...");
        ship1.hit(pos1);

        System.out.println("Starting Position Hit? " + ship1.isHit(pos1)); //returns true   

        System.out.println("Ship Sunk? " + ship1.sunk(pos2)); //false, as the destroy has 2 spots
        System.out.println("");
        System.out.println("Hitting Other Position(s)...");

        //This doesn't work
        ship1.onBoat(pos2);

}}

在我的实际船只类(其中包含运行所有这些的代码)中,构造函数采用它的类型,起始位置(位置1)和方向,然后它将一个带有Position对象的数组填充到正确的斑点数量。

*注意位置obj,只有方法给出船的x和y位置。

**另请注意,代码会将数组位置[0]设置为起始位置(位置1)并从那里生成。

public class Boat {
    private String name;
    private Position location;
    private String orientation;

    private Position[] boat;

    public Boat(String ship, Position p, String orien){
        name = ship;
        location = p;
        orientation = orien;
        boat = new Position[size()];
        boat[0] = p;
        if(orientation.equals("Vertical"))  {
            for(int i = 1; i < size(); i++) {
                hold = new Position((location.rowIndex() + i), location.columnIndex());
                boat[i] =  hold;
            }
        }//Just the flipped of vertical 
        else if(orientation.equals("Horizontal"))   {
            for(int i = 1; i < size(); i++) {
                hold = new Position(location.rowIndex(), (location.columnIndex() + i));
                boat[i] =  hold;
            }
        }

    }

现在在这个Boat类中,当我调用另一个方法(不包括在内)来查看我从测试器传入的第二个位置是否存在时(假设它在那里)程序崩溃并出现错误说数组超出界限。我不明白为什么阵列没有第二个位置,因为看起来我的构造函数不是第二个位置obj。

*注意我尝试遵循礼仪并尽可能简洁,完整的代码可以在这里找到:https://docs.google.com/document/d/16Hp7Uu_-UZE3PwfQPurNIxl7CAzH8t2nEhUyB6Te_qc/edit?usp=sharing

**注2,我是学生,可能不知道java非常错综复杂的工作方式,所以请像我五岁那样解释。

编辑1:我的不好,这是例外:

Exception in thread "main" java.lang.NullPointerException
    at Boat.onBoat(Boat.java:80)
    at BoatTester.main(BoatTester.java:15)

Boat.onBoat上的那个只是我对阵列的船[1](第二个位置)的测试,显示那里什么都没有。

编辑2:这里是onBoat例外以澄清。

public boolean onBoat(Position spot){
        //Throws and exception here when I check the second index of the array
        System.out.println(boat[1].rowIndex()); //Specifically line 80
        System.out.println(boat[1].columnIndex());
}

3 个答案:

答案 0 :(得分:0)

for(int i = 1; i < size(); i++) {
            hold = new Position((location.rowIndex() + i), location.columnIndex());
            boat[i] =  hold;
        }
    }//Just the flipped of vertical 
    else if(orientation.equals("Horizontal"))   {
        for(int i = 1; i < size(); i++) {
            hold = new Position(location.rowIndex(), (location.columnIndex() + i));
            boat[i] =  hold;
        }

好吧,你的for循环只能为i = 1做一个循环,因为战列舰的大小是2。

答案 1 :(得分:0)

这可能是你的问题。你应该使用name.equals(“Destroyer”);

public int size(){
    if(name == "Aircraft Carrier"){
        return 5;
    }if(name == "Battleship"){
        return 4;
    }if(name == "Cruiser"){
        return 3;
    }if(name == "Destroyer"){
        return 2;
    }else{
        return 3;
    }
}

另外,您的尺寸函数可能以返回1;结束。我假设旧代码。

答案 2 :(得分:0)

Welp,这只是我愚蠢的案例之一。我使用.equals(&#34; Vertical&#34;)而不是.equalsIgnoreCase(&#34; Vertical&#34;),在测试器类中,我将它作为小写&#34;垂直&#34;所以它给了我一个错误。我很糟糕。