根据限制,在战舰上重复随机放置船只

时间:2013-11-16 16:22:26

标签: python-2.7 random

我正在创建战舰领域,我创建了一种基于随机参数创建斑点的方法。这些点就像“1a”,“2a”设置。

这就是你打电话时的样子

ships.append(place_ship(ships, randint(2,3), letter, str(randint(1,4)), random.choice([True,False])))

randint(2,3)是指船的长度,随机选择参数是船是否垂直,字母是指随机字母:

letter = ''
while letter != "a" and letter != "b" and letter != "c":
    letter = random.choice(string.ascii_lowercase)

创建它的方法是place_ships:

def place_ship(ships, length, x, y, vert):
idk = {}
for i in range(length):
    square = y+x
    if vert:
        x = chr(ord(x) + 1)
    else:
        y = str(int(y) + 1)
    idk[i] = square
return idk

我的问题是如何在没有任何斑点穿过船只的情况下放置船只。

以下是列表中的位置的示例:

['2c', '2d', '3c', '4c', '2c', '2d']

所以2c,2d是一艘船3c,4c,然后是2c,2d

我尝试过以下操作,但它只检查第一艘船

for i in all_ship_loc:
    occurence = all_ship_loc.count(i)
    while occurence > 1:
        place_ship(ships, randint(2,3), letter, str(randint(1,4)),random.choice([True,False]))

谢谢!

2 个答案:

答案 0 :(得分:1)

您可能希望为每个可能的位置创建字典,因此您可以检查生成的位置是否已被占用。

dict = { "a1" : True } # True is occuped

或者您可以使用列表,但只使用已占用的位置。

答案 1 :(得分:1)

您可以存储占用地点的矩阵(值01)。放置船舶占据一些元素(船舶所在的位置,相邻的位置等)。对于给定的船舶尺寸和给定的行/列,您可以轻松找到可用的仓位数量。所以你的算法可能如下:

  • 从最大的船开始
  • 随机选择一个方向(水平/垂直)
  • 列举该方向可用的职位
  • 如果没有,重新定位最后一批船只
  • 选择可用集内的随机位置,标记占用的相应位置