2017-01-18 9 views
1

Я пытаюсь создать сетку поиска слов со списком заданных слов. Моя проблема в том, что некоторые слова не отображаются должным образом.Как сгенерировать сетку поиска слов, которая позволяет использовать слова с использованием одной и той же буквы

Я обновил код, смотрите ниже

Я попытался исправить предыдущую ошибку, и теперь я получаю ошибку выхода за диапазон, что я не могу исправить, если кто-нибудь может помочь я был бы признателен

Примечание 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 
+0

Это звучит как вопрос о конкурсе программирования, который я когда-то решил. Это звучит как идеальная задача для решения * ограничения (логического) программирования. –

+0

Willem Van Onsem Вы можете мне помочь? – MDordio

+0

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации.[Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применим здесь. Мы не можем эффективно помочь вам, пока вы не разместите свой код MCVE и не сможете точно описать проблему. «некоторые из них путаются» не является описанием проблемы. – Prune

ответ

0

Я вижу две основных проблем: вы перезаписать существующие слова с новыми, и вы пишете после окончания фактического слова ,

Первой проблемой является то, что вы не потрудились искать предыдущие слова, прежде чем добавлять новые. Вторая проблема заключается в том, что вы не можете вывести белое пространство из ввода.

Я добавил несколько простых инструментов для отладки, чтобы отслеживать это. Во-первых, я инициализирован сетку для многоточий вместо букв, так что я мог видеть, что происходит:

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

вы видите, что происходит: вы пишете слишком далеко, и ты упадешь поверх существующих записей.

РЕШЕНИЕ

Я рекомендую вам следовать тому, что я сделал до сих пор: инициализировать какой-то не-буквы, которые вы найдете легко читать. Теперь, прежде чем вводить слово в сетку, проверьте, что путь ясен. Еще лучше, разрешите писать через предыдущие слова, если совпадающие буквы совпадают.

После вы разместили все слова из списка, а затем заполнить в остальной части сетки.