-1

我正在尝试用java编写一个小船战游戏。

它是100% 学术性的,我用它来练习递归,所以......我想使用它而不是迭代,即使它在大多数情况下更简单、更有效。

让我们谈正事吧。这些是规则:

  • 船有 1、2 或 3 格宽,只能水平放置。
  • 水用 0 表示,未命中的船格为 1,命中的船格为 2,沉船的所有格为 3。

设置了这些规则后,我使用以下数组进行测试:

int[][] board = new int[][]
{
    {0, 1, 2, 0, 1, 0},
    {0, 0, 1, 1, 1, 0},
    {0, 3, 0, 0, 0, 0},
    {0, 0, 2, 1, 2, 0},
    {0, 0, 0, 1, 1, 1},
};

到目前为止它工作得很好,为了使其更加用户友好,我想添加一些报告。这些是我需要的方法:

  1. 给定矩阵,返回其中的船只数量。
  2. 与 a) 相同,但按状态区分(未命中船只的数量、命中和沉没的船只数量)。

我需要帮助处理这些报告,我想得到一些想法。

记住它必须使用递归来完成,我想理解这一点,唯一的方法就是练习!

非常感谢您的时间和耐心:)。

4

2 回答 2

0

好吧,这看起来比这里的人们实际看起来要简单得多。

我可以在这里使用递归的方式是将整个矩阵中的船舶数量视为第一行中的船舶数量加上矩阵其余部分中的船舶数量。

如果你能解决这个问题,你就准备好了。

如何?

想想你的基本情况,停止递归调用的条件是什么?

解决连续计数船只的方法。

当你有这个时,返回行中的船只数量加上矩阵其余部分中的船只。

我相信你的方法的签名是这样的......

ShipCount(int[][] matrix, int numberOfRows, int numberOfCellsPerRow)

假设计数器变量称为“count”。你会有类似的东西:

//Signature
{
    int count = 0;
    if(/*Base condition*/){
    }else{
        /*Count the ships, work with the "count" variable.*/
    }
    return count + ShipCount(matrix[][], numberOfRows - 1, numberOfCellsPerRow) /*"numberOfRows - 1" takes you to the next row.*/
}

祝你好运#2 :)

于 2012-06-04T18:26:20.287 回答
0

这是不可能的,除非您指定船舶必须用0. 否则,1,1可能是一艘长度为 2 的船,或两艘长度为 1 的船。

鉴于这种限制,您的两个报告都可以/应该作为一个单一的过程来完成,将地图变成船只列表。

我不太想写出递归包装器(我假设您知道如何使用递归函数对数组进行“迭代”),所以我跳过了那部分。

  1. 遍历行,因为船不能跨行,它们可以被独立对待。
  2. 对于每个状态级的船数据都可以在(无船,船,沉船),有一个功能
  3. 该函数检查下一个元素是否
    1. 不存在
    2. 与当前相同(可以通过不同的功能进行硬编码)
    3. 与当前不同(转到右侧)。
  4. 当你遍历数组时,你组装了一个船列表。
  5. 你现在有一个船列表,你可以计算它的长度,或者做更复杂的报告

使用非硬编码的单个函数可能会更好,也可能不会更好,但这似乎有点困难,并且只有三个选项,硬编码并没有太多的代码开销(因为这三个都可以工作不同)。

或者,您可以使用完全独立的方法,通过遍历地图计算船舶的“上升边缘”。这是一个更轻量级的解决方案,但在您可以对结果数据执行的操作方面,您无法获得任何灵活性。

...通过更轻的重量,我的意思是“可以使用正则表达式完成”

于 2012-06-04T16:37:07.750 回答