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

时间:2013-05-16 00:19:22

标签: java algorithm

我发现在某些规则下,是否有可能为战舰的下沉部分编写有效的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耗时更好的&&不确定的方法?

希望澄清此事。

P.S。 我知道this question,但我读不到C#语言......几个月前刚刚用java开始:)

P.S。 2 我也知道this(参见最后的插图)据我所知,事情看起来完全相同,只是他认为最小长度= 2。我总是可以编码2个算法(如果我检测到最小长度> 1,如果最小长度= 1则再一次“转动消耗”,但我不知道他是如何管理这个东西的...看起来他认为只有密度......

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

1 个答案:

答案 0 :(得分: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次击中,并且一次击沉。如果没有检查从D2到D7的每个点,你就不能确定这些点击中是否有任何一个是在垂直的船上插入E行。你还必须检查F2​​到F6,以确保那里没有其他方向的船只。