2013-06-05 2 views
1

Я пытался написать решение головоломки Sudoku, и до сих пор я застрял, пытаясь заставить его показать головоломку. Вот мой код до сих пор:Python sudoku головоломка solver не отображает головоломку правильно

class Cell: 
'''A cell for the soduku game.''' 
def __init__(self): 
    #This is our constructor 
    self.__done = False #We are not finished at the start 
    self.__answer = (1,2,3,4,5,6,7,8,9) #Here is the tuple containing all of our possibilities 
    self.__setnum = 8 #This will be used later when we set the number. 
def __str__(self): 
    '''This formats what the cell returns.''' 
    answer = 'This cell can be: ' 
    answer += str(self.__answer) #This pulls our answer from our tuple 
    return answer 
def get_possible(self): 
    '''This tells us what our possibilities exist.''' 
    answer =() 
    return self.__answer 
def is_done(self): 
    '''Does a simple check on a variable to determine if we are done.''' 
    return self.__done 
def remove(self, number): 
    '''Removes a possibility from the possibility tuple.''' 
    if number == 1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9: #Checks if we have a valid answer 
     temp = list(self.__answer) #Here is the secret: We change the tuple to a list, which we can easily modify, and than turn it back. 
     temp.remove(number) 
     self.__answer = tuple(temp) 
def set_number(self, number): 
    '''Removes all but one possibility from the possibility tuple. Also sets "__done" to true.''' 
    answer = 8 
    for num in self.__answer: 
     if num == number: 
      answer = number #Checks if the number is in the tuple, and than sets that value as the tuple, which becomes an integer. 
    self.__answer = answer 
    self.__done = True 
    return self.__answer 

То есть для клеток, а вот код для сетки:

class Grid: 
'''The grid for the soduku game.''' 
def __init__(self, puzzle): 
    '''Constructs the soduku puzzle from the file.''' 
    self.__file = open(puzzle) 
    self.__puzzle = '' 
    self.__template = ' | | \n | | \n | | \n | | \n | | \n | | \n | | \n | | \n | | \n' 
    for char in self.__file: 
     if char == '.': 
      self.__puzzle += ' ' 
     else: 
      self.__puzzle += char 
    count = 0 
    self.__template_list = list(self.__template) 
    for char in self.__puzzle: 
     if char != '|': 
      if char == '.' or ' ': 
       self.__template_list[count] = ' ' 
      else: 
       self.__template_list[count] = char 
    self.__answer = '' 
    for char in self.__template_list: 
     self.__answer += char 
    self.__file.close() 
def __str__(self): 
    '''Prints the soduku puzzle nicely.''' 
    return self.__answer 

Когда я пытаюсь напечатать его, я получаю две вертикальные линии труб (|). Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Но между каждым номером в вашем шаблоне есть две трубки? – kirelagin

+0

Не могли бы вы показать некоторые результаты. – kirelagin

+0

, пожалуйста, не используйте '__' перед всем, кроме вас, _need_ mangling –

ответ

0

Ваш код действительно трудно прочитать. Вы должны разделить свою проблему на подзадачи и структурировать их более логично.

Но, чтобы ответить на ваш вопрос напрямую, в строке 7 вы назначаете пустой шаблон self.__template. В строке 14 вы преобразовываете шаблон в список символов (почему? После того, как вы его не пишете) и назначьте его self.__template_list. Наконец, в строках с 21 по 23 вы повторяете список символов шаблона (который все еще пуст) и добавьте его в self.__answer, который вы печатаете в __str__(). Таким образом, вы получаете только трубы.

Может быть, я могу дать вам несколько советов о том, как улучшить свой код:

  1. Текстовое представление сетки должно быть никакого отношения к общей концепции сетки и, следовательно, не должны касаться большинство из методы вашего класса Grid. В вашем случае это засоряет метод __init__(), и это затрудняет понимание того, что на самом деле делает этот метод. Вы можете выполнить несколько операций с вашей сеткой, которые не должны знать, как сетка отображается в конце (если вообще).

    Код для вывода вашей сетки должен полностью ограничиваться методом, который отвечает за это, в вашем случае __str__().

  2. Для переменных, которые не имеют отношения к другим методам или пользователям класса, используйте вместо переменных-члена локальные переменные. Необязательные переменные-члены делают ваш код более трудным для понимания, менее эффективным и путают вас при отладке, например, при проверке членов экземпляра с помощью dir().

  3. Подумайте о структуре данных, которая более логически представляет вашу сетку (и которая содержит только необходимые данные, а не лишние данные для представления). Я предлагаю список списков, так как это очень легко манипулировать в python (например, вы также можете использовать двумерный массив numpy).

я предлагаю что-то похожее на это:

class Grid: 
    '''The grid for the soduku game.''' 

    def __init__(self, puzzle): 
     '''Constructs the soduku puzzle from the file.''' 

     self.grid = [] 

     with open(puzzle, "r") as f: 
      for line in f: 
       # strip CR/LF, replace . by space, make a list of chars 
       self.grid.append([" " if char in " ." else char for char in line.rstrip("\r\n")]) 

    def __str__(self): 
     '''Prints the soduku puzzle nicely.''' 

     lines = [] 

     for i, row in enumerate(self.grid): 
      if i != 0 and i % 3 == 0: 
       # add a separator every 3 lines 
       lines.append("+".join(["-" * 3] * 3)) 

      # add a separator every 3 chars 
      line = "|".join(map("".join, zip(*([iter(row)] * 3)))) 
      lines.append(line) 

     lines.append("") 

     return "\n".join(lines) 

Обратите внимание, что эта версия ожидает файл с очень жесткой форме (без каких-либо разделительных линий или символов, точное количество символов в строке). Вы можете улучшить его, чтобы читать более либеральные форматы.

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

2

Это неправильно (это всегда будет Истинные)

if number == 1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9: 

использование

if 1 <= number <= 9: 

Это тоже неправильно

for char in self.__file: 
    if char == '.': 
     self.__puzzle += ' ' 
    else: 
     self.__puzzle += char 

Перебор файлов урожайности линии не символы ,

Я предлагаю вам написать и протестировать свой код на более мелкие части. Поместите там print s, чтобы убедиться, что код выполняет то, что вы ожидаете.

+0

Или используйте 'if number in range (1, 10)', если вы хотите убедиться, что он ищет целочисленное значение. – tamasgal

Смежные вопросы