0

我一直在开发一个程序,该程序将从命令行运行,该程序读取包含单词的文件,然后从这些单词生成 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

正如您可能看到的那样,如果单词碰巧相交,那么最后放置的单词将覆盖它相交的单词的字符。

我想要程序做的是检查我的二维数组的每个“坐标”。

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

基本上,如果我要放置的单词的字母是==a.或索引中已经存在的任何字母,则可以放置,否则它应该废弃它,并给单词一个新的起始坐标并重试。

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

4

2 回答 2

1

这可能是一个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 循环运行而不会中断。第一个 for 循环将在网格中的值不是可用空间或它需要的字母 ( word[i]) 时中断。

于 2015-12-02T21:27:14.067 回答
0

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

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

于 2015-12-02T21:25:28.380 回答