2013-06-05 2 views
1

J'essayais de rédiger un résolveur de puzzle de Sudoku, et jusqu'à présent, je suis bloqué pour essayer de l'afficher. Voici mon code à ce jour:Le résolveur de puzzle sudoku Python n'affiche pas correctement le puzzle

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 

qui est pour les cellules, et voici le code de la grille:

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 

Lorsque je tente de l'imprimer, je reçois deux lignes verticales de tuyaux (|). Quelqu'un peut-il me dire ce que je fais mal?

+0

Mais il y a deux tuyaux entre chaque numéro inf votre 'template'? – kirelagin

+0

Pourriez-vous, s'il vous plaît, montrer une sortie. – kirelagin

+0

s'il vous plaît ne pas utiliser «__» devant tout, sauf si vous _need_ mangling –

Répondre

0

Votre code est vraiment difficile à lire. Vous devriez séparer votre problème en sous-problèmes et les structurer plus logiquement.

Mais pour répondre directement à votre question, à la ligne 7, vous affectez un modèle vide à self.__template. À la ligne 14, vous convertissez le modèle en une liste de caractères (pourquoi?), Et vous l'attribuez à self.__template_list. Enfin, dans les lignes 21 à 23, vous passez en revue la liste des caractères du modèle (qui est toujours vide) et vous l'ajoutez à self.__answer, que vous imprimez en __str__(). Ainsi, vous obtenez seulement les tuyaux.

Peut-être que je peux vous donner quelques conseils quant à la façon d'améliorer votre code:

  1. La représentation textuelle de la grille devrait être sans rapport avec le concept général de la grille et ne devrait donc pas concerner la plupart des méthodes de votre classe Grid. Dans votre cas, c'est la méthode __init__() et cela rend difficile la compréhension de la méthode. Vous pourriez faire plusieurs opérations avec votre grille qui n'ont pas besoin de savoir comment la grille est affichée à la fin (voire pas du tout).

    Le code de sortie de votre grille doit être entièrement confiné à la méthode qui en est responsable, dans votre cas __str__().

  2. Pour les variables qui ne sont pas pertinentes pour les autres méthodes ou les utilisateurs de la classe, utilisez des variables locales au lieu des variables membres. Les variables de membre inutiles rendent votre code plus difficile à comprendre, moins efficace et vous rendent confus lors du débogage, par exemple lors de l'inspection des membres de l'instance avec dir(). Pensez à une structure de données qui représente plus logiquement votre grille (et qui contient uniquement les données nécessaires, pas de détails superflus pour la représentation). Je suggère une liste de listes, car c'est très facile à manipuler en python (vous pouvez aussi utiliser un tableau numérique bidimensionnel, par exemple).

Je propose quelque chose qui ressemble à ceci:

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) 

Notez que cette version attend un fichier avec un format très rigide (pas de lignes de séparation ou caractères, nombre exact de caractères par ligne). Vous pouvez pratiquer l'améliorer pour lire des formats plus libéraux.

Notez également que la seule variable de membre que j'ai utilisée est self.grid. Toutes les autres variables sont locales à la fonction respective.

2

Ceci est faux (ce sera toujours vrai)

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

utilisation

if 1 <= number <= 9: 

Ceci est également faux

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

Itère plus d'un rendement de fichiers lignes pas caractères .

Je vous suggère d'écrire et de tester votre code en plus petites parties. Mettez quelques print s là pour vous assurer que le code fait ce que vous attendez.

+0

Ou utilisez 'if number in range (1, 10)' si vous voulez vous assurer qu'il recherche une valeur entière. – tamasgal