عندما كنت أتعلم JavaScript ، كتبت لعبة Sudoku في JavaScript. لقد قرأت مؤخرًا بعض محتوى Java ، لذلك أردت إنشاء إصدار Java من لعبة Sudoku.
الآن سأشارك كل الرمز وأتعلم منك. بالطبع ، هناك العديد من المشكلات وأوجه القصور في الكود. أتمنى أن تنتقد وتعطيني بعض النصائح.
فيما يلي الخوارزمية الأساسية لتوليد خرائط سودوكو. الخوارزمية ليست جيدة جدًا ، وقد أشرت أيضًا إلى بعض الأفكار عبر الإنترنت من قبل:
حزمة hlc.shudu.src ؛/** Sudoku Help Class ، والتي توفر جميع الخوارزميات المطلوبة للبيانات*/shuduhelper {// sudoku map array int int [] []] maps = new int [9] [9] ؛ // عدد المواضع التي يمكن وضعها في كل شبكة تسعة أمتار ثابتة ثابتة [] Canputsum = New Int [9] ؛ // استخدم لتخزين int static int [] تم وضعه مسبقًا = int جديد [9] ؛ // ما إذا كان توليد الخريطة قد تم الانتهاء من isok isok isok = صحيح ؛ /** احصل على صفيف MAP Sudoku*/int static public [] [] getMap () {// judge ما إذا كانت الخريطة قد تم إنشاؤها وتجديدها إذا لم يتم إكمالها. // من هذا يمكننا أن نرى أن الخوارزمية لا تزال بحاجة إلى تحسين. إذا كان التراجع جيدًا ، فيمكن تجديده من خلال التراجع ، وهنا يتم تجديده عن طريق إعادة تنفيذ خوارزمية التوليد. آمل أن يتمكن الأصدقاء المهتمين من تنفيذ ما يلي. do {isok = true ؛ initMaps () ؛ } بينما (! isok) ؛ خرائط العودة } / * * تهيئة الخرائط * / private static void initmaps () {// تهيئة صفيف الخريطة دون أي رقم (int i = 0 ؛ i <9 ؛ i ++) {for (int j = 0 ؛ j <9 ؛ j ++) {maps [i] = -1 ؛ }} // incl in 1 ~ 9 for (int num = 1 ؛ num <= 9 ؛ num ++) {for (int i = 0 ؛ i <9 ؛ i ++) {use [i] = -1 ؛ Canputsum [i] = -1 ؛ } // اجتياز كل شبكة التاسعة في الشبكة التسعة الكبيرة لـ (int i = 0 ؛ i <9 ؛ i ++) {if (canputsum [i] ==-1) {canputsum [i] = getCanputsum (i ، num) ؛ } if (canputsum [i] == 1) {use [i] = -1 ؛ } if (canputsum [i] == 0) {canputsum [i] = -1 ؛ يستخدم [i] = -1 ؛ // إذا كان لا يمكن وضع الرقم في الشبكة التسعة الحالية ، فأعود إلى التسعة السابقة إذا (i> 0) {// امسح الموضع الذي يتم وضع NUM في الشبكة التسعة السابقة إذا (المستخدمة [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) ؛ }. يكمل؛ } آخر {isok = false ؛ يعود؛ }} else {// ضع num في العلم المنطقي الشبكة التاسعة الحالية = false ؛ بينما (! 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: somr) ؛ // إذا كان يمكن وضع NUM ، ضع if (Maps [ii] [jj] == -1 && j! = use [i] && isCanput (II ، jj ، num)) {maps [ii] [jj] = num ؛ يستخدم [i] = j ؛ Canputsum [i] -= 1 ؛ العلم = صحيح ؛ }}}}}}}} / * * clear num في الشبكة التاسعة التاسعة * / private static 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 ؛ // حدد ما إذا كان يمكن وضع مربع صغير الحالي إذا (الخرائط [ii] [jj] == num) {maps [ii] [jj] = -1 ؛ }}} /** احصل على عدد من المواضع التي يمكن وضعها في العميل التسعة الحالي في الرقم 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 ؛ }} إرجاع مجموع ؛ } / * * حدد ما إذا كان يمكن وضع نقاط الإحداثيات الأفقية والعمودية num * / 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 ؛ }} إرجاع صحيح ؛ }}يمكن تنزيل الحزمة الكاملة على github: https://github.com/houlongchao/s
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.