如何生成单词搜索网格,使单词使用相同的字母
How to generate a word search grid that enables words using the same letter
我正在尝试制作一个包含给定单词列表的单词搜索网格。
我的问题是有些词没有正确显示。
我更新了代码,见下文
我已尝试修复之前的错误,但现在遇到无法修复的超出范围错误,如果有人能提供帮助,我将不胜感激
注1:我没有包含所有程序功能,如果需要我稍后会包含它们
程序接收这样的文本文件:
9 9
white
black
blue
green
pink
yellow
red
grey
purple
文件中的前 2 个数字是网格的尺寸,其余是要放置在网格中的单词。
import random
import string
fi=input('Insert the entry file name(entry.txt): ')
fo=input('Insert the exit file name(.txt): ')
grid_size=[]
words=[]
matrix=[]
def read_file(storage):
file=open(storage)
n=file.readline()
lista=n.split()
lista=list(map(int,lista)) #sets the size of the grid
for i in lista:
grid_size.append(i)
for line in file:
line=line.replace("\n","")
words.append(line)
file.close()
def grid_generator(grid_size):
n, p = grid_size
for i in range(n):
matriz.append([])
for j in range(p):
matriz[i].append(".")
def sets_word_inside(grid_size, word, grid):
n, p = grid_size
word = random.choice([word,word[::-1]])
#horizontal,vertical,diagonal
d = random.choice([[1,0],[0,1],[1,1]])
xsize = n if d[0] == 0 else n - len(word)
ysize = p if d[1] == 0 else p - len(word)
x= random.randrange(0,xsize)
y= random.randrange(0,ytsize) #position
for i, letter in enumerate(word):
char = grid[y+d[1]*i][x+d[0]*i]
if char != " " and char != letter:
# If it reaches an already filled space - restart the process.
# The second condition allow the words that cross with repeated words are created.
return False
grid[y+d[1]*i][x+d[0]*i] = letter[i]
return True
现在代码的输出是这样的:
9
white
black
blue
green
pink
yellow
red
grey
purple
p w b i t y l d i
p v w o l e e y t
x g a x j r i m g
q i c j b g j e x
s s k g q l g r r
p i n k i o u t r
e l p r u p g e o
l a b l s r p g y
c o r y e u f r x
我发现了两个基本问题:您用新词覆盖了现有词,并且您写的超出了实际词的末尾。
第一个问题是您在添加新词之前没有费心去查找之前的词。
第二个问题是因为您未能从输入中删除 white-space。
我添加了一些简单的调试工具来跟踪它。首先,我将网格初始化为点而不是字母,这样我就可以看到发生了什么:
for j in range(p):
matrix[i].append(".")
然后,我在添加每个单词后打印矩阵:
for i in range(0,len(word)):
grid[y+d[1]*i][x+d[0]*i]=word[i]
print "\nUpdated grid with\t", word, "\n",
for row in range(n):
print " ".join(matrix[row])
return grid
然后我 运行 它得到了这个输出:
Updated grid with white
. . . . . . . . .
. . . . . . . . .
. w h i t e .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Updated grid with kcalb
. . . . . . . .
. . . . . . . .
. w h k t e .
. . . . c . . . .
. . . . . a . . .
. . . . . . l . .
. . . . . . . b .
. . . . . . . . .
. . . . . . . . .
Updated grid with blue
. . . . . . . .
. . b . . . . . .
. w h l t e .
. . . . u . . . .
. . . . . e . . .
. . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . . .
Updated grid with neerg
. . . . . . .
. b . . . . . .
. w n l t e .
. . . e u . . . .
. . . . e e . . .
. . . . . r . .
. . . . . . g .
. . . . . . . . .
. . . . . . . . .
你看看发生了什么:你写得太远了,你崩溃了现有的条目。
解决方案
我建议您按照我目前所做的操作:初始化为一些您认为易于阅读的 non-letter。现在,在您将单词输入网格之前,请检查路径是否畅通。更好的是,如果相交的字母匹配,则允许跨前面的单词书写。
在 放置列表中的所有单词后,然后填写剩余的网格。
我正在尝试制作一个包含给定单词列表的单词搜索网格。 我的问题是有些词没有正确显示。
我更新了代码,见下文
我已尝试修复之前的错误,但现在遇到无法修复的超出范围错误,如果有人能提供帮助,我将不胜感激
注1:我没有包含所有程序功能,如果需要我稍后会包含它们
程序接收这样的文本文件:
9 9 white black blue green pink yellow red grey purple
文件中的前 2 个数字是网格的尺寸,其余是要放置在网格中的单词。
import random
import string
fi=input('Insert the entry file name(entry.txt): ')
fo=input('Insert the exit file name(.txt): ')
grid_size=[]
words=[]
matrix=[]
def read_file(storage):
file=open(storage)
n=file.readline()
lista=n.split()
lista=list(map(int,lista)) #sets the size of the grid
for i in lista:
grid_size.append(i)
for line in file:
line=line.replace("\n","")
words.append(line)
file.close()
def grid_generator(grid_size):
n, p = grid_size
for i in range(n):
matriz.append([])
for j in range(p):
matriz[i].append(".")
def sets_word_inside(grid_size, word, grid):
n, p = grid_size
word = random.choice([word,word[::-1]])
#horizontal,vertical,diagonal
d = random.choice([[1,0],[0,1],[1,1]])
xsize = n if d[0] == 0 else n - len(word)
ysize = p if d[1] == 0 else p - len(word)
x= random.randrange(0,xsize)
y= random.randrange(0,ytsize) #position
for i, letter in enumerate(word):
char = grid[y+d[1]*i][x+d[0]*i]
if char != " " and char != letter:
# If it reaches an already filled space - restart the process.
# The second condition allow the words that cross with repeated words are created.
return False
grid[y+d[1]*i][x+d[0]*i] = letter[i]
return True
现在代码的输出是这样的:
9
white
black
blue
green
pink
yellow
red
grey
purple
p w b i t y l d i
p v w o l e e y t
x g a x j r i m g
q i c j b g j e x
s s k g q l g r r
p i n k i o u t r
e l p r u p g e o
l a b l s r p g y
c o r y e u f r x
我发现了两个基本问题:您用新词覆盖了现有词,并且您写的超出了实际词的末尾。
第一个问题是您在添加新词之前没有费心去查找之前的词。 第二个问题是因为您未能从输入中删除 white-space。
我添加了一些简单的调试工具来跟踪它。首先,我将网格初始化为点而不是字母,这样我就可以看到发生了什么:
for j in range(p):
matrix[i].append(".")
然后,我在添加每个单词后打印矩阵:
for i in range(0,len(word)):
grid[y+d[1]*i][x+d[0]*i]=word[i]
print "\nUpdated grid with\t", word, "\n",
for row in range(n):
print " ".join(matrix[row])
return grid
然后我 运行 它得到了这个输出:
Updated grid with white
. . . . . . . . .
. . . . . . . . .
. w h i t e .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Updated grid with kcalb
. . . . . . . .
. . . . . . . .
. w h k t e .
. . . . c . . . .
. . . . . a . . .
. . . . . . l . .
. . . . . . . b .
. . . . . . . . .
. . . . . . . . .
Updated grid with blue
. . . . . . . .
. . b . . . . . .
. w h l t e .
. . . . u . . . .
. . . . . e . . .
. . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . . .
Updated grid with neerg
. . . . . . .
. b . . . . . .
. w n l t e .
. . . e u . . . .
. . . . e e . . .
. . . . . r . .
. . . . . . g .
. . . . . . . . .
. . . . . . . . .
你看看发生了什么:你写得太远了,你崩溃了现有的条目。
解决方案
我建议您按照我目前所做的操作:初始化为一些您认为易于阅读的 non-letter。现在,在您将单词输入网格之前,请检查路径是否畅通。更好的是,如果相交的字母匹配,则允许跨前面的单词书写。
在 放置列表中的所有单词后,然后填写剩余的网格。