Когда я изучал JavaScript, я написал игру Sudoku в JavaScript. Недавно я прочитал немного контента Java, поэтому я хотел создать Java -версию Sudoku Game.
Теперь я поделюсь весь код и узнаю у вас. Конечно, в коде есть различные проблемы и недостатки. Я надеюсь, что вы будете критиковать и дать мне несколько советов.
Ниже приведен основной алгоритм генерации карт судоку. Алгоритм не очень хорош, и я также упоминал о некоторых идеях онлайн раньше:
пакет hlc.shudu.src;/** Класс справочной помощи Sudoku, который предоставляет все алгоритмы, необходимые для данных*/public class shuduhelper {// sudoku Map Array Private Static int [] [] maps = new int [9] [9]; // количество позиций, которые могут быть размещены в каждой девятиметровой сетке частной статической статической [] canputsum = new Int [9]; // Использование для хранения ранее размещенного статического int [] used = new int [9]; // была ли генерация карт завершена статический логический isok = true; /** Получите массив карты Sudoku*/public static int [] [] getMap () {// Судите, была ли карта сгенерирована и регенерирует, если она не завершена. // Из этого мы видим, что алгоритм все еще должен быть оптимизирован. Если обратная переход хорош, он может быть восстановлен через обратную связь, и здесь он восстанавливается путем повторного выполнения алгоритма генерации. Я надеюсь, что заинтересованные друзья могут реализовать следующее. do {isok = true; initmaps (); } while (! isok); вернуть карты; } / * * Инициализировать карты * / private static void initmaps () {// инициализировать массив карт без какого -либо числа для (int i = 0; i <9; i ++) {for (int j = 0; j <9; j ++) {maps [i] [j] = -1; }} // заполнить 1 ~ 9 для (int num = 1; num <= 9; num ++) {for (int i = 0; i <9; i ++) {используется [i] = -1; Canputsum [i] = -1; } // Переносить каждую девятую сетку в большой девяти сетке для (int i = 0; i <9; i ++) {if (canputsum [i] ==-1) {canputsum [i] = getCanputsum (i, num); } if (canputsum [i] == 1) {используется [i] = -1; } if (canputsum [i] == 0) {canputsum [i] = -1; использовал [i] = -1; // Если число число не может быть помещено в текущую девятью сетку, то вернитесь к предыдущему NIN if (i> 0) {// Очистить положение, в которой NUM помещается в предыдущую девять сетей if (используется [i-1]! =-1) {// maps [(int) (Math.floor (используется [i-1]/3)+math.floor ((i-1)/3)*3)] [Используется [i-1]%3+((i-1)%3)*3] =-1; clearNum (i - 1, num); } // Я отступаю один, потому что для петли серый добавит один в I, так что 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 int jj = (i % 3) * 3 + j % 3; //System.out.println("num:"+num+"/tii:"+ii+"/tjj:"+jj); // Если num может быть размещен, поместите if (maps [ii] [jj] == -1 && j! = Используется [i] && iscanput (ii, jj, num)) {maps [ii] [jj] = num; Используется [i] = j; Canputsum [i] -= 1; flag = true; }}}}}}}} / * * Clear Num в девятой девятой сети * / частная статическая void clearnum (int i, int num) {for (int j = 0; j <9; j ++) {// горизонтальная координата нынешней маленькой квадратной int ii = (i / 3) * 3+j / 3; // Вертикальная координата текущего маленького квадрата int jj = (i % 3) * 3 + j % 3; // Определите, может ли текущий маленький квадрат быть размещен, если (maps [ii] [jj] == num) {maps [ii] [jj] = -1; }}} /** Получить количество позиций, где текущий девять клиентов может быть помещен в число num* / private int 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; // Определите, может ли текущий маленький квадрат быть размещен, если (maps [ii] [jj] == -1 && isCanput (ii, jj, num)) {++ sum; }} return sum; } / * * Укажите, могут ли горизонтальные и вертикальные точки координат быть размещены num * / private static boolean isCanput (int II, int jj, int num) {// определить, имеет ли одно и то же число одного строки или столбца указанной точки координаты одинаковое число. Если есть, это ложно для (int i = 0; i <9; i ++) {if (maps [ii] [i] == num) {return false; } if (maps [i] [jj] == num) {return false; }} вернуть true; }}Полный пакет можно загрузить на github: https://github.com/houlongchao/s
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.