适用于数独的最佳模式?

时间:2012-12-31 21:28:05

标签: oop design-patterns sudoku

我正在尝试制作数独游戏,并且我为每个插入的数字收集了以下验证:

  • 数字必须介于1到9之间;
  • 数字在行中必须是唯一的;
  • 数字在列中必须是唯一的;
  • 数字在子矩阵中必须是唯一的。

由于我重复了“数字必须是唯一的......”规则,我做了以下设计:

  • 有3种组,ColumnGroup,LineGroup和SubMatrixGroup(所有这些组都实现了GroupInterface);
  • GroupInterface有一个方法public boolean validate(Integer number);
  • 每个单元格与3个组相关,并且在组之间必须是唯一的,如果其中任何一个不评估为真,则不允许使用数字;
  • 每个单元格都是可观察的,使该组成为观察者,对一次Cell更改尝试做出反应。

那个s * cks。 我找不到我的设计有什么问题。我只是被它困住了。

关于如何使其发挥作用的任何想法?

2 个答案:

答案 0 :(得分:3)

  

它在哪里过度客观化?我也能感受到,也许还有另一种解决方案比这更简单......

您可以使用单个函数执行此操作,而不是使用3个验证程序类,抽象GroupInterface,可观察对象等。

前面的伪代码:

bool setCell(int cellX, int cellY, int cellValue)
{
    m_cells[x][y] = cellValue;
    if (!isRowValid(y) || !isColumnValid(x) || !isSubMatrixValid(x, y))
    {
        m_cells[x][y] = null; // or 0 or however you represent an empty cell
        return false;
    }
    return true;
}

答案 1 :(得分:2)

ColumnGroup,LineGroup和SubMatrixGroup有什么区别? IMO,这三个应该只是通用“组”类型的实例,因为组的类型没有任何改变 - 甚至不需要注意。

听起来你想创建一个检查器(“用户试图写数字X”),而不是解算器。为此,您的可观察模式听起来不错(上面提到的更改)。

Here (link)是使用上述“组”方法的简单数独求解器的示例。