我在寻找在一定规则下是否有可能为战舰下沉部分编写高效的AI时遇到了一些麻烦。
规则是:
好吧,我无法正式表达的是沉没船只的长度。我沉没一艘船后,就无法理解它的长度。
我想使用密度方法根据仍在游戏船中的长度来估计要射击的位置,但是如果没有系统来确定沉船的长度,我的密度永远不会变得“更聪明”。暂时,我只保存每次命中的北/南/东/西点,并考虑在堆栈为空时完成的工作。当然,这非常耗时。
我尝试澄清我要问的问题:假设您有一个二维数组,您可以通过这种方式跟踪拍摄结果:
你=未知地点
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为什么关闭?我正在寻找一种在一定条件下工作的算法…我给出了条件以及该算法应该做什么。我该如何澄清?我该如何表达这种问题?(很抱歉提出问题,没有争论的意图,只是学习)
在这些规则下,您实际上不可能完全了解沉船的长度。您可以分配一些概率,但是无法获得特定船只的长度。考虑一维版本:
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,以确保其中没有船另一个方向。