我发现在某些规则下,是否有可能为战舰的下沉部分编写有效的AI代码时遇到了一些麻烦。
规则是:
嗯,我无法正式表达的是沉船的长度。一旦我沉没了船,它就无法理解它的长度。
我想使用密度方法根据游戏船的静止长度估算射击位置,但如果没有系统来获得沉没船的长度,我的密度永远不会变得“更聪明”。目前,我只保存每次击中的北/南/东/西点,并在我的筹码为空时考虑完成的工作。当然,这非常耗费精力。
我试着澄清我在问什么:假设你有一个二维数组,你可以用这种方式跟踪你的射击结果:
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 为什么关闭?我正在寻找一种在条件下工作的算法......我给出了条件以及算法应该做什么。我该如何澄清呢?我该如何表达这类问题? (对不起要求,没有争论,只是学习)
答案 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,以确保那里没有其他方向的船只。