pythonpython-3.xpuzzlewordsearch

Building a wordsearch generator in python


I am creating a word search generator in Python, but i'm having a problem with the words appearing the grid. When the grid is made, the coordinates are there for one of the letters but not the whole word. I'm not sure which parts going wrong, any help would be much appreciated

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

this is the outcome of it and as you can see the word isnt there!

[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

Solution

  • The only major change you need is the indentation on the return; as you noted, your code did place the first letter, but none of the rest. This is because the return is inside your for loop, so it returns on the 1st iteration (after placing the 1st letter).

    I suggest a bit of work to flesh the idea out, because two words can overlap on the same grid (e.g. in the example below, the D in DOOR replaced the O in HELLO). Also, in the directions matrix as written, the top-left to bottom-right diagonal direction is possible, but the top-right to bottom-left diagonal is not. Perhaps the ideas help. Below is some tweaked code:

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