Python 2.7 根据限制条件,重复在战列舰中随机放置舰船

Python 2.7 根据限制条件,重复在战列舰中随机放置舰船,python-2.7,random,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 l

我正在创建一个战舰战场,我已经创建了一种基于随机参数创建点的方法。这些点类似于“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\u 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]))

谢谢

您可能需要为每个可能的位置创建一个字典,因此您需要检查生成的位置是否已被占用

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

或者你可以使用一个列表,但只列出被占用的位置

您可以存储占用位置矩阵(值
0
1
)。放置船舶占用了一些要素(船舶所在位置、相邻位置等)。对于给定的船舶尺寸和给定的行/列,您可以轻松找到可用的位置数量。因此,您的算法可能如下所示:

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

简单(易于实现)的方法是尝试重复放置船只,拒绝重叠布局。您可以改进while-
,而不是{“a”、“b”、“c”中的字母