这是我为战舰游戏放置船只的代码:
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/