1

私は数独ゲームを作ろうとしていますが、挿入された各番号に対して次の検証を収集しました。

  • 番号は1から9の間でなければなりません。
  • 番号は行内で一意である必要があります。
  • 番号は列内で一意である必要があります。
  • 番号はサブマトリックス内で一意である必要があります。

「番号は一意である必要があります...」というルールを繰り返しすぎているため、次のデザインを作成しました。

  • グループには、ColumnGroup、LineGroup、およびSubMatrixGroupの3種類があります(これらはすべてGroupInterfaceを実装します)。
  • GroupInterfaceにはメソッドがpublic boolean validate(Integer number)あります;
  • 各セルは3つのグループに関連付けられており、グループ間で一意である必要があります。いずれかのセルがtrueと評価されない場合、番号は許可されません。
  • 各セルは監視可能であり、グループを監視者にし、1回のセル変更の試行に反応します。

そして、それはs*cksです。デザインのどこが悪いのかわかりません。私はそれで立ち往生しました。

どうすればそれを機能させることができるかについてのアイデアはありますか?

4

2 に答える 2

3

過度に客観化されているのはどこですか?私もそれを感じることができます、多分それよりも簡単な別の解決策があるでしょう...

3 つのバリデーター クラス、抽象 GroupInterface、オブザーバブルなどを用意する代わりに、1 つの関数でそれを行うことができます。

疑似コードの先:

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

ColumnGroup、LineGroup、SubMatrixGroupの違いは何ですか?IMO、これら3つは、一般的な「グループ」タイプのインスタンスである必要があります。グループのタイプは何も変更しないため、注意する必要はありません。

ソルバーではなく、チェッカー(「ユーザーが数値Xを書き込もうとした」)を作成したいようです。このため、観察可能なパターンは問題ないように聞こえます(上記の変更を使用)。

ここ(リンク)は、上記の「グループ」アプローチを使用した単純な数独ソルバーの例です。

于 2013-01-01T02:30:49.273 に答える