2012-12-31 3 views
1

나는 스도쿠 게임을 만들려고 노력하고있어, 나는 삽입 각 번호에 다음과 같은 검증 수집 :최상의 패턴을 스도쿠에 적용 할 수 있습니까?

  • 번호가 1과 9 사이이어야합니다;
  • 숫자는 줄에서 고유해야합니다.
  • 숫자는 열에서 고유해야합니다.
  • 숫자는 부분 행렬에서 고유해야합니다.

    • 은 그룹 3 종류 ColumnGroup, LineGroup하고있다 : 나는 규칙 "에 ... 고유해야합니다 수"너무 많이 반복하고있어으로

    , 나는 다음과 같은 설계했다 SubMatrixGroup (모두 GroupInterface를 구현);

  • GroupInterface의 메소드는 public boolean validate(Integer number)입니다.
  • 각 셀이 3 개 그룹에 관련되어, 그 중 하나가 true로 평가하지 않는 경우는, 그룹 사이에서 고유해야합니다, 번호가 허용되지 않습니다;
  • 각 셀은 관찰 가능하며 그룹을 관찰자로 만들고 하나의 셀 변경 시도에 반응합니다.

그리고 그 * CKS를에요. 디자인에 문제가있는 것을 찾을 수 없습니다. 방금 막혔어.

나는 그것이 작동 할 수있는 방법의 어떤 아이디어?

+4

스도쿠 (Sudoku) 해결사로 작동해야하는 것 외에도 조금 지나치게 객관적인 것으로 들립니다. 또한 정확히 무엇이 싫은지를 지정하지 않았습니까? – SWeko

+0

또한, 그리드를 확장 가능하게 만드는 데 어려움이 있습니다. 예를 들어, 1 ... 12 대신 1 .. 12로 확장하고 싶다면. – ViniciusPires

+0

사실, 어떻게 쉽게 검증 할 수 있을지 모르겠다. 그래서 유효성 검사기 목록을 추가했다 ... 그리고 지금 나는 그것을 빠져 나올 수 없다. 그것이 지나치게 객관화 된 곳은 어디입니까? 나는 그것도 느낄 수 있습니다. 아마도 그보다 더 간단한 다른 해결책이있을 것입니다 ... – ViniciusPires

답변

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; 
} 
+0

그래,하지만 6x6 또는 12x12로 만들고 싶다면?함수가 게임 구성에 대한 모든 것을 알고 있습니까? – ViniciusPires

+0

어쨌든, 이것은 멋지고 간단한 해결책입니다. 더 이상 찾지 못하면 해보겠습니다 :) 고마워요. – ViniciusPires

2

ColumnGroup, LineGroup 및 SubMatrixGroup의 차이점은 무엇입니까? 그룹의 유형은 아무 것도 변경하지 않으므로이 세 가지는 단순히 "그룹"유형의 인스턴스 여야합니다. 즉 주목할 필요조차 없습니다. 당신이 검사기를 만들 것 소리

가 아닌 해결사 ("사용자는 숫자 X를 작성하는 시도"). 이를 위해, 당신의 관찰 가능한 패턴은 OK로 들린다.

Here (link)은 전술 한 "기"접근 방식을 사용하여 간단한 스도쿠 솔버의 일례이다.

+0

첫 번째 디자인에서는 세 가지 구현 방법을 사용하여 유효성 검사 방법을 생각했습니다. 그래서 세 그룹이 필요했습니다 ... 하지만 아직까지는 좋은 접근 방법이 아닙니다. 내가 준 코드를 공부하겠습니다. 고마워요. :) – ViniciusPires