java - 我在《战地》游戏中的舰船放置看起来稳定吗? ( java )

标签 java

这是我为战舰游戏放置船只的代码:

    static void placeShips()
{
    Random r = new Random();

    int[] ships = {5, 4, 3, 3, 2};

    for(int i = 0; i < ships.length; i++)
    {
        int direction = r.nextInt(2);

        loop: switch(direction)
        {
        //Down
            case 0:
                int spot1 = r.nextInt(10 - (ships[i]+1));
                int spot2 = r.nextInt(10);

                for(int j = 0; j < ships[i]; j++)
                    if(boardArray[spot1 + j][spot2] != 0)
                    {
                        i--;
                        break loop;
                    }

                for(int j = 0; j < ships[i]; j++)
                    boardArray[spot1 + j][spot2] = 1;

            break;

        //Right
            case 1:
                spot1 = r.nextInt(10);
                spot2 = r.nextInt(10 - (ships[i]+1));

                for(int j = 0; j < ships[i]; j++)
                    if(boardArray[spot1][spot2 + j] != 0)
                    {
                        i--;
                        break loop;
                    }

                for(int j = 0; j < ships[i]; j++)
                    boardArray[spot1][spot2 + j] = 1;
            break;
        }
    }
}

有人知道可靠的测试方法吗?它尚未完成,但本质上该数组是一个 10x10(全部为 0),并且它使用此公式将船只放置在数组 boardArray 上。不断地重新运行程序有点烦人,有没有更快的方法来 100% 确定它们不会重叠?

通常情况下,我只会测试它,如果没有发现问题就将其提交,但这款游戏算作我的 final ,所以我希望它尽可能接近完美

最佳答案

最可靠的测试方法是写一些 unit tests 。谷歌有一句口头禅"Debugging sucks, testing rocks" .

要使代码可测试,最重要的更改就是使其具有确定性。

从根本上来说,代码的输出由两件事决定:

  • r生成的随机数;
  • boardArray 中的初始值。

如果您可以控制这两件事,那么您的代码每次运行时都应该执行完全相同的操作。这意味着每次您测试时它都会执行完全相同的操作。

控制这些的最简单方法是将两者作为方法参数传递:

static void placeShips(int[][] boardArray, Random r) {
  // Don't create r inside the method.

  // ... Rest of the method.
}

这样做的目的是将 placeShips 的工作与您在某处拥有的 static int[][] boardArray 的静态状态以及非在方法内创建Random 的确定性。

现在您处于更好的状态:您可以(并且应该)编写 JUnit 测试;但您现在可以从任何地方调用 placeShip,例如main(String[]) 方法:

int[][] boardArray = new int[10][10];  // Guaranteed to be full of zeros.
Random r = new Random(0);  // Seeded with 0, so it always generates the same numbers.

placeShips(boardArray, r);

// Now check the contents of boardArray are what you expect.

您实际上应该拆分 placeShips 中的逻辑来创建“测试接缝”:它目前是一个相当大的方法,您可以测试的只是 boardArray 有特定的特定位置的元素。我不会讨论如何分割它,但这是你应该考虑的事情。

关于java - 我在《战地》游戏中的舰船放置看起来稳定吗? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43544430/

相关文章:

Java内部类迭代器问题

java - 方法 "contains"的 Kotlin 逻辑转换为 Java 问题

javascript - 如何将对象从 angularjs 传递到 spring Controller

java - 如何在Java中绘制绝对自定义的形状?

java - 将 KeyListener 添加到自定义对象

java - 内存利用率

java - 有向图的邻接表

java - 在不更改现有应用程序的情况下,在不同服务器上的 Web 应用程序之间实现 SSO

java - 在 Java 中确定辅因子矩阵

java - 如何检测数组中两个字符串是否相等