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

Posted

技术标签:

【中文标题】在 python 中构建一个单词搜索生成器【英文标题】:Building a wordsearch generator in python 【发布时间】:2021-12-11 06:38:01 【问题描述】:

我正在 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

【问题讨论】:

这可能是巧合/很好,因为您的网格宽度和高度值是相同的;你能解释一下为什么xstartystart 的值表达式是完全相同的表达式吗? 您能解释一下您希望words = random.choice([words, words[::-1]]) 做什么吗?它采用列表words 和反向列表words[::-1];我怀疑您打算将words 列表和单独反转的单词元素列表 [word[::-1] for word in words] @JoshuaVoskamp 是的,我刚刚意识到 x 和 y,我已经更改了 y,以便它改为 ystart = height if direction[1] == 0 else height - len(words)跨度> @JoshuaVoskamp 是的,我不知道如何得到单词中的每个字母,我认为这可能与此有关,但我不确定如何更改它以更正它 【参考方案1】:

您需要的唯一主要更改是return 上的缩进;正如您所指出的,您的代码确实放置了第一个字母,但没有放置其他字母。这是因为return 在您的for 循环内,所以它在第一次迭代时返回(在放置第一个字母之后)。

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

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
"""

【讨论】:

谢谢约书亚!我真的很感激帮助我朝着正确的方向前进!

以上是关于在 python 中构建一个单词搜索生成器的主要内容,如果未能解决你的问题,请参考以下文章

Symfony - 在学说查询构建器中使用 orWhere()

Python - 将字符列表与单词列表进行比较?

laravel 搜索多个以空格分隔的单词

将变量插入到python-docx生成的单词doc的标题中

用NLTK/Python生成一串N个随机英文单词

模糊文本搜索:正则表达式通配符搜索生成器?