-Python- WordSearch:放置单词以正确处理重叠

时间:2015-12-02 21:13:33

标签: python arrays loops wordsearch

我一直致力于从命令行运行的程序,该程序读取包含文字的文件,然后根据这些文字生成WordSearch游戏。

我已经定义了几个函数,但我遇到的问题是word_place函数。该函数应该采用最初用句点填充的网格或2D数组:

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

正如你可能看到的那样,如果单词恰好相交,那么最后放置的单词将会覆盖它相交的单词的字符。

我希望程序做的是检查每个"坐标"我的二维数组。

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

基本上,如果我试图放置的单词的字母是==.或索引中已有的任何字母,那么可以放置,否则它应该报废那个,并给这个词一个新的起始坐标,然后再试一次。

对不起,如果这很长或不清楚..如果您需要更多信息,请告诉我们!

2 个答案:

答案 0 :(得分: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])的任何时候中断。

答案 1 :(得分:0)

您可以直接测试所有空间是否可用并记录索引。如果它是空闲的,则插入值。如果网格的值匹配将放置在那里的字符,那么它仍然没问题。

如果您在插入时进行测试,则仍需记录插入的位置,因为您必须回溯以使用'。's

替换部分字。