在 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
替换了 O
在 HELLO
中)。此外,在所写的方向矩阵中,左上角到右下角的对角线方向是可能的,但右上角到左下角的对角线方向不是。也许这些想法有帮助。下面是一些调整后的代码:
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 中创建一个词搜索生成器,但我遇到了出现在网格中的词的问题。制作网格后,其中一个字母的坐标就在那里,而不是整个单词的坐标。我不确定是哪部分出了问题,如有任何帮助,我们将不胜感激
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
替换了 O
在 HELLO
中)。此外,在所写的方向矩阵中,左上角到右下角的对角线方向是可能的,但右上角到左下角的对角线方向不是。也许这些想法有帮助。下面是一些调整后的代码:
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
"""