0

我在寻找在某些规则下是否有可能为战舰的下沉部分编写一个高效的 AI 时遇到了一些麻烦。

规则是:

  • 最短船的长度甚至可以是 1。你一开始就知道了,当游戏管理器给你船的阵列时
  • 船不能重叠,但它们可能是相邻的
  • 游戏管理器会告诉您最后一次投篮是命中、击沉还是未命中。没有关于你撞/沉船长度的信息

好吧,我无法正式表达的是沉船的长度。一旦我沉没了一艘船,我无法理解它的长度。

我想使用密度方法根据仍在游戏中的船的长度来估计在哪里拍摄,但是如果没有系统来获得沉船的长度,我的密度永远不会变得“更聪明”。目前,我只保存每次命中的北/南/东/西点,并在我的堆栈为空时考虑完成工作。当然,这非常消耗。

我试图澄清我在问什么:假设你有一个二维数组,你可以通过这种方式跟踪你的拍摄结果:

u = 未知点

m = 你在 x、y 上射击,游戏经理告诉你“错过”

h = 你在 x、y 上射击,游戏经理告诉你“击中”

s = 你在 x、y 上射击,游戏经理告诉你“沉没”

假设棋盘是 5 * 5。一开始你有这个:

      1 2 3 4
    1 u u u u
    2 u u u u
    3 u u u u
    4 u u u u

假设你在 2、3 上射击,游戏经理告诉你“击中”,现在你有:

      1 2 3 4
    1 u u u u
    2 u u h u
    3 u u u u
    4 u u u u

好的,现在你开始环顾你的最后一个镜头。无论您是使用密度方法还是从您击球的位置使用一堆 N/S/E/W 点。假设您的算法提出了 3、3。这次是错过:

      1 2 3 4
    1 u u u u
    2 u u h u
    3 u u m u
    4 u u u u

所以现在你尝试 2、2,它很成功:

      1 2 3 4
    1 u u u u
    2 u h h u
    3 u u m u
    4 u u u u

现在假设 2,1 和游戏经理告诉你“沉没”:

      1 2 3 4
    1 u u u u
    2 s h h u
    3 u u m u
    4 u u u u

好吧:知道船只可能是相邻的,你如何知道你刚刚沉没的船的长度而不在每个 N/S/E/W 点开枪?在这种情况下,您需要在 2,4 和 1,3 上拍摄,以几乎确定您沉没的东西,而且它会消耗掉。请参阅下面的 Mark Bessey 示例:这种情况比我的情况更加耗时 && 不确定。

所以问题很简单:没有什么比这种 N/S/E/W 耗时 && 不确定的方法更好的了?

希望它能澄清这个问题。

ps 我知道这个问题,但我看不懂 C# 语言......几个月前刚开始使用 java :)

ps 2 我也知道一点(见最后的插图),据我所知,除了他认为最小长度 = 2 之外,事情看起来完全一样。我总是可以编写 2 种算法(如果我检测到最小长度> 1,如果最小长度= 1,则再“消耗”一个),但我不明白他是如何管理这件事的……看起来他只考虑密度……

ps 3 为什么关闭?我正在寻找一种在条件下工作的算法......我给出了条件以及算法应该做什么。我该如何澄清?我该如何表达这种问题?(不好意思问了,没有争论的意思,只是学习)

4

1 回答 1

0

根据这些规则,您实际上无法完全了解任何沉船的长度。您可以指定一些概率,但无法获得特定船的长度。考虑一维版本:

0123456789
.XXXXXYY..

其中“X”和“Y”代表不同的船舶。如果你从 4 号位置开始射击,并继续向右走,你会在 4 次命中后击沉一艘船。你知道你刚刚沉没的船超过 4 个空格,但实际上它可能是 1-4 个空格。

有可能的是你击中了一艘船,但你可以通过从第一次击中回溯来验证这一点。在这种情况下,您会一直被击中到位置 1,然后另一艘船将被报告为“沉没”。所以你知道船 X + 船 Y 总共有 7 个空格。只有少数几个组合可以加起来为 7,所以那里有一些信息。不幸的是,有许多可能的两船组合加起来是 7 个。

在 2D 板上更糟:

 0123456789
A..........
B..........
C..A.......
D..A.......
E..ABCDEE..
F...BCD....
G...BCD....
H....CD....
I.....D....
J..........

如果你从 E0 射到 E9,你会得到 6 次安打,1 次沉没。如果不检查从 D2 到 D7 的每个点,您将无法确定是否有任何这些命中是在垂直于 E 排的船只上。您还必须检查 F2 到 F6,以确保没有船只在另一个方向。

于 2013-05-16T01:03:58.630 回答