-Python- WordSearch:放置单词以正确处理重叠

-Python- WordSearch: Placing words to handle overlap properly

我一直在开发一个程序,该程序将从命令行 运行 读取包含单词的文件,然后根据这些单词生成 WordSearch 游戏。

我定义了几个函数,但我遇到问题的是 word_place 函数。这个函数应该采用我的网格或最初填充句点的二维数组:

width = 20
height = 20
grid = [['.' for i in range(0,width)] for j in range(0,height)]

然后将单词随机向后或向前、垂直、水平或对角放置,并随机放置在适合拼图宽度和高度的任意位置。

def word_place(word,grid):
global width, height

word = random.choice([word,word[::-1]])

direction = random.choice([[1,0],[0,1],[1,1]])
xsize = width if direction[0] == 0 else width - len(word)
ysize = height if direction[1] == 0 else height - len(word)

x = random.randrange(0,xsize)
y = random.randrange(0,ysize)

for i in range(0,len(word)):
    grid[y + direction[1]*i][x + direction[0]*i] = word[i]

return grid

虽然您可能已经看到,如果单词恰好相交,最后放置的单词将覆盖它相交的单词的字符。

我想让程序做的是检查我的二维数组的每个 "coordinate"。

例如,单词的第一个字母正好在grid[5][8],它应该检查那个位置是否有句号。如果是这样,那么它将检查下一个方块,依此类推。

基本上,如果我要放置的单词的字母是 ==. 或任何已经在索引中的字母,那么就可以放置,否则它应该报废那,给这个词一个新的起始坐标,然后再试一次。

抱歉,如果这太长或不清楚。如果您需要更多信息,请告诉我!

您可以只进行第一遍测试以确保所有空间都可用并记录索引。如果它是免费的,则插入值。如果网格的值与将放置在那里的字符相匹配,那么它仍然可以。

如果您在插入时进行测试,您仍然需要记录插入的位置,因为您将不得不回溯以将部分单词替换为 '.'

这可能是 for-else 构造的地方:

while True:
    x = random.randrange(0,xsize)
    y = random.randrange(0,ysize)

    for i in range(0,len(word)):
        if grid[y + direction[1]*i][x + direction[0]*i] not in ['.',word[i]]:
            break
    else:
        break
for i in range(0,len(word)):
    grid[y + direction[1]*i][x + direction[0]*i] = word[i]

这将继续更改 xy,直到初始 for 循环运行而不会中断。每当网格中的值不是自由 space 或它需要的字母 (word[i]).

时,第一个 for 循环就会中断。