【问题标题】:Problem with ship overlapping in 2D-arrays for Battleships game, Java战舰游戏的 2D 阵列中的船舶重叠问题,Java
【发布时间】:2020-01-22 12:07:00
【问题描述】:

我正在用 Java 创建一个简单的基于控制台的 Battleships,对于不熟悉该游戏的人来说,它是在 2D 网格上玩的,您可以在其中水平或垂直放下不同大小的战舰。在我的示例中,它是使用 2D 字符数组创建的 10x10 网格。船只不允许相互重叠,它们不能共享同一个 1x1 网格。

我已经设法修复它们不能相互重叠,但我遇到的问题是如果一艘船在起始位置共享相同的列或行(取决于船是垂直放置还是水平放置),我放不下。

请参阅下面的示例图片以更好地理解。

'0' is "empty" slots, 'S' is current placed ships(3-sized). I can place (in this example) 4-sized ships at blue markers, but I can't place them like the red markers

    public void placeShip(ShipType shipType, int posX, int posY, int shipSize, Placement placement) {
    boolean success = true;
    char tempChar = 'x';

    if(shipType == ShipType.BATTLESHIP)
        tempChar = 'B';
    else if(shipType == ShipType.CARRIER)
        tempChar = 'C';
    else if(shipType == ShipType.DESTROYER)
        tempChar = 'D';
    else if(shipType == ShipType.SUBMARINE)
        tempChar = 'S';


    if(placement == Placement.HORIZONTAL) {

        for(int i = 0; i < posX+shipSize; i++) {
            for(int j = 0; j < posX+shipSize; j++) {
                if(board[i][posX-1] != '0' || board[posY-1][i] != '0') {
                    System.out.println("Can't place down the ship ");
                    success = false;
                    break;
                }
            }
        }

        if(success) {
            System.out.println("Got space");
            for(int i = 0; i < shipSize; i++) {
                board[posY-1][posX-1+i] = tempChar;
                success = false;
            }
        }
    }

    if(placement == Placement.VERTICAL) {
        for(int i = 0; i < posY+shipSize; i++) {
            for(int j = 0; j < posX+shipSize; j++) {
                if(board[posY-1][i] != '0' || board[i][posX-1] != '0') {
                    System.out.println("Can't place down the ship ");
                    success = false;
                    break;
                }                   
            }
        }

        if(success) {
            System.out.println("Got space");
            for(int i = 0; i < shipSize; i++) {
                board[posY-1+i][posX-1] = tempChar;
                success = false;
            }
        }
    }
}

上面是我用来放置船只的代码,我发送位置 X 和 Y 以及船的大小和船的方向。

【问题讨论】:

    标签: java arrays loops for-loop nested-loops


    【解决方案1】:

    您需要重新考虑您的循环以检查是否可以放下船。让我们把其中一个分解成简单的英语:

    if(placement == Placement.HORIZONTAL) {
      for(int i = 0; i < posX+shipSize; i++) {
        for(int j = 0; j < posX+shipSize; j++) {
          if(board[i][posX-1] != '0' || board[posY-1][i] != '0') {
            System.out.println("Can't place down the ship ");
            success = false;
            break;
          }
        }
      }
    

    第一期:

    for(int i = 0; i < posX+shipSize; i++)
    

    为什么我们要从 0 迭代到 posX+shipSize?我们只需要检查shipSize 空格。所以你应该从posX循环到posX+shipSize,或者从0循环到shipSize,而不是组合。

    第二期:

    尽管您的位置是水平或垂直的,但您正在嵌套您的 for 循环。这意味着您无缘无故地循环shipSize 次。您只需执行一次。

    第三期:

    if(board[i][posX-1] != '0' || board[posY-1][i] != '0')
    

    位置board[i][posX-1]在这种情况下没有意义,并且与你的船的位置无关,因为你总是从@987654333开始@。所以无论你想把你的船放在哪里,如果你有一个在同一排或同一列,我们就有问题。 这就是导致您问题的原因。相反,它应该类似于:if(board[posY-1][posX-1] != '0')

    最后,为什么不正确设置posXposY的位置呢?这样你就不用减1而迷惑自己了。

    最终,您的新块应该看起来像这样(但我不能确定,因为您没有发布最小可重现示例)

    if(placement == Placement.HORIZONTAL) {
      for(int i = 0; i < shipSize; i++) {
        if(board[posY-1][posX-1+i] != '0') {
          System.out.println("Can't place down the ship ");
          success = false;
          break;
        }
      }
    
      // your code
    

    【讨论】:

    • 感谢您的帮助,它帮我解决了这个问题。我对此感到非常困惑和慌乱,我尝试了很多东西,我想我只是添加了不必要的东西。
    猜你喜欢
    • 2018-01-05
    • 2014-01-18
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多