在 python 中构建单词搜索生成器

Building a wordsearch generator in python

我正在 Python 中创建一个词搜索生成器,但我遇到了出现在网格中的词的问题。制作网格后,其中一个字母的坐标就在那里,而不是整个单词的坐标。我不确定是哪部分出了问题,如有任何帮助,我们将不胜感激

import string 
import random 

width = 10
height = 10 



def place_words(words, grid):
    words = random.choice([words, words[::-1]])

    direction = random.choice([[1,0], [0,1], [1,1]])

    xstart = width if direction[0] == 0 else width - len(words)
    ystart = height if direction[1] == 0 else height - len(words)

    x = random.randrange(0, xstart)
    y = random.randrange(0, ystart)

    print([x, y])

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

grid = [[random.choice(string.ascii_uppercase) for i in range(0, width)] 
        for j in range(0, height)]

for words in ["HELLO"]:
    place_words(words, grid)



print("\n".join(map(lambda row: " ".join(row), grid)))

这是它的结果,正如你所看到的,没有这个词!

[3, 0]
R J E O K S Y U Q F
T E P U N B Y Z I O
J A Y N F D S V T Y
H G A M R W O T I M
O W J Q R G Q E D Q
W D J R T N N N Q N
K Z B X H V U Y J X
J F P D W F I C W U
C Z V B Q C Z R K X
E J A K R N J V S Y

您需要做的唯一重大更改是 return 上的缩进;正如您所指出的,您的代码确实放置了第一个字母,但其余的 none。这是因为 return 在你的 for 循环中,所以它在第一次迭代时 returns (在放置第一个字母之后)。

我建议做一些工作来充实这个想法,因为两个词可以在同一个网格上重叠(例如,在下面的示例中,DOOR 中的 D 替换了 OHELLO 中)。此外,在所写的方向矩阵中,左上角到右下角的对角线方向是可能的,但右上角到左下角的对角线方向不是。也许这些想法有帮助。下面是一些调整后的代码:

import string 
import random 

width = 8
height = 10 



def place_word(word, grid):
    word = random.choice([word, word[::-1]])
    
    direction = random.choice([[1,0], [0,1], [1,1]])
    print(f'Placing {word} in direction {direction}...')
    xstart = width if direction[0] == 0 else width - len(word) - 1
    ystart = height if direction[1] == 0 else height - len(word) - 1

    x = random.randrange(0, xstart)
    y = random.randrange(0, ystart)

    print([x, y])

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

grid = [[random.choice(string.ascii_uppercase) for i in range(width)] 
        for j in range(height)]

for word in ["HELLO","DOOR","NINE","EIGHT"]:
    place_word(word, grid)



print("\n".join(map(lambda row: " ".join(row), grid)))

"""Example output:

Placing OLLEH in direction [1, 1]...
[0, 3]
Placing DOOR in direction [0, 1]...
[0, 3]
Placing ENIN in direction [1, 0]...
[0, 0]
Placing THGIE in direction [1, 1]...
[1, 2]
e N L d o o r N
n T t B l J U Q
i Z G h L l D Q
n K S Y g M e D
Q V O I H i C h
K U W H K L e X
A A V M K X W N
G X D Q U E S B
W C G R E P R J
N G P V Q X N W
"""