一尘不染

关于某些规则下沉部分的战舰AI

algorithm

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

规则是:

  • 最短飞船的长度甚至可以是1。当游戏管理员为您提供要放置的飞船阵列时,您一开始就知道它
  • 船只不能重叠,但它们可能相邻
  • 游戏管理员会告诉您您的最后一击是击中,下沉还是未击中。没有有关您击中/沉没的船长的信息

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

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

我尝试澄清我要问的问题:假设您有一个二维数组,您可以通过这种方式跟踪拍摄结果:

你=未知地点

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我也知道一点(请参阅上一幅插图),据我了解,除他认为min
length = 2的事实外,其他内容看起来都差不多。我总是可以编写2种算法(如果我发现最小长度> 1,如果最小长度=
1,则再增加一个“转弯消耗”,但我不知道他如何处理该东西……看起来他只考虑密度…

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


阅读 405

收藏
2020-07-28

共1个答案

一尘不染

在这些规则下,您实际上不可能完全了解沉船的长度。您可以分配一些概率,但是无法获得特定船只的长度。考虑一维版本:

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,以确保其中没有船另一个方向。

2020-07-28