我试图写一个数独拼图解算器,到目前为止,我一直试图让它显示拼图。到目前为止,这是我的代码:
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 :(得分: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
以确保代码正在按预期执行。
答案 1 :(得分:0)
您的代码真的难以阅读。您应该将问题分成子问题,并以逻辑方式更好地构建它们。
但要直接回答您的问题,在第7行中,您要为self.__template
分配一个空模板。在第14行中,您将模板转换为字符列表(为什么?毕竟您没有写入字符)并将其分配给self.__template_list
。最后在第21行到第23行中,您将迭代模板字符列表(仍然为空)并将其附加到self.__answer
,并在__str__()
中打印。因此,您只需要管道。
也许我可以提供一些关于如何改进代码的提示:
网格的文本表示应该与网格的一般概念无关,因此不应该涉及Grid类的大多数方法。在你的情况下,它会乱丢__init__()
方法,这使得很难理解方法实际上做了什么。您可以对网格执行多项操作,这些操作最终不需要知道网格的显示方式(如果有的话)。
输出网格的代码应完全局限于对此负责的方法__str__()
。
对于与其他方法或类用户无关的变量,请使用局部变量而不是成员变量。例如,在使用dir()
检查实例成员时,不必要的成员变量会使您的代码更难理解,效率更低并且在调试时会使您感到困惑。
想想一个更逻辑地代表你的网格的数据结构(它只包含必要的数据,而不是多余的表示细节)。我建议列表列表,因为在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
。所有其他变量都是相应函数的本地变量。