Quand j'apprenais JavaScript, j'ai écrit un jeu Sudoku en JavaScript. J'ai récemment lu du contenu Java, donc je voulais créer une version Java du jeu Sudoku.
Maintenant, je vais partager tout le code et apprendre de vous. Bien sûr, il y a divers problèmes et lacunes dans le code. J'espère que vous critiquerez et me donnerez des conseils.
Ce qui suit est l'algorithme de base pour générer des cartes Sudoku. L'algorithme n'est pas très bon, et j'ai également fait référence à certaines idées en ligne auparavant:
Package hlc.shudu.src; / * * Sudoku Help Class, qui fournit tous les algorithmes requis pour les données * / classe publique Shuduhelper {// Sudoku Map Array Private Static int [] [] Maps = new int [9] [9]; // le nombre de positions qui peuvent être placées dans chaque grille de neuf mètres privée statique int [] canputsum = new int [9]; // Utiliser pour stocker Static int [] used = new int [9]; // si la génération de cartes a été achevée statique booléenne ISOK = true; / * * Obtenez le tableau de carte Sudoku * / public static int [] [] getmap () {// juger si la carte a été générée et régénérer si elle n'est pas terminée. // À partir de cela, nous pouvons voir que l'algorithme doit encore être optimisé. Si le retour en arrière est bon, il peut être régénéré par le retour en arrière, et ici il est régénéré en réexécutant l'algorithme de génération. J'espère que les amis intéressés pourront mettre en œuvre ce qui suit. do {Isok = true; initmaps (); } while (! Isok); cartes de retour; } / * * Initialize Maps * / private static void initmaps () {// Initialiser le tableau de carte sans nombre pour (int i = 0; i <9; i ++) {for (int j = 0; j <9; j ++) {maps [i] [j] = -1; }} // Remplissez 1 ~ 9 pour (int num = 1; num <= 9; num ++) {for (int i = 0; i <9; i ++) {utilisé [i] = -1; canputsum [i] = -1; } // Traverse chaque neuvième grille dans la grande grille de neuf pour (int i = 0; i <9; i ++) {if (canputsum [i] == - 1) {Canutsum [i] = getcanputsum (i, num); } if (canputtsum [i] == 1) {utilisé [i] = -1; } if (canputtsum [i] == 0) {canputsum [i] = -1; utilisé [i] = -1; // Si le nombre num ne peut pas être placé dans la grille neuf actuelle, revenez au nin précédent if (i> 0) {// effacer la position où num est placé dans le réseau neuf précédent if (utilisé [i-1]! = - 1) {// maps [(int) (Math.floor (utilisé [i-1] / 3) + math.floor ((i-1) / 3) * 3)] [utilisé [i-1]% 3 + ((i-1)% 3) * 3] = - 1; clearnum (i - 1, num); } // Je retombe un, car le gris de boucle pour i en ajoutera un, donc 2 est soustrait ici i - = 2; continuer; } else {Isok = false; retour; }} else {// Put Num dans le neuvième grille actuel booléen drapeau = false; while (! Flag) {int j = (int) (math.random () * 9); // la coordonnée horizontale du petit carré actuel int ii = (i / 3) * 3 + j / 3; // La coordonnée verticale actuelle du petit carré int jj = (i% 3) * 3 + j% 3; //System.out.println("num:"+num+"/tii:"+ii+"/tjj:"+jj); // si num peut être placé, placez-le if (maps [ii] [jj] == -1 && j! = Utilisé [i] && isCanput (ii, jj, num)) {maps [ii] [jj] = num; utilisé [i] = j; canputsum [i] - = 1; Flag = true; }}}}}}}} / * * Clear num in the ith Ninth Ninth Grid * / private static void clearnum (int i, int num) {for (int j = 0; j <9; j ++) {// les coordonnées horizontales du petit carré actuel int ii = (i / 3) * 3 + j / 3; // la coordonnée verticale du petit carré actuel int jj = (i% 3) * 3 + j% 3; // déterminer si le petit carré actuel peut être placé si (maps [ii] [jj] == num) {maps [ii] [jj] = -1; }}} / * * Obtenez le nombre de positions où le neuf-client actuel peut être placé dans le nombre num * / private static int getCanputsum (int i, int num) {int sum = 0; // Traversé les neuf clients pour (int j = 0; j <9; j ++) {// la coordonnée horizontale du petit carré actuel int ii = (i / 3) * 3 + j / 3; // La coordonnée verticale du petit carré actuel int jj = i% 3 * 3 + j% 3; // déterminer si le petit carré actuel peut être placé si (maps [ii] [jj] == -1 && isCanput (ii, jj, num)) {++ sum; }} Retour Sum; } / * * Spécifiez si les points de coordonnées horizontaux et verticaux peuvent être placés num * / booléen statique privé ISCANPUT (int ii, int jj, int num) {// déterminer si le même nombre de même ligne ou colonne du point de coordonnée spécifié a le même nombre. S'il y en a, c'est faux pour (int i = 0; i <9; i ++) {if (maps [ii] [i] == num) {return false; } if (maps [i] [jj] == num) {return false; }} return true; }}Le package complet peut être téléchargé sur github: https://github.com/houlongchao/s
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.