Soduko Grid构造函数无法正常工作

时间:2019-12-10 14:37:28

标签: python oop spyder

我正在尝试制作soduko游戏。它包含三个类:单元,子网格和网格。 这些是Grid的构造函数和第一个方法。我希望构造函数将类的sub_grids属性初始化为其表示的sub_grid(SubGrid的index-i属性在0-8的范围内,并确定它是网格的哪个SubGrid),如果参数sub_grids不是没有。该参数表示SubGrid的列表,该列表包含网格中已经具有精确值的单元格(行的索引i和列的索引j),SubGrid的列表长度可以小于9。列表中不存在的单元格是没有任何确切值的单元格。我尝试使用预先获得的 repr 方法打印网格,但最终没有显示任何值。

def __init__(self, sub_grids=None):
    self.rows=[[] for i in range(9)]
    self.columns=[[] for i in range(9)]
    self.sub_grids=[SubGrid.SubGrid(i) for i in range(9)]
    if sub_grids!=None:
        lst,lst1=[],[]
        for i in sub_grids:
            lst.append(i.i)
        for j in range(len(sub_grids)):
            for i in range(len(self.sub_grids)):
                if sub_grids[j].i in lst:
                    lst1.append(sub_grids[j])
                else: lst1.append(SubGrid.SubGrid(i))
        for i in range(len(self.sub_grids)):
            self.sub_grids[i]=lst1[i] #fix

该方法应该将类的行和列属性更新为具有相应行或列中已经存在的所有值。

def update_values(self): #fix
    for g in range(len(self.sub_grids)):
        for h in range(len(self.sub_grids[g].grid)):
            for j in range(len(self.sub_grids[g].grid[h])):
                if len(self.sub_grids[g].grid[h][j].values)==1:
                    self.rows[g].append(self.sub_grids[g][h].values)
                    self.columns[h].append(self.sub_grids[g][h].values)    

我在这里添加了我尝试在Spyder上执行的行: SubGrid的参数是:子网格的索引以及具有精确值的给定单元格的列表。 单元格的参数是:单元格的行索引,单元格的列索引和精确值。 Grid的参数是给定子网格的列表。

sg = SubGrid.SubGrid(5, [Cell.Cell(0, 2, 3), Cell.Cell(1, 2, 1), Cell.Cell(2, 2, 6)])
g=Grid([sg])
print(g)
print("-----------------------------")
g.update_values()
print(g.rows,g.columns)

编辑:这两种方法现在都可以使用,尽管我还有另一种方法,其目的是从单元格的可选值中删除行或列内已经出现的所有值。

def remove_values(self, cell, grid_num): #fix
    row=3*int(self.sub_grids[grid_num].i/3)+cell.i
    column=3*(self.sub_grids[grid_num].i%3)+cell.j
    for val in self.rows[row]:
        if self.sub_grids[grid_num].i==grid_num:
            for v in cell.values:
                if v in self.rows[row]:
                    cell.values.remove(v)
    for val in self.columns[column]:
        if self.sub_grids[grid_num].i==grid_num:
            for v in cell.values:
                if v in self.columns[column]:
                    cell.values.remove(v)
    self.update_values()

这是现在的代码。 我还将添加新版本的构造函数和update方法:

def __init__(self, sub_grids=None):
    self.rows=[[] for i in range(9)]
    self.columns=[[] for i in range(9)]
    self.sub_grids=[SubGrid(i) for i in range(9)]
    if sub_grids is not None:
        for sg in sub_grids:
            self.sub_grids[sg.i]=sg

def update_values(self):
    for sg in self.sub_grids:
        for r in sg.grid:
            for c in r:
                if len(c.values)==1:
                    self.columns[3*(sg.i%3)+c.j].append(c.values[0])
                    self.rows[3*int(sg.i/3)+c.i].append(c.values[0])

出现在本文开头的这些方法的版本是先前的(无效的)版本。

0 个答案:

没有答案