JavaScript를 배울 때 JavaScript에서 스도쿠 게임을 썼습니다. 최근에 Java 콘텐츠를 읽었으므로 Sudoku 게임의 Java 버전을 만들고 싶었습니다.
이제 나는 모든 코드를 공유하고 당신에게서 배우겠습니다. 물론 코드에는 다양한 문제와 단점이 있습니다. 나는 당신이 비판하고 나에게 조언을 해주기를 바랍니다.
다음은 스도쿠 맵을 생성하기위한 핵심 알고리즘입니다. 알고리즘은별로 좋지 않으며 이전에 온라인에서 몇 가지 아이디어를 언급했습니다.
패키지 hlc.shudu.src;/** sudoku help 클래스, 데이터*/public class shuduhelper {// sudoku 맵 배열 private static int [] maps = new int [9] [9]; // 각 9 미터 그리드 개인 정적 int [] canputsum = new int [9]에 배치 할 수있는 위치 수; // 이전에 배치 된 static int [] indred = new int [9]를 저장하는 데 사용합니다. // 맵 생성이 완성되었는지 여부 정적 부울 isok = true; /** 스도쿠 맵 배열*/public static int [] [] getMap () {// 맵이 생성되었는지 여부를 판단하고 완료되지 않은 경우 재생됩니다. // 이것으로부터 우리는 알고리즘을 여전히 최적화해야한다는 것을 알 수 있습니다. 백 트랙이 양호하면 역 추적을 통해 재생 될 수 있으며 여기서는 생성 알고리즘을 다시 실행하여 재생됩니다. 관심있는 친구들이 다음을 구현할 수 있기를 바랍니다. {isok = true; initmaps (); } while (! isok); 리턴 맵; } / * *지도 초기화 * / 개인 정적 무효 initMaps () {// 숫자가없는 맵 배열 초기화 (int i = 0; i <9; i ++) {for (int j = 0; j <9; j ++) {맵 [j] [j] = -1; }} // (int num = 1; num <= 9; num ++) {for (int i = 0; i <9; i ++) {사용 된 [i] = -1; canputSum [i] = -1; } // BIG NINE 그리드에서 각 아홉 번째 그리드를 가로 지르십시오 (int i = 0; i <9; i ++) {if (canputSum [i] == -1) {canputSum [i] = getCanputSum (i, num); } if (canputSum [i] == 1) {used [i] = -1; } if (canputSum [i] == 0) {canputSum [i] = -1; 사용 된 [i] = -1; // 숫자 NUM을 현재 9 그리드에 배치 할 수없는 경우 이전 NIN으로 돌아가면 (i> 0) {// 이전 9 그리드에 NUM이 배치되는 위치를 지우십시오. (Math.floor (사용 [I-1]/3)+Math.Floor ((I-1)/3)*3)] [사용 된 [I-1]%3+((I-1)%3)*3] = -1; Clearnum (i -1, num); } // for for loop Grey가 i에 하나를 추가하기 때문에 2를 뒤로 젖 힙니다. 따라서 2는 여기에 뺄셈입니다. i- = 2; 계속하다; } else {isok = false; 반품; }} else {// NUM을 현재 아홉 번째 그리드 부울 플래그 = false에 넣습니다. while (! flag) {int j = (int) (math.random () * 9); // 현재 작은 정사각형 int II = (i / 3) * 3 + j / 3의 수평 좌표; // 작은 정사각형 int jj = (i % 3) * 3 + j % 3의 현재 수직 좌표; //system.out.println("num:"+num+"/tii:"+ii+"/tjj:"+jj); // NUM을 배치 할 수있는 경우 (지도 [ii] [jj] == -1 && j! = 사용 [i] && iscanput (ii, jj, num)) {맵 [ii] [jj] = num; 사용 된 [i] = j; canputsum [i] -= 1; flag = true; }}}}}}}}}}} / * * 9 번째 9 번째 그리드 * / private static void clearnum (int i, int num) {for (int j = 0; j <9; j ++) {// 현재 작은 정사각형 II = (i / 3) * 3+j / 3; // 현재 작은 정사각형 int jj = (i % 3) * 3 + j % 3의 수직 좌표; // 현재 작은 정사각형을 배치 할 수 있는지 여부를 결정합니다 (지도 [ii] [jj] == num) {맵 [ii] [jj] = -1; }}} /** 현재 9 클라이언트를 숫자 Num* / private static int getCanputSum (int i, int num)으로 배치 할 수있는 위치 수를 얻습니다. {int sum = 0; // (int j = 0; j <9; j ++) {// 현재 작은 정사각형 int II의 수평 좌표 = (i / 3) * 3+j / 3; // 현재 작은 정사각형 int jj = i % 3 * 3 + j % 3의 수직 좌표; // (맵 [ii] [jj] == -1 && iscanput (ii, jj, num)) {++ sum; }} 반환 합계; } / * * 수평 및 수직 좌표 지점을 배치 할 수 있는지 여부를 지정하십시오 * / Private STATIC BOOLEAN ISCANPUT (int II, Int JJ, int Num) {// 지정된 좌표 지점의 동일한 행 또는 열의 동일한 숫자가 동일한 숫자인지 확인하십시오. 있으면 (int i = 0; i <9; i ++) {if (맵 [ii] [i] == num) {return false; } if (지도 [i] [jj] == num) {return false; }} true를 반환합니다. }}전체 패키지는 github : https://github.com/houlongchao/s에서 다운로드 할 수 있습니다
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.