1

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

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

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

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

这很糟糕。我找不到我的设计有什么问题。我只是被它困住了。

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

4

2 回答 2

3

它在哪里过度客观化?我也能感觉到,或许还有比这更简单的解决方案……

您可以使用单个函数来完成,而不是拥有 3 个验证器类、一个抽象的 GroupInterface、一个 observable 等。

前面的伪代码:

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;
}
于 2013-01-01T01:21:25.483 回答
2

What is the difference between a ColumnGroup, LineGroup and SubMatrixGroup? IMO, these three should simply be instances of a generic "Group" type, as the type of the group changes nothing - it doesn't even need to be noted.

It sounds like you want to create a checker ("user attempted to write number X"), not a solver. For this, your observable pattern sounds OK (with the change mentioned above).

Here (link) is an example of a simple sudoku solver using the above-mentioned "group" approach.

于 2013-01-01T02:30:49.273 回答