2013-06-05 48 views
1

我想写一个数独拼图求解器,到目前为止,我一直试图让它显示拼图。这是我到目前为止的代码:Python数独拼图求解器不能正确显示拼图

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

但是在你的'template'每个数字之间有两个管道? – kirelagin

+0

请问你能否显示一些输出。 – kirelagin

+0

请不要在所有内容前使用'__',除非你需要修改 –

回答

0

你的代码真的很难阅读。你应该把你的问题分解成多个子问题,并且在逻辑上构造它们。

但要直接回答您的问题,请在第7行中为self.__template分配一个空模板。在第14行中,您将模板转换为字符列表(为什么?毕竟您没有写入它),并将其分配给self.__template_list。最后在第21至23行中,您将遍历模板字符列表(仍为空)并将其附加到self.__answer,您在__str__()中打印该字符。因此你只需要管道。

也许我可以给你一些提示如何改进代码:

  1. 网格的文字表述应该是无关的电网的一般概念,因此不应该最关心的的你的Grid类的方法。在你的情况下,它抛弃了__init__()方法,并且很难理解该方法实际执行的操作。你可以用你的网格做几个操作,不需要知道最终网格是如何显示的(如果有的话)。

    输出您的网格的代码应完全限于负责该方法,在您的案例__str__()

  2. 对于与其他方法或类的用户无关的变量,请使用局部变量而不是成员变量。举例来说,在检查实例成员时,不必要的成员变量会让你的代码更难以理解,效率更低,并且会使你更加困惑。

  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在里面,以确保代码正在做你期望的。

+0

或者如果你想确保它查找整数值,则使用'if number in range(1,10)'。 – tamasgal