如何检查一艘船是否在战舰游戏java

时间:2018-04-07 23:16:07

标签: java arrays algorithm methods

我开始在java中创建战舰游戏。我有5艘船长5,4,3,3,2和一个阵列int gameBoard[][] = new int[10][10];我放船。我还创建了一个数组boolean BoardHits[][]= new boolean[10][10];,我检查了播放器的命中。 现在我想创建一个方法boolean getBoardStrike(int[] hit),它将一个位置作为参数,并在BoardHits数组中添加一个命中,如果这个位置没有被再次命中。如果我们击中一艘船,我们必须检查所有船位是否都被击中(船沉没)。有没有有效的方法来实现这个? (当我把一艘船放在数组游戏中时,我把船上的ID,所以如果我在船上有一个长度为5的船,我有5个单元格,数字为5)。

public boolean getBoardStrike(int[] hit) {
    boolean flag = true;
    if (boardHits[hit[0]][hit[1]] = false) {
        hits[hit[0]][hit[1]] = true;
        //check if the whole ship is hitted
        return true;
    }
    else {
        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

我会尝试更多面向对象的方法,因为Java是面向对象的语言:

public interface Battleship {
    public void hit(Point shot);
    public List<Point> getCoordinates();
    public boolean isSinked();
}

public class BattleshipPart {
    private boolean hit;
    private Point coordinate;

    // getters and setters 
}

public abstract class AbstractBattleship implements Battleship {

    // these are for direction in constructors
    public static int NORTH = 1;
    public static int EAST = 2;
    public static int SOUTH = 3;
    public static int WEST = 4;

    protected List<BattleshipPart> parts;

    public void hit(Point shot) {
        return parts.stream()
            .findFirst(part -> part.coordinate.equals(shot))
            .ifPresent(part -> part.setHit(true));
    }

    public List<Point> getCoordinates() {
        return parts.stream()
            .map(part -> part.getCoordinate())
            .collect(Collectors.toList());
    }

    public boolean isSinked() {
        return parts.stream()
            .allMatch(BattleshipPart::isHit);
    }
}

public final class SmallBattleship extends AbstractBattleship {

    public SmallBattleship(Point start, int direction) {
        // create parts or throw exception if parameters weren't valid
    }
}

仅通过扩展AbstractBattleship并在构造函数中创建新零件来创建新船类型。