当前位置: 首页 > 知识库问答 >
问题:

如果玩家位置具有列表值,则替换2d数组索引

凌博实
2023-03-14

所以现在当玩家进入一个位置(pos),比如A5,如果船不在那里,它会用空字符串替换板数组索引。但是如果船在那里,我希望它用hitShip字符串替换它。

public static void placePiece(String[][] board, String pos) {
        String empty = "0";
        String hitShip = "X";
        playerTargets.add(pos);

        switch (pos) {
            case "A1":
                board[1][2] = empty;
                break;
            case "B1":
                board[1][4] = empty;
                break;
            case "C1":
                board[1][6] = empty;
                break;
            case "D1":
                board[1][8] = empty;
                break;
            case "E1":
                board[1][10] = empty;
                break;
            case "F1":
                board[1][12] = empty;
                break;
            case "G1":
                board[1][14] = empty;
                break;
            case "H1":
                board[1][16] = empty;
                break;
            case "I1":
                board[1][18] = empty;
                break;
            case "J1":
                board[1][20] = empty;
                break;

开关盒在所有坐标(A1-J10)上继续

ship1的值为“A6”

 List ship1 = Arrays.asList(ar[0][0], ar[1][0]);
 List ship2 = Arrays.asList(ar[2][0], ar[3][0]);

我有这个代码来打印命中/未命中消息,这取决于玩家是否命中了一艘船,但我不确定如何使用它来用hitShip变量替换棋盘数组的索引。

// CHECKS IF THE PLAYER TARGETS HIT SHIP1
        boolean hit = false;
        for (Object string : ship1) {
            if (pos.contains((CharSequence) string)) {
                hit = true;
                break;
            }
        }
        // CHECKS IF THE PLAYER TARGETS HIT SHIP2
        for (Object string : ship2) {
            if (pos.contains((CharSequence) string)) {
                hit = true;
                break;
            }
        }

        // PRINTS HIT/MISS MESSAGE DEPENDING ON WETHER THE PLAYER HIT A SHIP
        if (hit) {
            System.out.println("\nHit!!!");
        } else {
            System.out.println("\nMiss!!!");
        }

共有1个答案

魏康安
2023-03-14

正如您所见,编写和维护大量switch语句会导致一个不那么优雅的解决方案。我建议您做的第一件事是清除代码。只要看一下,我就可以看到,随着pos第一个字符中的字母在字母表中的排列,你在board上使用的第二个索引增加了两个。

所以,让我们使用ASCII的魔力来解决所有这些重复代码:

public static void placePiece(String[][] board, String pos) {
    String empty = "0";
    String hitShip = "X";
    playerTargets.add(pos);

    int firstIndex = Character.getNumericValue(pos.charAt(1));
    int secondIndex = (pos.charAt(0) - 64) * 2;
    board[firstIndex][secondIndex] = empty;
}

现在,无论pos是什么,都会标记为空。如果我是你,我现在会有一个单独的方法来确定一艘船是否被击中——这是一个很好的做法,可以让你的代码更加模块化。

在我看来,你真的不需要使用列表,你可以为你的船使用数组:

String[] ship1 = new String[] {ar[0][0], ar[1][0]};
String[] ship2 = new String[] {ar[2][0], ar[3][0]};

//and we'll have an array of all these ships just to make things easier
String[][] ships = new String[] {ship1, ship2};

理想情况下,这些变量应该是全局变量,因为我们不需要每次检查用户是否撞到船时都不断创建它们。

现在我们将创建一个函数来确定某个位置是否有船只——请记住,模块化代码更容易更改和维护。我写的它与您写的非常相似,只是在使用船只数组时变得更短。

public static boolean isShip(String[][] board, String pos) {
    for (String[] ship : ships) {
        for (String shipPos : ship) {
            if (shipPos.contains(pos)) {
                return true;
            }
        }
    }
    return false;
}

现在,我们只需将新的isShip方法合并到重写的place ePiece方法中:

public static void placePiece(String[][] board, String pos) {
    String empty = "0";
    String hitShip = "X";
    playerTargets.add(pos);

    int firstIndex = Character.getNumericValue(pos.charAt(1));
    int secondIndex = (pos.charAt(0) - 64) * 2;
    String characterToPlace = empty;
    if (isShip(board, pos)) {
        characterToPlace = hitShip;
    }
    board[firstIndex][secondIndex] = characterToPlace;
}

我还没有测试过代码,但从外观来看,应该都能正常工作。通过阅读代码,我建议您进一步了解:

  • 以模块化方式构建代码
  • 编写“干净”代码

我建议在您了解泛型之前不要使用Lists。

 类似资料:
  • 为什么我的保安(S)和唐纳德(D)处于相同的位置。 地图应该是这样打印出来的 [D----] [- - - - -] [- - - - -] [--S-] [--P--] 但它却像这样出现 [S----] [- - - - -] [- - - - -] [- - - - -] [--P--] 所以正如你在这里看到的,我把安全位置设为[3,2],但出于某种原因,它没有将其识别为[3,2],并将安全位

  • 我有一个列中所有值都不同的列表,我需要用1替换该列表中不存在的所有值 这是我在python中所做的工作:

  • 问题内容: 我使用一个外部模块(libsvm),该模块不支持numpy数组,仅支持元组,列表和字典。但是我的数据是二维二维数组。我如何以pythonic方式转换它,也就是没有循环。 问题答案: 您可以简单地将矩阵转换为,以证明:

  • 问题内容: 我有一个奇怪的情况。 我有一个2D Numpy数组,x: 我有2个索引器-一个索引为行,一个索引为列。为了索引X,我必须执行以下操作: 不仅仅是: (失败:错误,无法通过(2,)广播(20,)) 我希望能够使用广播在一行中建立索引,因为这样可以使代码保持干净和可读性…而且,我对幕后的python并不太了解,但是据我了解它,它在一行中应该更快(我将使用相当大的数组)。 测试用例: 问题答

  • 问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由

  • 我正在尝试使用ArrayList构建一个21点纸牌游戏。我很难理解向所有玩家发一张牌的逻辑——我认为我的问题更多地涉及使用迭代器。。。。 问题出在游戏运行器的 //交易卡部分。我知道我没有正确使用itr为阵列列表中的每个玩家分配一张新卡。 来自玩家类: 来自甲板班